以下を実行してping応答を無効にした後:
# sysctl net.ipv4.icmp_echo_ignore_all=1
# sysctl -p
127.0.0.1と比較したlocalhostへのpingで異なる結果が得られます
# ping -c 3 localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.101 ms
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2042ms
rtt min/avg/max/mdev = 0.047/0.072/0.101/0.022 ms
127.0.0.1へのpingは失敗します:
ping -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2032ms
これらの結果が異なるのはなぜですか?
ping
コマンドは、名前を解決したアドレスを表示します。この場合、IPv6 localhostアドレス::1
に解決されました。一方、127.0.0.1
はIPv4アドレスであるため、明示的にping
でIPv4を使用します。
使用したsysctl
はIPv4 pingにのみ影響するため、::1
に対する応答はありますが、127.0.0.1
に対する応答はありません。
localhost
を解決して得られるアドレスは、DNSリゾルバーの設定方法によって異なります。 localhost
はおそらく/etc/hosts
で設定されますが、理論的には実際のネームサーバーから取得できます。
IPv6のpingをドロップする方法については、IPv6のsysctl
がないように見えるため、ip6tables
を調べる必要がある場合があります。または、ネットワークで使用していない場合は、IPv6を完全に無効にします。 (もちろん、これはあまり前向きなアイデアではありませんが、とにかくそれを現在使用していない場合は可能です。)
127.0.0.1:
127.0.0.1は、ほとんどのシステムのデフォルトのループバックです。ループバックアドレスは、システムがOSのネットワークスタックを検証するために使用するアドレスです。
IPv4のループバックアドレスは、サブネット127.0.0.0/8
で任意の値を取ることができます
IPv6のループバックアドレスは、サブネットで任意の値を取ることができます::1/128
ping
ネットワークスタックがOSで動作している場合、これらの範囲の値はすべて機能するはずです。
localhost:localhost
はホスト名です。これは一種のドメイン名ですが、自分のマシンに対してローカルです。
このホスト名は、デフォルトでIPv4およびIPv6ループバックを指します。これは、多くの場合127.0.0.1
または::1
です。
localhost
アドレスは、ファイル/etc/hosts
を編集することで簡単に変更できます。
システムがサービスsystemd-resolved
を使用している場合、このサービスはlocalhostの解決方法を処理します。systemd-resolved
のドキュメントによると:
ホスト名「localhost」および「localhost.localdomain」(および「.localhost」または「.localhost.localdomain」で終わるホスト名)は、IPアドレス
127.0.0.1
および::1
に解決されます
ping
ホスト名またはドメイン名をpingしようとすると、OSにこのホスト名またはドメイン名を解決するように要求します。あなたの場合、icmpv4
を無効にしましたが、localhostはIPv6ループバックとIPv4ループバックとして解決されますが、IPv6ループバックの回答のみが解決されます。
違いは、1つはIPにpingしようとしている場合で、もう1つは複数の値をとる可能性のあるホスト名にpingする場合です。
icmpv6を無効にする
IPv6が必要ない場合は、無効にすることをお勧めします。ファイアウォールとサービスの構成で行う必要があるすべての作業が2倍になります。
sysctl -w net.ipv6.conf.all.disable_ipv6=0
それでもIPv6サポートが必要で、icmpv6
を避けたい場合は、ip6tables
を使用できます。
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Localhostには、IPv6アドレス:: 1とIPv4アドレス127.0.0.1の2つのアドレスがあります。
IPv6はデフォルトのプロトコルであるため、:: 1は常に127.0.0.1よりも優先されます。これが、localhostにpingを要求するときに:: 1にpingした理由です。
:: 1に対してpingを実行できたが127.0.0.1に対してはpingを実行できなかった理由については、sysctlはIPv4に対してのみpingを無効にしましたが、IPv6に対しては無効にしませんでした。私が知る限り、IPv6のpingを無効にする対応するsysctlはありませんが、本当に必要な場合はファイアウォールで無効にすることができます(もちろん、無効にすることはお勧めしません)。