我希望以下规则转发tcp数据包
从127.0.0.1:32770
到172.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
答案 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及更高版本中起作用。