更改源自本地进程的传出数据包的端口号

我需要更改所有源自本地进程的UDP数据包的传出端口号。 例如:

local machine udp dest:192.168.10.1/255.255.255.0 port 2222 

应该成为(在离开本地机器之前):

 udp dest:192.168.10.1/255.255.255.0 port 3333 

我试过的是这个iptables规则:

 iptables -t nat -A OUTPUT -d 192.168.10.1/255.255.255.0 -p udp --dport 2222 -j DNAT --to-destination :3333 

但是,它也会更改目标IP地址。 从serverfault的另一个问题,我看到根据netfilter文档( http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.txt ,第6.3.7节),iptables不能做到这一点。

我的问题是如何在Linux中完成这个任务? 也许还有另一个工具可以做这个工作?

我想不出任何可以做到这一点的工具。 这是非常罕见的情况,因为如果您只更改端口,则无法创build正确的双向NAT映射。 你真的只需要单向的stream量吗?

不过,你总是可以编写自己的netfilter模块(这并不困难),并以任何你想要的方式改变数据包头。

你也许可以用Divert Sockets来完成这个任务,尽pipe我从来没有用过这个特殊的目的,也没有在现代内核上尝试过。

这是linux端口的项目页面 。 基本上,这增加了一个iptables的工作,允许您重新定向数据包到用户空间,并修改之前发送回线(或完全丢弃)。