我有以下拓扑:
+--------------------------------------------------+
| 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 是物理 LAN,网段 172.20/16 是 VPN。我想使用机器 B 作为两个网段之间的路由器。B 是一台启用了 IP 转发和 NAT 的 Linux 机器。
当我在机器 A 中创建到 172.20/16 网络的路由(通过 192.168.0.112)时,我可以正确到达机器 C。
但是,当我在 192.168/24 网段的默认网关(网络路由器 R)中创建一条通过 192.168.0.112 到 172.20/16 的路由时,对于尝试到达机器 C,以下情况属实:
- 从路由器本身(192.168.0.1)发出的 Ping 能够正确收到答复;
- 从 A 发出的 Ping 先到达 R,然后到达 B,但不是转发给C;
- 没有生成 ICMP 重定向。
我已经在每个节点上捕获了数据包,并且:
- 当上述路由在A时,到达B的帧的以太网目的地址被设置为B的MAC(即A直接发送给B);
- 当上述路由在 R 中时,到达 B 的帧的以太网目标地址被设置为 R 的 MAC(即 A 发送给 R,R“发送”给 B,但是
eth.dst
是从 A 到 R 的原始 MAC)。
这是设置之间的唯一区别。显然,B 正在丢弃具有错误 MAC 地址的帧。
有趣的是,我完全相同的设置在另一个基础设施(主要是不同的硬件)中工作。
我该怎么做才能修复这个设置?
答案1
您应该收到 ICMP 重定向消息,而不是您期望的 ICMP 回显答复。
主机 192.168.0.110 向其默认网关 192.168.0.1 发送 ICMP 回显请求,然后该网关应将数据包重定向到 192.168.0.112 以到达子网 172.20.0.0/16。在这种情况下,网关将使用 ICMP 重定向进行响应(因为将 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 子网时将不会联系默认网关。