firewalldの設定方法①

初めて自分で`firewalld`の設定をした時に、色々調べてまとめたので
備忘録として載せておきます:raising_hand:

## ゾーンについて
初めに、`firewalld`を扱う上で避けては通れない「ゾーン」について軽く説明します。
ゾーン(`zone`)というのは、どのような通信を許可するのかというルールが設定されている定義のようなものです。
あらかじめ9種類のゾーンが用意されていますが、全ての通信を許可するもの(`trusted`)や、逆に全ての受信パケットを破棄するもの(`drop`)など、それぞれのゾーンに異なる受信ルールが決められています。
デフォルトでは`public`ゾーンが適用されています。

ゾーンごとに設定できる項目はいくつかありますが、よく使用するものは以下になると思います。
<font color="#ff4500">・sources：</font>通信を許可する送信元のIPアドレスを追加する
<font color="#ff4500">・services：</font>通信を許可するサービスを追加する
<font color="#ff4500">・ports：</font>通信を許可するポート番号を追加する
<font color="#ff4500">・protocols：</font>通信を許可するプロトコルを追加する
<font color="#ff4500">・interfaces：</font>対象のゾーンを適用したいインターフェースを追加する

今回は`public`ゾーンに上記の項目を追加していきます。
その前に、`firewalld`が起動していないと設定が出来ないので、事前に起動しておきましょう。

まずは設定前に今現在の設定内容を確認しておきましょう。（※今回の環境はRHEL8.2）
```
# firewall-cmd --list-all --zone=public

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
<font color="#ff4500">※コマンドの最後の`public`の部分を変更すると、別のゾーンの設定内容も確認できます。</font>

`firewalld`はホワイトリスト方式なので、`services`欄に記載のある「`cockpit` `dhcpv6-client` `ssh`」を使用した通信は許可されているということになります。
`ports`、`protocols`欄は空欄になっているので、上記の３つのサービス以外の通信は許可されていないという事になります。
ただ、`sources`欄も空欄ですが、こちらは何も許可されていない訳ではなく、前述した3つのサービスからの通信は、どのIPアドレスからでも受け付ける状態になっています。

また、`interfaces`の項目を見ると、`ens33`のインターフェースにこのゾーンが適用されているので、`ens33`を使用した通信には上記ルールが当てはまるということになります。
その他のインターフェースを使用した通信には上記のルールは適用されません。

## 送信元IPアドレスの追加
初めに、通信を許可する送信元のIPアドレスを追加したいと思います。
```
# firewall-cmd --add-source=192.168.0.0/24 --zone=public --permanent
success
```
この先は省略しますが、`firewall-cmd`を使って設定を行った場合、コマンド入力後に<font color="red">**success**</font>と表示されます。
構文や指定方法などが間違っているとエラーが表示されるので、その時は再度コマンドを確認しましょう。

これで、`192.168.0.0/24`のセグメントからの通信が許可されたことになりますが、前述したように、元々送信元のIPアドレスの制限はなかったので、この設定により`192.168.0.0/24`以外からの通信は拒否されるようになったということになります。
ちなみに、`--permanent`は恒久的な設定をする場合のオプションなので、一時的に設定したい場合はこのオプションは付けずに設定してください。

## サービスの追加
次に、通信を許可するサービスを追加したいと思います。
```
# firewall-cmd --zone=public --add-service=http --permanent
```
これで、`http`を使用した通信も許可されました。
この他にも、上記のコマンドで設定できるサービス一覧は、以下のコマンドで確認できます。
```
# firewall-cmd --get-services
```

## ポート番号の追加
次に、通信を許可するポート番号を追加します。
sshやhttpのように使用するポートが決まっているものは前述の方法で許可できますが、ミドルウェアなどで独自で使用するポートがある場合にはこちらを使用します。
```
# firewall-cmd --zone=public --add-port=3000/tcp --permanent
# firewall-cmd --zone=public --add-port=3000/udp --permanent
```
これで、`3000番`のポートを使用した通信も許可されました。
`udp`は不要で、`tcp`だけ設定したい場合は1つ目のコマンドだけ入力します。

## 設定の反映
一通り設定を変更したら、最後に、設定を反映させるコマンドを忘れずに実行してください。
```
# firewall-cmd --reload
```
変更後の設定内容を確認します。
```
# firewall-cmd --list-all --zone=public

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 192.168.0.0/24
  services: cockpit dhcpv6-client ssh http
  ports: 3000/tcp 3000/udp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
`sources`と`services`と`ports`の項目に、上記で設定した内容が追加され、設定が反映されたことが分かります。

これが基本的な`firewalld`の設定になります。
※`interfaces`、`protocols`の設定方法については後述します。

次は、もっと複雑な要件で`firewalld`の設定をしてみたいと思います。
[firewalldの設定方法②](https://qiita.com/sugar_salt75/items/37d6226f3e03022017fc)へ続きます！