iptables NAT转发范围

我有两个networking接口,eth0和eth1。 eth0有一个公网ip,eth1有172.16.0.254/24。

我想要做下面的映射:

172.16.0.1:22 -> eth0's public ip:2001 172.16.0.2:22 -> eth0's public ip:2002 172.16.0.3:22 -> eth0's public ip:2003 ... 172.16.0.100:22 -> eth0's public ip:2100 

我读了iptables支持范围,但我不明白它的工作。

我怎样才能做到这一点?

谢谢。

我很肯定你不能用iptables本身做到这一点。 你有IP范围,多端口,但AFAIK你不能映射IP范围到端口范围。

然而,这可以很容易地用一个小的bash脚本来解决:

 for i in $(seq 1 100); do iptables -t nat -A PREROUTING -i eth0 -p tcp -d 172.16.0.$i --dport 22 -j REDIRECT --to-port 2`printf "%03d" $i`; done 

…假设您的服务器(s)打开2001-2100正在监听(绑定)到所有接口(0.0.0.0),并且您正在使用TCP。

如果不是这种情况,您可能需要分别使用DNAT目标和-p udp

如果PREROUTING链中有100条规则是可读性或维护的关注点,则可以创build自己的链,并从PREROUTING跳转到该链。