假设我的服务器有 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 数据包的发送。这就是为什么您会在环回接口上看到它们。其他人可能能够填写更多详细信息。
尽管如此:几年前我遇到了类似的问题,我能够通过使用unshare
like创建一个新的网络命名空间来解决它们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,它恰好出现在环回接口上,因为它是本地流量。