ping localhost和ping 127.0.0.1有什么区别?


31

执行以下操作以禁用ping答复后:

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

我从ping localhost与127.0.0.1得出了不同的结果

# 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

为什么这些结果不同?

Answers:


60

ping命令显示将名称解析为的地址。在这种情况下,它解析为IPv6本地主机地址::1。另一方面,127.0.0.1由于是IPv4地址,因此它明确ping使用IPv4。

sysctl你只用IPv4的影响坪,所以你得到的答复::1,但不适合127.0.0.1

您从解析获得的地址localhost取决于如何设置DNS解析器。localhost可能是在中设置的/etc/hosts,但理论上您可以从实际的名称服务器中获取。


至于如何丢弃IPv6 ping,您可能需要研究ip6tables,因为sysctlIPv6 似乎没有类似之处。或者,如果您不在网络中使用IPv6,请完全禁用它。(当然,这不是一个非常具有前瞻性的想法,但是如果您当前不使用它,那也是可行的。)


2
IPv6要求阻止ICMP 才能正常运行。;)
zaTricky18年

3
@zaTricky,该问题仅提及阻止ping。虽然令人讨厌并且不是很有用,但我认为它一般不会破坏任何东西。阻止所有 ICMP数据包显然会更糟,但是没有人甚至暗示过,它只在这里的两条评论中提到过……
ilkkachu

当然,可能更具体。IPv6上的正确通信需要“ ICMP回声请求”(通常称为ping)。您可以阻止自发的有害ping进入客户端-但是,如果阻止出站,则可能会破坏IPv6功能。自发布答案以来,问题似乎已经改变并没有帮助。
zaTricky

33

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,则该服务将处理解析本地主机的方式。
根据文档systemd-resolved

主机名“ localhost”和“ localhost.localdomain”(以及任何以“ .localhost”或“ .localhost.localdomain”结尾的主机名)都解析为IP地址 127.0.0.1::1

ping
当您尝试ping主机名或域名时,它将要求操作系统解析该主机名或域名。就您而言,您已禁用icmpv4但是将本地主机解析为IPv6回送和IPv4回送,但仅将其作为IPv6回送答案。
区别在于,在一种情况下,您尝试ping IP,而在另一种情况下,您ping可能采用多个值的主机名。

禁用icmpv6
如果不需要IPv6,建议您禁用它。它将使您在防火墙和配置服务上需要完成的所有工作加倍:

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解析DNS综合类资源记录localhostlocalhost.localdomain
约翰·迈伦(JohanMyréen)

@MichaelHampton这不是完整的hosts文件,但我没有::1 localhost运行ubuntu 17.10
Kiwy

2
“子网” :: 1/128仅对应一个IP,就像127.0.0.1/32仅解析为一个IP。
zaTricky

9

Localhost有两个地址,一个IPv6地址:: 1和一个IPv4地址127.0.0.1。

IPv6是默认协议,因此:: 1始终比127.0.0.1更可取。这就是为什么在询问ping本地主机时必须ping ::: 1的原因。

至于为什么您可以ping ::: 1但不能ping 127.0.0.1,则您的sysctl仅禁用了对IPv4的ping操作,而对IPv6却不启用了ping操作。据我所知,没有相应的sysctl来禁用IPv6的ping操作,但是如果您确实需要,可以在防火墙中将其禁用(当然不建议禁用它)。


5
建议不要为IPv6禁用ping,因为它会断开连接,从teredo地址进行连接的人们无法再访问该计算机(因为它使用ping选择最近的任播teredo隧道计算机)
Ferrybig

1
可以通过/etc/gai.conf文件控制IPv6与IPv4的名称解析首选项。默认情况下,它仅具有注释。如果取消注释其中的precedence行并在注释中进行了建议更改,则可以使主机名解析更喜欢IPv4而不是默认IPv6。
telcoM

@telcoM是的,您可以这样做。但是,如果这样做,最好向可能使用该计算机的任何人发出明显的警告,因为更改优先级会导致意外的行为。
迈克尔·汉普顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.