如何对本地数据包进行 DNAT

如何对本地数据包进行 DNAT

我有一个程序将 UDP 数据包发送到 192.168.0.2:12345,在端口 54321 接收数据包,它使用 192.168.0.1 IP 地址。我希望它将数据包发送到具有相同端口的 10.10.10.10,因为此程序和远程服务器仅接受 12345 和 54321。这是拓扑: 在此处输入图片描述

首先,我使用 iptables 预路由:

iptables -t nat -A PREROUTING -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345

但它不起作用,我使用LOG,发现nat从未发生过(192.168.0.1和192.168.0.2不需要路由?):

iptables -t nat -A PREROUTING -s 192.168.0.1 -p udp --dport 12345 -j LOG

然后我发现这些数据包可以在 INPUT 链中找到:

iptables -A INPUT -s 192.168.0.1 -p udp --dport 12345 -j LOG

如果我只能在输入中看到这些数据包,有没有办法使用 DNAT?

顺便说一句,我可以使用 socat 重定向这些数据包,但无法在服务器端锁定 12345 和 54321 上的端口:

socat UDP4-RECVFROM:192.168.0.1,fork UDP4-SENDTO:10.10.10.10:12345
socat UDP4-RECVFROM:10.10.10.10,fork UDP4-SENDTO:192.168.0.1:54321

我这边进行了一些更新,我现在可以使用 phydev 来 nat 数据包:

iptables -t nat -A PREROUTING -m physdev --physdev-in tap0 -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345

从 eth0 的 tcpdump 中,我可以看到从 192.168.0.1 到 10.10.10.10 的数据包:(192.168.0.1 不能在我的网络中使用)

tcpdump -n -i eth0 host 10.10.10.10 
12:36:22.250548 IP 192.168.0.1.54321 > 10.10.10.10.12345: UDP, length 16

但是,我看不到来自 10.10.10.10 服务器的这些数据包...然后我在远程服务器上运行 tcpdump,我可以看到这些数据包:

21:55:44.980988 IP 192.168.0.1.54321 > 10.10.10.10.12345: UDP, length 16

但是 192.168.0.1 在我的实验室网络中无法使用,它被丢弃了。

所以剩下的事情就变成:如何对一个数据包进行 DNAT,然后对同一个数据包进行 SNAT......

答案1

我通过运行命令修复了这个问题

conntrack -F

在我所有的 iptables 规则之后。无需使用 --phydev,只需使用以下两个规则:

iptables -t nat -A PREROUTING -s 192.168.0.1 -d 192.168.0.2 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345
iptables -t nat -A POSTROUTING -d 10.10.10.10/24 -o eth0 -j SNAT --to-source 10.10.10.5

答案2

要对本地生成的数据包执行 DNAT,应该使用 NAT 表的 OUTPUT 链,而不是 PREROUTING 链。

你的规则可能看起来应该是:

iptables -t nat -A OUTPUT -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345

相关内容