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

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

我需要更改来自本地进程的所有 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 中完成此任务?也许还有其他工具可以完成这项工作?

答案1

我想不出有什么工具可以立即实现这一点。这种情况非常罕见,因为如果仅更改端口,则无法创建正确的双向 NAT 映射。您真的只需要单向流量吗?

但是,您始终可以编写自己的 netfilter 模块(这并不难)并以任何您想要的方式更改数据包头。

答案2

你可以通过以下方式实现转移插座,尽管我从未将它用于这个特殊目的,也没有在现代内核上尝试过它。

这是项目页面用于 Linux 端口。基本上,这会向 iptables 添加一项工作,使您可以将数据包重定向到用户空间并进行修改,然后再将它们发送回线路上(或完全丢弃它们)。

相关内容