“ping”使用本地主机而不是公共 IP 地址

“ping”使用本地主机而不是公共 IP 地址

假设我的服务器有 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

但是有了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

这种行为不仅限于ping.我也得到同样的结果wget

为什么会发生这种情况?这是我服务器上的配置造成的吗?

我在用Debian 9(拉紧)。

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

如果当 ping 我自己的公共 IP 地址时,流量实际上去了127.0.0.1.但是,ping 应该是诚实的,并且实际上显示它正在 ping 本地主机。我发现危险的是,我正在 ping 11.22.33.44,根据与ifconfig相关联eth0,并且 ping 假装它将流量发送到eth0,但实际上发送到lo

答案1

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

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

答案2

这与 Linux 上网络路由的发生方式有关。例如,您可以查看路由表,它很可能会显示属于 11.22.33.0/24 子网的任何流量都将“本地”路由。这意味着它将直接进入环回。

[jar@coffee ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.107.136.1    0.0.0.0         UG    100    0        0 eth0
10.107.136.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

拥有10.107.136.0在里面目的地列表示本地子网上的任何流量都应发送到列出的网关,即0.0.0.0-- 在这种情况下意味着本地路由。

拥有0.0.0.0目的地表示流向该子网之外任何地方的流量。默认网关随后会列在网关

如果你跑步你还会注意到tcp转储-n交换机,IP 地址是不是127.0.0.1,它恰好出现在环回接口上,因为它是本地流量。

相关内容