是否可以使用 iptables 更改 UDP 数据包的目标端口?
我正在尝试让 SNMP 代理在 1620 而不是 162 上发送陷阱。不幸的是,到目前为止,我只设法更改了源端口:
iptables -t nat -A POSTROUTING -p udp --dport 162 -j SNAT --to :1620
假设您知道要发送到哪台机器:
iptables -t nat -A OUTPUT -p udp --dport 162 -j DNAT --to-destination <dest-ip>:1620
您可以将 162 重定向到 1620
iptables -t nat -A PREROUTING -p UDP --dport 162 -j REDIRECT --to-port 1620
显然不支持这种用法。取自http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.txt:
6.3.7. 更改本地生成连接的目的地
NAT 代码允许您在 OUTPUT 链中插入 DNAT 规则,但这
在 2.4 中并不完全支持(可以,但它需要一个新的
配置选项、一些测试和相当多的编码,所以除非有人签约 Rusty写它,我不希望它很快)。当前的限制是您只能将目的地更改为
本地机器(例如,`j DNAT --to 127.0.0.1'),不能更改为任何其他机器,否则回复将无法正确翻译。
@PiedPiper 是对的。使用 DNAT,您必须指定一个 IP 地址,但我们只想进行端口重定向,因此 -j REDIRECT 在这种情况下可能会起作用。
见http://www.netfilter.org/documentation/HOWTO//NAT-HOWTO-6.html#ss6.2
尝试使用 DNAT,而不是制作 SNAT。源端口会更改,因为 SNAT 意味着 SourceNAT,因此 DNAT 将为您工作。
您可以设置转移规则,然后使用修改后的端口重新注入数据包。
我在 Mac OS X 上做过一段时间,但在 Linux 上的原理相同: http ://blog.dv8.ro/2006/08/using-divert-sockets-on-mac-os-x.html
您基本上需要创建一个非常简单的透明代理。