是否可以映射1:1端口范围iptable DNAT规则

时间:2015-10-10 08:57:16

标签: iptables nat

我希望以下规则转发tcp数据包 从127.0.0.1:32770172.17.0.36:1000 并将数据包从127.0.0.1:32771转发到172.17.0.36:10001 并将数据包从127.0.0.1:32772转发到172.17.0.36:10002

iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 32770:32771 -j DNAT --to-destination 172.17.0.36:1000-1002

但目前它可以将127.0.0.1:32770-32771的所有数据包转发到172.17.0.36:1000-1002

中的任何一个

1 个答案:

答案 0 :(得分:3)

为了找到这个,我付出了很多努力,最后找到了一个绝对可行的解决方案,在您的情况下,命令为:

iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 32770:32771 -j DNAT --to-destination 172.17.0.36:1000-1002/32770

此处,32770是基本端口,并且映射将从此处开始,例如:

32770 -> 172.17.0.36:1000
32771 -> 172.17.0.36:1001

现在,让我们说输入范围和输出范围不相等:

iptables -t nat -I PREROUTING -p tcp --dport 30000:30199 -j DNAT --to 10.1.1.1:40000-40099/30000

在上述情况下,DNAT映射将像这样四舍五入:

30000 -> 10.1.1.1:40000
30001 -> 10.1.1.1:40001
...
30099 -> 10.1.1.1:40099
30100 -> 10.1.1.1:40000
30101 -> 10.1.1.1:40001
...
30199 -> 10.1.1.1:40099

2018年增加了对DNAT中基于基本端口的1:1端口映射的支持。 请参考以下链接: http://git.netfilter.org/iptables/commit/?id=36976c4b54061b0147d56892ac9d402dae3069df

我已经看到它在Linux内核4.19及更高版本中起作用。