先日あるサーバーを受け取り接続等を確認したところ、サーバー内には入れるもののping応答が無い状態でした。なぜかわからず困っていたところ、「firewallでICMPを遮断しているんじゃない?」と教えて頂きました。
ということで、今回はpingの応答を返さないようにfirewallをチューニングしていきます。
pingとかICMPとかって?
チューニングする前にさらっとpingについてです。
pingコマンドは、よく疎通確認の際に利用されるかと思います。pingコマンド実行時に送信されるパケットは、ICMPプロトコルを使用しています。実際、コマンドを叩いた時に「icmp_seq=...」と表示されているそれです。
今回はこのICMPプロトコルの受け付けをfirewalldで制御していきます。
Firewallの設定
環境
Almalinux 9.5
firewalld version.1.3.4
設定手順
今回扱う機器の関係は以下のようにします。
機器A:pingを実行する
機器B(192.168.210.233):pingを受け付けない
設定前の確認
まずは設定前にちゃんとpingが届くかどうか、機器Aからコマンドを実行して確かめてみましょう。
$ ping 192.168.210.233
PING 192.168.210.233 (192.168.210.233) 56(84) bytes of data.
64 bytes from 192.168.210.233: icmp_seq=1 ttl=63 time=0.356 ms
64 bytes from 192.168.210.233: icmp_seq=2 ttl=63 time=0.277 ms
64 bytes from 192.168.210.233: icmp_seq=3 ttl=63 time=0.323 ms
64 bytes from 192.168.210.233: icmp_seq=4 ttl=63 time=0.255 ms
64 bytes from 192.168.210.233: icmp_seq=5 ttl=63 time=0.227 ms
64 bytes from 192.168.210.233: icmp_seq=6 ttl=63 time=0.313 ms
^C
--- 192.168.210.233 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5117ms
rtt min/avg/max/mdev = 0.227/0.291/0.356/0.043 ms
"6 packets transmitted, 6 received, 0% packet loss "となっており、送信されたパケットに対して応答があることがわかります。
では、pingコマンドを実行しても応答を返さないようにするため、機器B側のfirewalldを調整していきます。
firewalldの確認
まずはゾーンについてです。特に設定していなければ、デフォルトゾーンはpublicになっているかと思います。
# firewall-cmd --get-default-zone
public
続いて、publicゾーンの現在の設定を確認します。
# firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: eno1 eno2 eno4
sources:
services: dhcpv6-client ntp ssh
ports: 1234/tcp 22/tcp 80/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
設定項目が色々表示されていますが、今回着目するのは"target"の部分になります。
targetにはdefault,DROP,ACCEPTの3種類あり、それぞれの意味合いは以下のようになります。
default
|
ICMPのみを通し、それ以外は応答しない。
|
DROP |
許可していない項目以外の応答は破棄。
|
ACCEPT |
あらゆる疎通を許可。
|
(この表を見てむずむずする方もいるかと思いますが、著者の環境だとdefault以外は大文字指定になっていました。)
では、相手機器からpingが実行された際に返答しないようにするため、targetをdefault⇒DROPに変更していきます。
targetの変更
firewall-cmdの--set-targetオプションでDROP指定します。
ちなみに、DROPの部分をdefaultにすれば変更前に戻すことができます。
# firewall-cmd --permanent --zone=public --set-target=DROP
success
successになっていればOKです。
ただ、このままだと設定できてない状態ですので、リロードして設定を反映します。
# firewall-cmd --reload
success
では、ちゃんと設定内容が反映されているかどうか、再度publicゾーンの情報を確認します。
# firewall-cmd --list-all --zone=public
public (active)
target: DROP
icmp-block-inversion: no
interfaces: eno1
sources:
services: dhcpv6-client ntp ssh
ports: 1234/tcp 22/tcp 80/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
targetの項目がDROPに切り替わっています。
設定後の確認
設定が完了したので、再度機器Aから機器Bに対してpingを実行してみましょう。
$ ping 192.168.210.233
PING 192.168.210.233 (192.168.210.233) 56(84) bytes of data.
^C
--- 192.168.210.233 ping statistics ---
15 packets transmitted, 0 received, 100% packet loss, time 14324ms
100% packet loss となっており、パケットが破棄されていることがわかります。
まとめ
firewalldのtargetを変更すれば、pingの応答制御が出来ることがわかりました。
pingは疎通確認でよく使われますが、今回のように疎通できていないように見えても、サーバーが稼働している場合があります。基本的には疎通が確認できた方が、外部から見えると監視など行いやすいですが、都合の悪い際はpingが届かないようにしてみるのもありだなと思いました。