ping localhost 和 ping 127.0.0.1 有什么区别?

Hel*_*lio 32 ping sysctl

执行以下命令禁用 ping 回复后:

# sysctl net.ipv4.icmp_echo_ignore_all=1
# sysctl -p
Run Code Online (Sandbox Code Playgroud)

我从 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

为什么这些结果不同?

ilk*_*chu 61

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,则完全禁用 IPv6。(当然,这不是一个非常具有前瞻性的想法,但如果您目前没有使用它,那也是可行的。)

  • @zaTricky,这个问题只提到了阻止 ping。虽然令人讨厌且不是很有用,但我认为它不应该破坏任何东西。阻塞 _all_ ICMP 数据包显然会更糟,但甚至没有人建议这样做,仅在此处的两条评论中提及... (3认同)
  • IPv6 要求 ICMP *不* 被阻止才能正常运行。;) (2认同)

Kiw*_*iwy 33

127.0.0.1:127.0.0.1
是大多数系统的默认环回。环回地址是系统用来验证操作系统网络堆栈的地址。
IPv4127.0.0.0/8
的环回地址可以采用子网中的::1/128
ping任何值IPv6 的环回地址可以采用子网中的任何值,如果您的网络堆栈在您的操作系统上运行,那么这些范围内的任何值都应该有效。

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 主机名或域名时,它会要求操作系统解析此主机名或域名。在您的情况下,您已禁用icmpv4但 localhost 被解析为您的 IPv6 环回和 IPv4 环回,但只有您的 IPv6 环回答案。
不同之处在于,在一种情况下,您尝试 ping 一个 IP,而在另一种情况下,您 ping 一个可能采用多个值的主机名。

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

sysctl -w net.ipv6.conf.all.disable_ipv6=0
Run Code Online (Sandbox Code Playgroud)

如果您仍然需要 IPv6 支持并希望避免icmpv6,您可以使用ip6tables

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Run Code Online (Sandbox Code Playgroud)

  • 您的主机文件有问题。它还应该包含`::1 localhost`。 (2认同)
  • 旁注:请记住,在 IPv4 中,整个 127.0.0.0/8 网络都是环回地址(因此`ping 127.100.101.102` 也可以工作)。 (2认同)
  • “子网”::1/128 只对应一个 IP,就像 127.0.0.1/32 只解析到那个 IP。 (2认同)

Mic*_*ton 9

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

IPv6 是默认协议,因此 ::1 始终优于 127.0.0.1。这就是您在要求 ping localhost 时 ping ::1 的原因。

至于为什么你可以 ping ::1 但不能 ping 127.0.0.1,你的 sysctl 只禁用了 IPv4 的 ping,而不是 IPv6。据我所知,没有相应的 sysctl 来禁用 IPv6 的 ping,但是如果确实需要,您可以在防火墙中禁用它(当然,无论如何也不建议禁用它)。

  • 禁用 IPv6 的 ping 是不明智的,因为它会中断连接,从 teredo 地址连接的人无法再访问机器(因为它使用 ping 选择最近的任播 teredo 隧道机器) (5认同)