RHEL系(CentOS)
---
Linuxサーバの「firewalldサービス」を起動するとデフォルト設定だと通信が遮断されてしまいます。
「firewalldサービス」は、ゾーン(ZONE)にどのターゲット(破棄or拒否or許可)を適用するかでルールを決定します。
Firewalldサービスを起動する前に、最低限、押さえておきたい初期設定を解説します。
以下の3つのことを確認してからFirewalldサービスを起動してください。
- デフォルト設定のゾーンを確認
/etc/firewalld/firewalld.confファイル
「DefaultZone=public」箇所でデフォルトのゾーンを選択
基本、デフォルト設定されたゾーンだけがactiveになります
※firewalldサービス起動後に「firewall-cmd --get-active-zones」コマンドでactiveなゾーンを確認 - 各NICで設定されているゾーンを確認
FirewalldはNIC単位で設定できます
「1.」の設定と違うゾーンに設定したい場合
※設定なければデフォルト設定(「public」ゾーン)したゾーンがactiveになります。
/etc/sysconfig/network-scripts/ifcfg-XXファイル
「ZONE=trusted」を追加してゾーンを選択
※この場合、activeなゾーンは、「trusted」ゾーン - Firewalldサービス起動時のactiveとなるゾーン(ZONE)を確認
複数のゾーンがactiveになる場合があり、activeとなったゾーンのルールが適用されます。
通常、Firewalldサービスを起動するとNICで設定されているゾーンだけがactiveになります。
■補足情報
active(有効)となるゾーンは2通り
以下、2つの設定がデフォルトのゾーン設定と異なる場合、設定されたゾーンがそれぞれactiveになります。
この場合、デフォルト設定したゾーンはactiveになりません。
【1つ目】IPアドレス・セグメント(sources)を設定したゾーン
例
# firewall-cmd --add-source=192.168.11.19 --zone=drop
->設定したタイミングで「dropゾーン」がactiveになります。
指定した「IPアドレス・セグメント」が所属するゾーンを明示的に設定します。
その他のゾーンがactiveで「解放・拒否」設定があったとしても、所属したゾーンのルールが適用されます。
【2つ目】NICのインターフェースを設定したゾーン
例
# firewall-cmd --zone=trusted --change-interface=enp0s3
->設定したタイミングで「trustedゾーン」がactiveになります。
上記、【1つ目】と【2つ目】の設定をした場合、デフォルト設定のゾーンが「publicゾーン」だったとしても「dropゾーン」と「trustedゾーン」の2つがactiveになります。
但し、コマンド実行で設定する場合、firewallサービス起動後になるので、起動前に設定することはできません。
※コマンド実行は、firewallサービスが起動しているときにのみ利用可能となります。
デフォルト設定でfirewallサービスを仮起動したのち、コマンド実行で恒久的に適用する「--permanent」オプションを付けて上記2つを設定し、再度、firwallサービスを再起動すると起動時に2つの設定が適用できます。
Firewalldサービス起動前の確認
9種類の ゾーン(ZONE)について
Firewallサービスを起動するまえにどのソーンを設定するかを決めてから起動します。
サーバのNIC(ネットワークインターフェース)毎にゾーンを設定します。
ゾーンは、下記のように準備されているもの以外に、新規に作成することも可能です。
例えば
「public」のゾーンでFirewalldサービスを起動すると「ssh」のアクセスは可能ですが「http」の通信は遮断されています。
ゾーン(ZONE) | 説明 |
drop | 全てのパケットを破棄。 内部から外部へのパケットは許可されるが返信されてきたパケットも 破棄するので通信不可になります。 |
block | 外部からのパケットは破棄。 内部からの通信パケットの返信は許可されます。 |
public | デフォルトは「ssh」・「dhcpv6-client」のみ許可。 |
dmz | デフォルトは「ssh」のみ許可。 |
internal | デフォルトは「ssh」・「dhcpv6-client」・ 「ipp-client」・「mdns」・「samba-client」が許可。 |
work | デフォルトは「 ssh」・「dhcpv6-client」・「ipp-client」が許可。 |
home | デフォルトは「ssh」・「dhcpv6-client」・ 「ipp-client」・「mdns」・「samba-client」が許可 |
external | デフォルトは「ssh」のみ許可。IPマスカレードが有効 |
trusted | 全てのパケットが許可 |
■注意事項
icmp(ping)は、「drop」ゾーン「block」ゾーン以外はブロックされずに
デフォルトで許可されています。
4種類の ターゲット(target)について
定義にマッチしないパケットをどうするかターゲットで決められています。
ターゲット | 状態 | ゾーンの初期設定 |
DROP | 破棄 | dropゾーン |
REJECT | 拒否 | blockゾーン |
default | 拒否 | public、dmz、internal、work、home、externalゾーン |
ACCEPT | 許可 | trustedゾーン |
■ポイント
- 「REJECT」と「default」は、ほぼ同じ意味のターゲットになります。
※フォワード機能を使わなければ、以下の違いだけになります。
■pingの応答で差異がある
DROP:ping応答無し(「プロンプトが返ってこない」反応なし)
REJECT:ping応答無し(「~Destination Host Prohibited」の応答)
default:ping応答有り(「~icmp_seq=1 ttl=64 time=0.332 ms」の応答)
- ゾーン毎にターゲットを1つ設定します。(変更可)
- ACCEPT以外は、許可する設定をゾーンで設定します。
定義がないものは、破棄か拒否されます。
■「DROP」「REJECT」「default」ターゲットを設定したゾーンの場合(block、publicゾーンなど)
->
すべての通信を拒否(デフォルト許可以外)からスタートするターゲットになるので、このターゲットを設定したゾーンは、許可したいIPやポート及びサービスなどを設定していきます。
publicゾーンの為、以下の設定はすでに拒否されているので意味がありません。
# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" port protocol="tcp" port="80" drop"
publicゾーンで以下の設定をすると指定したサービスが拒否から許可されます。
# firewall-cmd --add-service=http --zone=public
※明示的にゾーン内で「drop」「accept」のポリシーを指定して通信の制限をすることができますが、「drop」の設定をしても、すでにターゲットで拒否されているので意味のない設定になる場合があります。
■「ACCEPT」ターゲットを設定したゾーンの場合(trustedゾーン)
->
すべての通信を許可からスタートするターゲットになるので、このターゲットを設定したゾーンは、拒否したいIPやポート及びサービスなどを設定していきます。
trustedゾーンの為、以下の設定はすでに許可されているので意味がありません。
# firewall-cmd --add-service=http --zone=trusted
trustedゾーンでは明示的に許可から拒否する設定をいれて変更する必要があります。
# firewall-cmd --zone=trusted --add-rich-rule="rule family="ipv4" port protocol="tcp" port="80" drop"
※明示的にゾーン内で「drop」「accept」のポリシーを指定して通信の制限をすることができますが、「accept」の設定をしても、すでにターゲットで許可されているので意味のない設定になる場合があります。
参考URL
https://isleofhoso.com/linux-firewall-cmd/ - 破棄と拒否でアクションに違いがあります。
■破棄(「DROP」ターゲット)
応答が全くない状態(反応なし)
->pingの場合、応答を返さない
■拒否(「REJECT」・「default」ターゲット)
応答があり、拒否通知がある
->pingの場合、エラー応答あり
Firewalld初期設定
ゾーン(ZONE)のデフォルト設定について
必ずどのゾーンを適用するか決めてから設定してください
何も考えずにFirewalldサービスを起動すると
デフォルトの設定は「public」ゾーンが選択されて、ターゲットは「REJECT」となり
状態が「拒否」からスタートします。
■注意事項
稼働中(提供中)のサーバでFirewalldサービスを起動すると「public」ゾーンとなり
提供していたサービスが利用できなくなるので注意してください。
この場合は、「trusted」ゾーン設定をして、拒否するポリシーを設定するように
すると安全にFirewalldサービスを起動することができます。
設定箇所1:Firewalldサービス起動時のゾーン(ZONE)設定箇所
vi /etc/firewalld/firewalld.conf
firewalld.confファイルの
DefaultZone=public
箇所でfirewalldサービス起動時のデフォルトのゾーンを決定します。
設定箇所2:NICインターフェースでゾーン(ZONE)を設定
Firewalldの設定はNIC単位で行います。
NICが複数あり各NIC毎に設定したい場合に利用します。
※設定しなければ、Firewalldサービス起動時のデフォルトのゾーンが
各NICに反映されます。
言い換えると、NICに設定されたゾーンがactiveになり優先されるので、デフォルトに設定されたゾーンは無視されます。
vi /etc/sysconfig/network-scripts/ifcfg-XX
XX:適宜インターフェース毎で異なります。
例 「eth0」、「eth1」、「enp0s3」など
ifcfg-XXファイルに
ZONE=trusted
を追加することでNIC毎にゾーンを選択します。
■注意事項
設定後はネットワークインターフェース(NIC)の再起動をしないと適用されません。
※「systemctl restart network.service」が必要
例えば、
ifcfg-XXファイルにゾーン設定をしてNICの再起動をせずに
Firewalldサービスを起動してもifcfg-XXファイルに設定した
ゾーン設定は反映されません
ゾーン(ZONE)がactiveとなるケース
Firewalldサービスをデフォルトの設定で起動すると「publicゾーン」のみactiveになっている状態を前提とします。
firewall-cmd --list-all-zones
->各ゾーンごとの設定をまとめて確認
OR
firewall-cmd --zone=XXXX --list-all
->各ゾーンごとの設定を個別に確認
XXXX:ゾーン名を入力(public、drop、trusted・・・)
IPアドレス・セグメント(sources)を設定したゾーン
- IPアドレス・セグメントを設定したゾーンがactiveとなることを確認します。
- 設定したIPアドレス・セグメントが所属するゾーンのルールに従って動作します。
- 他のactiveとなっているゾーンのルールは無視されます。
firewall-cmd --add-source=192.168.11.18 --zone=drop
->「dropゾーン」に「192.168.11.18」のIPアドレスを登録
firewall-cmd --add-service=http --zone=public
->解説の為、「publicゾーン」にhttpアクセス許可を設定
■IPアドレス・セグメントを設定した「dropゾーン」がactive
NICのインターフェースを設定したゾーン
- NICが所属するゾーンがactiveになることを確認します。
- デフォルト設定の「publicゾーン」がactiveでない(未使用である)ことを確認します。
firewall-cmd --zone=trusted --change-interface=enp0s3
->NICの所属を「publicゾーン」から「trustedゾーン」へ変更
■NICが所属するゾーンがactive
補足:Firewalldサービス起動方法
インストールされていなければ
「yum install firewalld*」でインストールしてください
状態確認
systemctl status firewalld.service
自動起動
systemctl enable firewalld.service
サービス起動
systemctl start firewalld.service
Firewalldサービス起動後の設定や設定内容の確認については、以下を参照してください。
参考URL
https://isleofhoso.com/linux-firewall-cmd/
コメント