web-dev-qa-db-ja.com

ping localhostとping 127.0.0.1の違いは何ですか?

以下を実行して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

これらの結果が異なるのはなぜですか?

31
Helio

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を完全に無効にします。 (もちろん、これはあまり前向きなアイデアではありませんが、とにかくそれを現在使用していない場合は可能です。)

60
ilkkachu

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
33
Kiwy

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はありませんが、本当に必要な場合はファイアウォールで無効にすることができます(もちろん、無効にすることはお勧めしません)。

9
Michael Hampton