用iptables随机化每个*包的目标端口

有一个程序在服务器端侦听端口3333,并发送和接收数据包到服务器的专用客户端,我想build立一套iptables规则,使每个数据包空中随机端口号。

这是我所做的:

####Client side iptables -t nat -A OUTPUT --dst server.ip.addr -p udp --dport 3333 -j DNAT --to-destination :10000-19999 --random ####Server side iptables -t nat -A PREROUTING --dst server.ip.addr -p udp --match multiport --dport 10000:19999 -j REDIRECT --to-ports 3333 

基本上工作,但DNAT只会随机分配第一个“连接”的数据包,后面的数据包只是使用保存在连接状态表中的端口号,而不会在“连接”存在的时候改变。

然后我尝试禁用连接跟踪:

 ####Client side iptables -t raw -A OUTPUT -p udp --dport 3333 -j NOTRACK 

现在服务器和客户端不能通信,tcpdump在服务器上没有显示任何东西,我想DNAT可能无法连接跟踪工作。

另外我尝试了一些其他的组合,但没有工作。 除了SNAT / DNAT可以修改端口之外,没有任何目标。

只是想知道我想要的是可能的,还是我从一开始就错了。

谢谢你的帮助。

你正在问一些与IP端口系统相同的理念,违反等等。你不能用iptables做你想做的事情。

你能想象一下,如果你的客户端有2个不同的进程试图build立与服务器的这种stream量? 当然这将是一个烂摊子。

如果您需要使您的stream量难以跟踪或类似的东西,我会build议您考虑不同的替代品,但总是基于非破坏性的IPstream量。

由于为你的情况设置一个testing环境相当麻烦,这个答案没有足够的testing。 使用你自己的责任。

我可以想到这些解决scheme:

  1. 创build一个类似守护程序的脚本,不断更新客户端的iptables规则,每秒更换几次端口。
  2. 像1.一样,但使用conntrack -D -p udp --dst $DEST_IP从conntrack-tools重置UDP状态表。
  3. / proc / sys / net / netfilter / nf_conntrack_udp_timeout中使用尽可能低的值,或者更好地使用/ proc / sys / net / netfilter / nf_conntrack_udp_timeout_stream

对我来说, 选项2似乎是对性能和一般连接最不利的。 选项1可能AFAIK没有按预期工作没有3。

只是一个build议,但既然你只需要改变目的端口,而不是一个IP地址,你是否尝试使用REDIRECT而不是DNAT也用于输出链?

例如, iptables -t nat -A OUTPUT --dst server.ip.addr -p udp --dport 3333 -j REDIRECT --to-ports 10000-19999 --random

编辑:

你的问题应该在客户端。 我试图重新使用ncat的情况下(和没有客户端iptables规则):

服务器端的iptables:

 iptables -t nat -A PREROUTING --dst 192.168.5.129 -p udp --match multiport --dport 10000:19999 -j REDIRECT --to-ports 3333 iptables -A FORWARD -m state -p udp -d 192.168.5.129 --dport 3333 --state NEW,ESTABLISHED,RELATED -j ACCEPT 

服务器端ncat:

 ncat -ul 3333 

客户端ncats:

 ncat -p 3333 -u 192.168.5.129 10004 ncat -p 3333 -u 192.168.5.129 10003 

使用这个设置,服务器端的redirect工作。 我相信问题在于iptables的“–random”选项,这可能意味着DNAT为连接随机化端口映射,而不是单个数据包。

您的另一个问题可能是UDP标头中的可选“源端口”字段。 如果设置了,那么防火墙可能仍然能够跟踪你的连接。