执行以下操作以禁用 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
为什么这些结果不同?
该
ping
命令显示将名称解析到的地址。在这种情况下,它解析为 IPv6 本地主机地址,::1
. 另一方面,127.0.0.1
它是一个 IPv4 地址,因此它明确ping
使用 IPv4。您使用的
sysctl
仅影响 IPv4 ping,因此您会收到 的回复::1
,但不会收到127.0.0.1
.您从解析中获得的地址
localhost
取决于您的 DNS 解析器的设置方式。localhost
可能设置在 中/etc/hosts
,但理论上您可以从实际的名称服务器中获取它。至于如何丢弃 IPv6 ping,您可能需要查看
ip6tables
,因为 IPv6 似乎没有类似sysctl
的。或者只是完全禁用 IPv6,如果您没有在网络中使用它。(当然,这不是一个非常具有前瞻性的想法,但如果你目前没有使用它,它是可行的。)127.0.0.1:127.0.0.1
是大多数系统的默认环回。环回地址是系统用来验证操作系统的网络堆栈的地址。
IPv4 的环回地址可以采用子网中的任何
127.0.0.0/8
值 IPv6 的环回地址可以采用子网中的
::1/128
ping
任何值,如果您的网络堆栈在您的操作系统上运行,那么这些范围内的任何值都应该有效。localhost:
localhost
是一个主机名,这是一种域名,但在您自己的机器上是本地的。默认情况下,此主机名指向您的 IPv4 和 IPv6 环回,通常为
127.0.0.1
或::1
.localhost
可以通过编辑文件轻松更改地址/etc/hosts
。如果您的系统使用该服务
systemd-resolved
,该服务将处理 localhost 的解析方式。根据以下文件
systemd-resolved
:ping
当您尝试 ping 主机名或域名时,它会要求操作系统解析此主机名或域名。在您的情况下,您禁用
icmpv4
但 localhost 被解析为您的 IPv6 环回和您的 IPv4 环回,但只有您的 IPv6 环回答案。不同之处在于,在一种情况下,您尝试 ping 一个 IP,而在另一种情况下,您 ping 一个可能需要多个值的主机名。
禁用 icmpv6
如果您不需要 IPv6,我建议您禁用它。它将使您在防火墙和配置服务方面需要做的所有工作加倍:
如果您仍然想要 IPv6 支持并想避免
icmpv6
,您可以使用ip6tables
:本地主机有两个地址,一个 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,但如果您确实需要,您可以在防火墙中禁用它(当然无论如何都不建议禁用它)。