我像这样配置了我的机器:
eth0 - 192.168.70.128/24, default gw 192.168.70.128
例如,当尝试发送 ICMP 请求以便通过默认网关路由时,我收到 ICMP 无法访问主机错误:
From 192.168.70.128 icmp_seq=1 Destination Host Unreachable
这是有道理的。
查看流量捕获,我可以看到环回接口上的 ICMP 不可达数据包:
5 3.072955110 192.168.70.128 192.168.70.128 ICMP 128 Destination unreachable (Host unreachable)
当然,ICMP 不可达消息包含无法发送到目的地的数据包:
Internet Protocol Version 4, Src: 192.168.70.128, Dst: 8.8.8.8
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 84
Identification: 0x3b84 (15236)
Flags: 0x40, Don't fragment
...0 0000 0000 0000 = Fragment Offset: 0
Time to Live: 64
Protocol: ICMP (1)
Header Checksum: 0xe7ec [validation disabled]
[Header checksum status: Unverified]
Source Address: 192.168.70.128
Destination Address: 8.8.8.8
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0x7a29 [unverified] [in ICMP error packet]
[Checksum Status: Unverified]
Identifier (BE): 25938 (0x6552)
Identifier (LE): 21093 (0x5265)
Sequence Number (BE): 1 (0x0001)
Sequence Number (LE): 256 (0x0100)
Timestamp from icmp data: May 5, 2022 12:15:36.000000000 EDT
[Timestamp from icmp data (relative): 3.291527300 seconds]
Data (48 bytes)
我缺少的是原始数据包 - 它没有在我的机器上的任何接口上捕获,那么它去哪里了?我如何才能捕获它?
答案1
指定自己作为网关,意味着创建一个链接上路由,就像没有指定网关一样。(这在 Linux 上并不常见,但我认为这是来自 BSD。)
换句话说,你的0.0.0.0/0 via 192.168.70.128
作品就像0.0.0.0/0 dev eth0
,并表明全部的0.0.0.0/0 是一个“本地子网”,其中目标 IP 地址必须通过 ARP 进行解析,并且数据包直接发送到目标主机的 MAC 地址(而不是像普通“网关”路由那样发送到网关的 MAC)。
因此,您没有在 eth0 上看到传出的 ICMP 数据包的原因是它们无法发送然而,直到操作系统知道将它们发送到哪个下一跳 MAC 地址——它必须先成功进行 ARP 查找。在这种情况下,Linux 将8.8.8.8
在 eth0 接口上发送 ARP 查询。(常规“网关”路由也是如此,只是对于它们来说,网关 IP 地址需要通过 ARP 进行解析。)
错误“目标主持人“不可达”意味着最终主机没有收到 ARP 回复,这与您尝试 ping 子网内不存在的 IP 地址完全相同。
(但总体来说这并不是不合理的配置——至少在过去,一些网络习惯配置所有主机以假设整个 0.0.0.0/0 是本地的,网关将代表每个主机做出响应,即“代理 ARP”。这有几个目的 - 主机不需要知道网关的地址,并且可以有多个网关处理不同的目的地,而主机不需要知道确切的路由。)