如果网络上的主机收到一个 IP 数据包,该数据包的 MAC 源地址与该源 IP 的本地 ARP 表中的 MAC 地址不同,会发生什么情况?
该 IP 的 ARP 表条目已经并将通过有效的 ARP 响应填充。
现在我注意到接收主机(Ubuntu 18.04)没有发送回复数据包(ICMP 回应响应或 TCP SYN/ACK 等)。没有回复数据包离开接口。
现在的问题是,主持人出于什么原因采取这样的行为。 对数据包的 MAC 和 IP 地址、本地 arp 表和路由表等进行了哪些检查?
编辑:
为了澄清场景:
如果主机 Hb 向 10.2.0.5(主机 Ha)发送 ping 请求,Ha 会收到一个 ICMP 数据包,源 IP 为 10.1.0.3,源 MAC 地址是路由器的 MAC 地址。但主机 Ha 的 ARP 表中有一个条目:10.1.0.3 -> Hb MAC 地址。因此 MAC 地址不同!
答案1
此行为完全符合预期,与主机的路由配置有关Hb
,主机可能只有通过路由器的默认路由。因此,如果您尚未设置附加路由,则发送到网络N2
( 10.2.0.0/24
) 的数据包将通过默认路由发送。
因此,该问题是由主机上启用的反向路径过滤器引起的Ha
,该过滤器通过限制源地址来丢弃传入的数据包。
要解决此问题,您应该检查主机上下一个命令的输出Ha
:
ip netconf show dev <iface-N2>
- 检查rp_filter
值。很可能是strict
。ip route get 10.2.0.5 from 10.1.0.3 iif <iface-N2>
- 可能会显示类似的内容invalid cross-device link
。nstat -az TcpExtIPReversePathFilter
- 很可能它具有非零值。
有三种解决这个问题的方法:
只需使用 sysctl (和) 在主机
rp_filter
上禁用 即可。此外,您还应编辑该文件以使此更改永久生效。Ha
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.<iface-N2>.rp_filter=0
/etc/sysctl.conf
只需在主机上添加路由
Hb
到10.2.0.5
直通10.1.0.5
地址(对于 Linuxip route add 10.2.0.5 via 10.1.0.5
,为 Windows,为命令route add 10.2.0.5 mask 255.255.255.255 10.1.0.5
)在路由器上配置源地址转换 (NAT),将地址重写
Hb
为路由器地址。执行此操作的 iptables 规则:
iptables -t nat -A POSTROUTING -o <iface-N2> --src 10.1.0.3 --dst 10.2.0.5 -j MASQUERADE