前回(firewalldの設定方法①)の続きです。
今回は、もっと複雑な要件でfirewalld
の設定をしてみたいと思います
以下に要件を記載します
【業務LAN(eth0)】
・シスログを受信するNW機器と、ADサーバなど運用上で通信が必要なサーバ(同セグメント)以外の通信は拒否する。
・シスログはUDP141
で受信する。
・同セグメント内のサーバはany
で許可する。
(内部セグメントは192.168.0.0/24
、NW機器は10.171.1.5
とします)
ゾーンの作成
前回の記事で紹介したように、あらかじめ9種類のゾーンが用意されていますが、個別にゾーンを作成してそこへ定義することも可能です。
今回のように、個別に接続元IPアドレスや受信するポートを制限したいといった場合に有効です。
では、上記の要件をもとに追加ゾーンの「gyoumu」を作っていきます。
(ゾーンの名前は任意なので、今回は「業務」で作成します)
・dropゾーンの内容をコピーして、「gyoumu」ゾーンとして使うためのひな型を作成する
# cp /usr/lib/firewalld/zones/drop.xml /etc/firewalld/zones/gyoumu.xml
要件に記載があるように、今回シスログを受信するNW機器と同セグメントのサーバ以外とは通信を行わないので、今回はdrop
ゾーンの定義をコピーします。
・作成したゾーンファイルをコマンドで扱えるようにするために、リロードする
# firewall-cmd --reload
作成しただけでは、ゾーンとして認識されていない状態なので一度リロードします。
これでgyoumuゾーンの作成は完了です。
リッチルールの追加
先ほど作成したゾーンに、要件に合わせてルールを追加していきます。
今回は、送信元ごとに許可をしたいポートが異なるので、さらに詳細な設定ができる「リッチルール」を使います。
コマンドの構文が少し異なりますが、前述した内容とルールはほとんど同じです。
今回も設定前に、今現在の設定内容を確認しておきましょう。
# firewall-cmd --list-all --zone=gyoumu
gyoumu
target: DROP
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
public
ゾーンと比べると、target
がDROP
になっており、services
欄も空欄になっていることが分かります。
では、ここに設定を追加していきたいと思います。
・sshの許可
# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept'
要件には記載されていませんが、ssh
を許可しないとサーバへのssh接続が出来なくなってしまうので、使用する端末やサーバなど、ssh接続をする可能性があるIPアドレスは全て追加してください。
・NW機器からのUDP141の受信を許可
# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="10.171.1.5" port protocol="udp" port="514" accept'
・内部セグメントとの通信をanyで許可
# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port protocol="tcp" port="0-65535" accept'
# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port protocol="udp" port="0-65535" accept'
any
という指定は出来ないので、特に制限したいポートがない場合は全てのポート(0-65535
)を範囲指定します。
また、tcp
とudp
も同時には指定できないので、それぞれでコマンドを実行します。
これで、要件通りの許可設定が完了しましたが、まだこのゾーンはどこのセグメントにも適用されていないので、最後に業務LAN(eth0)にgyoumuゾーンを適用していきます。
# nmcli con mod “System eth0” connection.zone gyoumu
※インターフェース名の指定方法は各自の環境で確認してください。
ゾーンはfirewall-cmd
コマンドでも変更できますが、ゾーンの変更に関してのみ、前回の記事で紹介した--permanent
オプションを付与しても恒久的な設定になりません。
そのため、恒久的な設定にするには、nmcli
コマンドを用いて変更します。
また、上記のコマンドは、正常終了した場合でも特に何も表示されません。
このため、設定が正しく反映されたかは下記のコマンドで確認します。
# firewall-cmd --get-zone-of-interface=eth0
gyoumu
業務LAN(eth0)にgyoumuゾーンが適用されていることが分かりました。
・設定を反映させる
# firewall-cmd --reload
以上で設定は完了です。
変更後の設定内容を確認します。
# firewall-cmd --list-all --zone=gyoumu
gyoumu
target: DROP
icmp-block-inversion: no
interfaces: eth0
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.0.0/24" servie name="ssh" accept
rule family="ipv4" source address="10.171.1.5" port protocol="udp" port="514" accept
rule family="ipv4" source address="192.168.0.0/24" port protocol="tcp" port="0-65535" accept
rule family="ipv4" source address="192.168.0.0/24" port protocol="udp" port="0-65535" accept
interfaces
にeth0
が追加され、リッチルールの欄にも設定が追加されたことが分かります。
以上で設定は完了!!…と思いましたが、ここで1つ問題が発生します。
それは、この状態だとpingが通らないという事です!!
ポートをanyで許可しているので関係ないと思っていましたが、pingにはICMP
という全く別のプロトコルが使用されており、追加でICMP
も許可しないとpingは通らないことが判明しました。(知らなかった)(これって一般常識ですか?笑)
そこで、使用するのが以下のコマンドになります!
・リッチルールを使用し、ICMPを許可したいIPアドレスを指定する場合
# firewall-cmd --permanent --zone=gyoumu --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" protocol value="icmp" accept'
再度リロードし、設定内容を確認すると、リッチルールの欄に以下が追加されていることが分かります。(※一部抜粋)
rule family="ipv4" source address="192.168.0.0/24" protocol value="icmp" accept
また、許可するIPアドレスなどは制限せず、ICMP
は全て許可する場合は以下のコマンドになります。
# firewall-cmd --permanent --zone=gyoumu --add-protocol=icmp
この場合、設定を反映させると以下のようにプロトコル欄にicmpが追加されます。
protocols: icmp
これで無事にpingも通るようになりました!
セキュリティ的には許可しない方が良い場合もあるようですが、死活監視などでpingが必要な場合には場面に応じて許可しましょう。
===番外編==========================================
ちなみに、pingの許可には以下の方法もあります。
設定内容を確認したとき、icmp-block-inversion
とicmp-blocks
という項目がありましたが、これはicmp-block-inversion
がyesの時にicmp-blocks
に記載されたICMP Type
を受け入れ、
noの時はicmp-blocks
に記載されたICMP Type
を拒否する、というものです。
デフォルトではnoに設定されており、icmp-blocks
には何も記載されていませんが、この状態ではpingは許可されていません。(難しい…)
なので、pingに使用するICMP Type
だけを追加し、pingを許可してみたいと思います。
・まずは、icmp-block-inversionをyesに変更する
# firewall-cmd --add-icmp-block-inversion --zone=gyoumu
・pingで使用するICMP Typeを許可する
(使用できるICMP Type
の一覧はfirewall-cmd --get-icmptypes
で取得できます)
# firewall-cmd --add-icmp-block=echo-reply --zone=gyoumu
# firewall-cmd --add-icmp-block=echo-request --zone=gyoumu
この方法でもpingを許可できる(はず)です!
ただ推奨はされていないかもしれないので、恒久的な設定はせず、一時的に設定を入れて試してみてください。
==================================================
ちなみに、設定を間違えたりして、追加した設定を削除したいなどの場合は、前述したコマンドの--add
の部分を--remove
に変更して実行し、追加した時と同様にまたリロードするだけです。
(例)
# firewall-cmd --zone=public --remove-service=http --permanent
これで皆さんも一通りfirewalldの設定ができるようになりましたね!!!
もし間違っている箇所があったらこっそり優しく教えてください…
それでは、皆さんも素敵なfirewalldライフを!!!!