我有一个 UDP 应用程序,它从通信的两端发送数据包,其入站源端口号等于目标端口号。文档还指出,如果涉及网络地址端口转换 (NAPT),此应用程序将无法工作。我已验证确实如此,并且 NAT(保留目标和源端口号)可以正常工作,有时称为“静态模式 NAT”。但是,我试图使用 NAPT(有时也称为“隐藏模式 NAT”)使此应用程序工作。我认为这可以使用 iptables 来实现,如下所示,在 Ubuntu 服务器端接收修改后的 UDP 源部件号:
hercules@pjjs12:~$ sudo iptables -t nat -I POSTROUTING 1 -p udp --dport 12000 -j SNAT --to-source :12000
hercules@pjjs12:~$ sudo iptables -t nat -I POSTROUTING 2 -p udp --dport 12001 -j SNAT --to-source :12001
hercules@pjjs12:~$ sudo iptables -t nat -I POSTROUTING 3 -p udp --dport 12002 -j SNAT --to-source :12002
hercules@pjjs12:~$ sudo iptables -t nat -I POSTROUTING 4 -p udp --dport 12003 -j SNAT --to-source :12003
hercules@pjjs12:~$ sudo iptables -t nat -I POSTROUTING 5 -p udp --dport 12004 -j SNAT --to-source :12004
当我运行该应用程序时,tcpdump 显示这不起作用。iptables -L
命令还显示规则显然未被使用:
hercules@pjjs12:~$ sudo iptables -vxnL -t nat --line-numbers
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 SNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:12000 to::12000
2 0 0 SNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:12001 to::12001
3 0 0 SNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:12002 to::12002
4 0 0 SNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:12003 to::12003
5 0 0 SNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:12004 to::12004
hercules@pjjs12:~$ sudo iptables -vxnL --line-numbers
Chain INPUT (policy ACCEPT 542660 packets, 30600115 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 1838 packets, 100767 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 562972 packets, 888057717 bytes)
num pkts bytes target prot opt in out source destination
hercules@pjjs12:~$
我必须承认这是我第一次尝试使用,iptables
所以我完全不确定这是否可行,或者我是否忽略了真正基本的东西。如果对此有所帮助,我将不胜感激。
谢谢,
彼得