我有以下拓扑:
+--------------------------------------------------+ | Segment 192.168/24 | | | | Machine A Network Router R | | +-----------------+ +-----------------+ | | | 192.168.0.110 | | 192.168.0.1 | | | | | | | | | +-----------------+ +-----------------+ | | +-------------------------+ | | | Machine B | | | | +-----------------+ | | | | | 192.168.0.112 | | | | | | 172.20.1.1 | | | | | +-----------------+ | | +--------------------------------------------------+ | Machine C | | +-----------------+ | | | | | | | 172.20.1.100 | | | +-----------------+ | | | | Segment 172.20/16 | +-------------------------+
段192.168 / 24是物理局域网,段172.20 / 16是VPN。 我想使用机器B作为两个段之间的路由器。 B是启用了IP转发和NAT的Linux机器。
当我在机器A中创build一条到172.20 / 16networking(通过192.168.0.112)的路由时,我可以正确地到达机器C.
但是,当我在192.168 / 24网段的默认网关(networking路由器R)中创build一条到172.20 / 16到192.168.0.112的路由时,关于到达机器C的尝试如下:
我在每个节点都做了数据包捕获,并且:
eth.dst是来自A的原始MAC到R)。 这是设置之间的唯一区别。 显然B丢弃MAC地址错误的帧。
有趣的部分是,我有另一个基础设施完全相同的设置 (大多是不同的硬件)。
我能做些什么来解决这个问题?
您应该获得ICMPredirect消息,而不是您所期望的ICMP回应回复。
主机192.168.0.110向其默认网关192.168.0.1发送ICMP回应请求,然后该请求将数据包redirect到192.168.0.112以到达子网172.20.0.0/16。 在这种情况下,网关将使用ICMPredirect进行响应(因为将ping消息直接发送到192.168.0.112的时间更短)。
这是一个相关的serverfault文章 。
要在Linux机器上解决这个问题,我在发送机器192.168.0.110上添加一个静态路由,如下所示:
$ sudo route add -net 172.20.0.0/16 gw 192.168.0.112
当添加此静态路由时,当尝试访问172.20.0.0/16子网时,本机将不会联系默认网关。