'ping' 使用 localhost 而不是公共 IP 地址

Mar*_*ter 5 networking routing wget ping tcpdump

假设我的服务器有 IP 地址11.22.33.44和主机名server1.mydomain.com

当我 ping 时server1.mydomain.com,看起来好像 ping 实际上使用的是公共 IP 地址:

# ping server1.mydomain.com
PING server1.mydomain.com (11.22.33.44) 56(84) bytes of data.
64 bytes from server1.mydomain.com (11.22.33.44): icmp_seq=1 ttl=64 time=0.014 ms
64 bytes from server1.mydomain.com (11.22.33.44): icmp_seq=2 ttl=64 time=0.012 ms
64 bytes from server1.mydomain.com (11.22.33.44): icmp_seq=3 ttl=64 time=0.011 ms
Run Code Online (Sandbox Code Playgroud)

但是使用tcpdump,我看不到ICMP流量eth0,而是看到 ping 通过lo

# tcpdump -i lo
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
08:43:49.076918 IP server1.mydomain.com > server1.mydomain.com: ICMP echo request, id 8525, seq 1, length 64
08:43:49.076931 IP server1.mydomain.com > server1.mydomain.com: ICMP echo reply, id 8525, seq 1, length 64
08:43:50.075913 IP server1.mydomain.com > server1.mydomain.com: ICMP echo request, id 8525, seq 2, length 64
08:43:50.075924 IP server1.mydomain.com > server1.mydomain.com: ICMP echo reply, id 8525, seq 2, length 64
08:43:51.074911 IP server1.mydomain.com > server1.mydomain.com: ICMP echo request, id 8525, seq 3, length 64
08:43:51.074919 IP server1.mydomain.com > server1.mydomain.com: ICMP echo reply, id 8525, seq 3, length 64
Run Code Online (Sandbox Code Playgroud)

这种行为不仅限于ping. 我也一样wget

为什么会这样?这是由我的服务器上的配置引起的吗?

我正在使用Debian 9 (Stretch)。

编辑:澄清评论中出现的一些分歧:

如果在 ping 我自己的公共 IP 地址时,流量实际上转到127.0.0.1. 但是,ping 应该诚实并实际表明它正在 ping localhost。我觉得危险的是,我正在 ping 11.22.33.44,根据与ifconfig相关联eth0,并且 ping 假装它发送流量到eth0,但实际上发送到lo.

小智 9

内核知道“它已经存在”,因此“优化”了 ICMP 数据包的发送。这就是为什么您会在环回接口上看到它们的原因。其他人可能会填写更多细节。

尽管如此:几年前我遇到了类似的问题,我能够通过使用unsharelike创建一个新的网络命名空间来解决它们unshare -n /bin/bash。然后你有一个带有全新网络堆栈的外壳(我没有正确的术语)并且没有环回接口。您必须在其中定义一个新的 IP、路由等 pp.,但是从该 shell 中,您可以从以太网接口向自己发送 ICMP 数据包。