如何根据使用Shorewall访问哪个公共IP的DNAT到不同的本地IP?

我的服务器有几个公共IP地址,正在运行一大堆私有IP地址的虚拟机。

作为一个例子,我想把232.21.23.23(public)上的端口80,443和8080映射到192.168.122.12(private)。 我已经尝试了几种不同的NAT映射,但似乎没有一个可以工作:

# This doesn't work. DNAT net loc:192.168.122.12 tcp 80,443,8080 - 232.21.23.23 # Neither does this. DNAT $FW loc:192.168.122.12 tcp 80,443,8080 - 232.21.23.23 # Nor this. DNAT net:232.21.23.23 loc:192.168.122.12 tcp 80,443,8080 # I have no idea what I'm doing. DNAT $FW:232.21.23.23 loc:192.168.122.12 tcp 80,443,8080 

任何人都可以指向正确的方向吗?

你的第一条规则是正确的:

 DNAT net loc:192.168.122.12 tcp 80,443,8080 - 232.21.23.23 

所以这个问题必须在别处。 你可以看到用这个创build的底层iptables规则:

 iptables -t nat -nvL net_dnat 

NAT数据包仍然需要遍历FORWARD链并被接受。 尝试添加以下规则以接受在这些端口上的虚拟机stream量:

 ACCEPT net loc:192.168.122.12 tcp 80,443,8080 

作为对以前答案的补充评论,请确保您放置规则的顺序。

例:

假设你像这样configuration你的规则:

DNAT net loc:172.17.20.25 tcp 80 0.0.0.0 DNAT net loc:172.17.20.47 tcp 80 200.xyz

如果你想在端口80上达到172.17.20.47,你总是会在172.17.20.25结束,因为目的地址是默认的0.0.0.0。

所以如果你想172.17.20.47通过公共IP地址200.xyz,你应该修改规则的顺序:

DNAT net loc:172.17.20.47 tcp 80 200.xyz DNAT net loc:172.17.20.25 tcp 80 0.0.0.0

或者修改第一条规则的默认地址。

我希望它有帮助!