2021年9月18日土曜日

firewalld入門

Red Hat Enterprise Linux 7 (以下、RHEL 7) 以降は、サーバのファイアウォール機能として、iptablesからfirewalldに変更になっている。iptablesの入門記事は、以前以下にて記載している。

自宅の検証用途の場合は、firewalldの設定を省略することが多く、ずっと使うことを避けていたのだが、そろそろ一度使い方を確認してみようと思い、実際にfirewalldの設定手順を確認してみた

環境

RHEL 7のfirewalldで動作確認を行ったが、CentOSなどのRed Hat系のディストリビューションであれば、操作方法は同じとなる。

なお、今回は入門編ということで、firewalldで着信トラフィックのみ通信許可する設定手順を記載しており、発信トラフィックの設定方法については別途記載することにする。また、ゾーンに関してもデフォルト設定を利用することとし、ゾーンの変更や新規作成は実施しない。

通信許可設定手順

1. firewalldサービスを起動

firewalldの設定を行う際は、firewalldサービスが起動している必要がある。もし停止している場合は、以下の通り起動させておく。

# systemctl enable firewalld
# systemctl start firewalld

2. 設定前確認

firewalldの設定はすべてfirewall-cmdにて実施する。

まずは、firewall-cmd --get-active-zonesでアクティブになっているゾーンを確認してみよう。以下結果は、インタフェースens192に対して、publicというゾーンが設定されていることを示している。

# firewall-cmd --get-active-zones
public
  interfaces: ens192

次に、アクティブになっているpublicゾーンの設定をfirewall-cmd --list-allで確認してみよう。以下コマンド実行結果のservicesの項目に着目すると、publicゾーンのデフォルトでは、SSH (22/tcp) とDHCPv6クライアント (546/tcp) のみ通信が許可されていることがわかる。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

本記事では、publicゾーンに対して以下通信を許可するための設定手順を記載する。

  • NTP (123/tcp, 123/udp)
  • Zabbix Agent (10050/tcp)

3. 通信許可設定を追加 (サービス名を指定する場合)

サービス名を使ってルールを設定する場合は、firewall-cmd --add-service=[サービス名]にて行う。サービス名は/etc/servicesから名前を確認する。例えば、NTPのサービス名はntpとなり、123/tcpと123/udpがポート番号として定義されていることがわかる。

# cat /etc/services | grep '^ntp'
ntp             123/tcp
ntp             123/udp                         # Network Time Protocol

以上をふまえ、以下の通り設定投入を行う。

# firewall-cmd --add-service=ntp
success

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: ssh dhcpv6-client ntp ★<--ntpが追加
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

【補足】firewalldのランタイムルールとパーマネントルール

firewalldには「ランタイムルール」と「パーマネントルール」の2つがあり、これらの違いを理解しておく必要がある。

ルール 設定保持 設定コマンド 説明
ランタイムルール × firewall-cmd 実際に反映されているルール。スイッチ製品のrunning-configのイメージ。
パーマネントルール firewall-cmd --permanent 保存されているルール。スイッチ製品のstartup-configのイメージ。

2つのルールがあることによって、firewalldは大きく以下2つの流れで設定できる。

  1. ランタイムルール設定後、firewall-cmd --runtime-to-permanentにてパーマネントルールに反映
  2. パーマネントルールに設定後、fiewall-cmd --reloadにてランタイムルールに反映

どちらの設定手順を採用するかについては、好み、流派、状況などによって変わると思うが、設定コマンドがシンプルかつ設定切り戻しが容易なことから、本記事では1つめの「ランタイムルール設定→パーマネントルールに反映」の手順を採用する。

4. 通信許可設定を追加 (ポート番号を指定する場合)

ポート番号ではなく、直接特定のポート番号を指定することも可能となる。今回は、Zabbix Agentで使用する10050/tcpのポートを例として設定することにする。

なお、Zabbix Agentはzabbix-agentとしてサービス名が定義されているので、サービス名による設定も可能となる。

# cat /etc/services | grep '^zabbix-agent'
zabbix-agent    10050/tcp               # Zabbix Agent
zabbix-agent    10050/udp               # Zabbix Agent

ポート番号を使ってルールを設定する場合は、firewall-cmd --add-port=[ポート番号]/[tcpまたはudp]にて行う。今回は、10050/tcpでポート番号を指定した。

# firewall-cmd --add-port=10050/tcp
success

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: ssh dhcpv6-client ntp
  ports: 10050/tcp ★<--ポート番号が追加
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

5. パーマネントルールに反映

ランタイムルールは、firewalldやOS再起動を行うと設定が消えてしまうため、ランタイムルールの設定をパーマネントルールに反映することによって設定の保存を行う必要がある。

逆に言えば、ランタイムルールの設定に問題があり設定を切り戻す場合は、fiewall-cmd --reloadにてパーマネントルールを再読み込みさせるだけでよい。

ランタイムルールをパーマネントルールに反映する前に、現在のパーマネントルールの確認をfirewall-cmd --permanent --list-allにて行う。設定反映前であるため、先ほどランタイムルールに設定したntpサービスやポート番号の設定が存在しないことがわかる。

# firewall-cmd --permanent --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

firewall-cmd --runtime-to-permanentにてパーマネントルールへ設定反映を行う。

# firewall-cmd --runtime-to-permanent
success

再度、パーマネントルールを確認すると、以下の通りランタイムルールに設定したルールが反映されていることがわかる。

# firewall-cmd --permanent --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client ntp ★<--ntpが追加
  ports: 10050/tcp ★<--ポート番号が追加
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

以上で、firewalldの通信許可設定は完了となる。

firewalldコマンドまとめ

最後に本手順で記載したコマンドを一覧にまとめて記載する。

設定 コマンド
アクティブとなっているゾーンの確認 firewall-cmd --get-active-zones
ランタイムルールの確認 firewall-cmd --list-all
パーマネントルールの確認 firewall-cmd --permanent --list-all
パーマネントルールに反映 firewall-cmd --runtime-to-permanent
パーマネントルールの再読み込み fiewall-cmd --reload
ルール追加 (サービス名) firewall-cmd --add-service=[サービス名]
ルール追加 (ポート番号) firewall-cmd --add-port=[ポート番号]/[tcpまたはudp]
ルール削除 (サービス名) firewall-cmd --remove-service=[サービス名]
ルール削除 (ポート番号) firewall-cmd --remove-port=[ポート番号]/[tcpまたはudp]

0 件のコメント:

コメントを投稿

人気の投稿