Linux iptables 对无连接跟踪的传入数据包进行 DNAT(无状态)

Linux iptables 对无连接跟踪的传入数据包进行 DNAT(无状态)

在我的 Linux 机器上10.20.1.1,我有两个 UDP 应用程序分别绑定在端口46000 (App A)和上36000(App B)。这两个应用程序分别与绑定为10.10.1.1:36000 (Srv X)和的两个 UDP 服务器进行通信10.10.1.2:36000 (Srv Y)

当我发送数据包时,我需要始终使用 UDP src 端口作为 36000。线路上的数据包将始终使用36000 - 36000src 和 dst 端口。

我的 iptables 规则如下。我的目的是让DNAT来自 Srv X 的传入数据包从端口进入36000 to 46000,以便应用程序 A 接收它。

*nat
-A PREROUTING -s 10.10.1.1/32 -p udp --dport 36000 -j DNAT --to-destination :46000

*raw
-A PREROUTING -p udp --dport 36000 -j CT --notrack
-A PREROUTING -p udp -j ACCEPT
-A OUTPUT -p udp --dport 36000 -j CT --notrack
-A OUTPUT -p udp -j ACCEPT

*filter

-A INPUT -p udp -m udp --dport 36000 -j ACCEPT --> rule 1
-A INPUT -p udp -m udp --dport 46000 -j ACCEPT --> rule 2
-A OUTPUT -p udp -m udp --dport 36000 -j ACCEPT -> rule 3

当我从 发送数据包时,App A to Srv X一切正常。 没有 conntrack 条目,/proc/net/ip_conntrack并且 OUT 数据包匹配rule 3。 当响应来自 时Srv X to App A,数据包遍历原始表,但它DOES NOT经过DNAT并直接跳转到过滤表规则 1。 这意味着 Srv X 响应到达我的盒子,但它转到应用程序 B 而不是应用程序 A。

问题

  1. RAW 表表明没有CONNTRACK。但是,上述行为表明App A -> Srv X源端口和目标端口为的第一个数据包36000 - 36000正在被某个模块跟踪。因此,来自的响应Srv X -> App A似乎没有经过 DNAT。我该如何避免这种情况CONNTRACK

  2. 如何确保来自 Srv X(目标端口为 36000)的每个传入数据包始终经过 DNAT?

提前致谢,电传

答案1

通过观察Netfilter 文档,据说“连接跟踪是 NAT 的基础”,因此如果不启用连接跟踪

相关内容