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


31

ping応答を無効にするために次を実行した後:

# sysctl net.ipv4.icmp_echo_ignore_all=1
# sysctl -p

localhostと127.0.0.1の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

ping 127.0.0.1が失敗します:

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

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

回答:


60

このpingコマンドは、名前を解決したアドレスを表示します。この場合、IPv6 localhostアドレスに解決されました::1。一方、127.0.0.1はIPv4アドレスなので、明示的にpingIPv4 を使用します。

sysctlあなたがのために回答を得るように、あなただけの使用は、IPv4のpingを影響し::1ますが、ないために127.0.0.1

解決から取得するアドレスlocalhostは、DNSがどのようにリゾルバーが設定されているかによって異なります。localhostはおそらくに設定されて/etc/hostsいますが、理論的には実際のネームサーバーから取得できます。


IPv6のpingをドロップする方法についてip6tablessysctl、IPv6に類似するものがないように思われるため、を調べる必要があります。または、ネットワークでIPv6を使用していない場合は、IPv6を完全に無効にします。(もちろん、それは非常に前向きな考えではありませんが、とにかく現在それを使用していない場合は実行可能です。)


2
IPv6では、正しく機能するためにICMP がブロックされないことが必要です。;)
zaTricky

3
@zaTricky、質問ではpingのブロックについてのみ言及されていました。不快であまり有用ではありませんが、一般的に何も壊さないと思います。すべての ICMPパケットをブロックすることは明らかに悪いことですが、誰もそれを示唆することさえありませんでした。それはここの2つのコメントでしか言及されていません
...-ilkkachu

確かに、より具体的かもしれません。一般にpingと呼ばれる「ICMPエコー要求」は、IPv6を介した適切な通信に必要です。あなたはできるクライアントへの自発的な不要なのping ingressesをブロックする-しかし、あなたはおそらく、IPv6機能を破壊しているアウトバウンドブロックする場合。回答が投稿されてから質問が変更されたように見えるのを助けません。
zaTricky

33

127.0.0.1:127.0.0.1
は、ほとんどのシステムのデフォルトのループバックです。ループバックアドレスは、OSのネットワークスタックを検証するためにシステムが使用するアドレスです。
IPv4のループバックアドレスはサブネット内の任意の値を取ることができます。IPv6 127.0.0.0/8
のループバックアドレスはサブネット内の任意の値を取ることができ::1/128
pingます。

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ループバックの回答のみです。
違いは、ある場合にはIPをpingしようとしているのに対して、別の場合ではいくつかの値を取ることができるホスト名を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

2
ホストファイルに問題があります。それも含まれているはず::1 localhostです。
マイケルハンプトン

2
補足:IPv4よりも127.0.0.0/8ネットワーク全体がループバックアドレスであることに注意してください(ping 127.100.101.102同様に機能します)。
-jjmontes

1
のエントリlocalhostは必ずしも必要ではありません/etc/hosts。たとえば、systemd-resolvedはlocalhostおよびのDNSリソースレコードを合成しますlocalhost.localdomain
ヨハンMyréen18年

@MichaelHampton完全なhostsファイルではないが、::1 localhostubuntu 17.10 を実行していない
-Kiwy

2
「サブネット」:: 1/128は、1つのIPのみに対応します。127.0.0.1/ 32は、その1つのIPのみに解決されます。
zaTricky

9

Localhostには、IPv6アドレス:: 1とIPv4アドレス127.0.0.1の2つのアドレスがあります。

IPv6はデフォルトのプロトコルであるため、12:10.0.0.1よりも:: 1が常に優先されます。これが、localhostにpingを要求するときに:: 1をpingした理由です。

ping :: 1を実行できたが、127.0.0.1をpingできなかった理由については、sysctlはIPv4のpingのみを無効にし、IPv6のpingは無効にしません。私が知る限り、IPv6のpingを無効にするための対応するsysctlはありませんが、本当に必要な場合は代わりにファイアウォールで無効にすることができます(もちろん無効にすることはお勧めできません)。


5
IPv6のpingを無効にすると接続が切断されるため、お勧めできません。teredoアドレスから接続するユーザーはマシンに到達できません(pingを使用して最も近いエニーキャストteredoトンネルマシンを選択するため)
Ferrybig

1
IPv6とIPv4の名前解決の優先順位は、/etc/gai.confファイルで制御できます。デフォルトでは、コメントのみがあります。そのprecedence行のコメントを外し、コメントでも提案されている変更を行うと、デフォルトのIPv6ではなくIPv4を優先するホスト名解決を取得できます。
telcoM

@telcoMはい、できます。ただし、優先順位を変更すると予期しない動作が発生するため、そのマシンを使用する可能性のある人には顕著な警告を出すことをお勧めします。
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.