在LAN之间路由

我有以下拓扑:

+--------------------------------------------------+ | 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的尝试如下:

  • 起源于路由器本身(192.168.0.1)的Ping正确接收应答;
  • P起源于A去R,然后去B,但不会被转发到C;
  • 没有ICMPredirect生成。

我在每个节点都做了数据包捕获,并且:

  1. 当上述路由为A时,到达B的帧的以太网目的地址被设置为B的MAC(即A直接发送给B)。
  2. 当上述路由进入R时,到达B的帧的以太网目的地址被设置为R的MAC(即A发送给R,R“发送”给B,但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子网时,本机将不会联系默认网关。