[Linux] pingが届かないようにしよう

メソ
2025-06-02
2025-06-02

先日あるサーバーを受け取り接続等を確認したところ、サーバー内には入れるものの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が届かないようにしてみるのもありだなと思いました。