为什么 iptables 不对同一子网执行 DNAT?

为什么 iptables 不对同一子网执行 DNAT?

我有以下 NAT 设置:

+--------------+       +-----------------------+     +-------------------+
|              |       |                       |     |                   |
|              |       |                       |     |                   |
|    PC 1      |       |    PC 2 (NAT)         |     |     PC 3          |
|  10.0.0.3    +-------+                       +-----+  10.0.0.4         |
|              |       |                       |     |  (NAT 172.24.4.2) |
|              |       |                       |     |                   |
+--------------+       +-----------------------+     +-------------------+

而 PC2 将执行 NAT,以便 10.0.0.4 在预路由期间转换为 172.24.4.2:

-A PREROUTING -d 172.24.4.2/32 -j DNAT --to-destination 10.0.0.4

当我尝试从 PC1 ping 到目标 IP 为 172.24.4.2 的 PC3 时。不知为何,数据包没有为我执行任何 DNAT。

以下是我在 PC3 上捕获的内容:

10:15:41.017632 IP 10.0.0.3 > 172.24.4.2: ICMP echo request, id 8705, seq 0, length 64

如果我将 PC3 IP 更改为不同的子网,它就可以正常工作。

有人知道为什么吗?

答案1

10.0.0.4 将在预路由期间转换为 172.24.4.2

您指定的规则恰恰相反。它应该将172.24.4.2数据包中的目标地址转换为10.0.0.4

这是您应该在 PC2 上面向 PC1 的接口上看到的捕获内容,因为它tcpdump显示了在 TCP 堆栈进行任何处理之前线路上的数据包。

您应该检查面向 PC3 的接口上的捕获。您还需要检查 PC2 上的路由,以确保172.24.4.2地址路由正确。

相关内容