在我的 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 - 36000
src 和 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。
问题:
RAW 表表明没有
CONNTRACK
。但是,上述行为表明App A -> Srv X
源端口和目标端口为的第一个数据包36000 - 36000
正在被某个模块跟踪。因此,来自的响应Srv X -> App A
似乎没有经过 DNAT。我该如何避免这种情况CONNTRACK
?如何确保来自 Srv X(目标端口为 36000)的每个传入数据包始终经过 DNAT?
提前致谢,电传
答案1
通过观察Netfilter 文档,据说“连接跟踪是 NAT 的基础”,因此如果不启用连接跟踪。