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

che*_*hun 1 iptables nat

我想要以下规则转发 tcp 数据包从127.0.0.1:32770172.17.0.36:1000 和转发数据包从127.0.0.1:32771172.17.0.36:10001 和转发数据包从127.0.0.1:32772172.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
Run Code Online (Sandbox Code Playgroud)

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

小智 5

我花了很多功夫才找到这个,终于找到了一个绝对有效的解决方案,您的情况下的命令是:

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
Run Code Online (Sandbox Code Playgroud)

这里,32770是基端口,映射将从那里开始,例如:

32770 -> 172.17.0.36:1000
32771 -> 172.17.0.36:1001
Run Code Online (Sandbox Code Playgroud)

现在,假设传入范围和传出范围不相等:

iptables -t nat -I PREROUTING -p tcp --dport 30000:30199 -j DNAT --to 10.1.1.1:40000-40099/30000
Run Code Online (Sandbox Code Playgroud)

在上述情况下,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
Run Code Online (Sandbox Code Playgroud)

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

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