我有以下设置:
Box1 [服务器]:
ip为eth0,192.168.2.18
位于内部网络中,webserver在端口80上运行。
Box2 [网关]:
eth0 带有 ip gw.gw.gw.gw
,某些端口暴露给互联网,例如端口号 3000。eth1
带有 ip,192.168.2.3
用于内部网络
Box3 [客户端]:
带 ip 的 eth0cl.cl.cl.cl
目标是将流量从 重定向gw.gw.gw.gw:3000
到192.168.2.18:80
。看起来简单的 DNAT 规则可以工作,但问题是网关gw.gw.gw.gw
被其他防火墙(黑盒)过滤,因此只有已建立的会话才会被黑盒的输出链接受。换句话说,如果我正在监听 的端口 4000 cl.cl.cl.cl
,我将无法cl.cl.cl.cl:4000
从连接到gw.gw.gw.gw
,但另一种方式是可行的,即我可以从 连接cl.cl.cl.cl
到gw.gw.gw.gw:3000
。目前,我在网关中有以下规则:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 3000 -j DNAT --to 192.168.2.18:80
iptables -A POSTROUTING -t nat -j MASQUERADE -o eth0
iptables -A FORWARD -p tcp -i eth0 -o eth1 -d 192.168.2.18 --dport 3000 -j ACCEPT
sysctl -w net.ipv4.conf.eth0.forwarding=1 #to enable forwarding by kernel.
tcpdump
显示网关正在向客户端发送响应数据包,但客户端无法接收任何数据包。我最好的猜测是,这与 iptables 中的会话丢失有关,但我不是 iptables 规则方面的专家。有什么线索可以说明我可能遗漏了什么吗?
答案1
我认为以下几行应该可以解决问题:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.18:80
iptables -A FORWARD -p tcp -i eth0 -o eth1 -d 192.168.2.18 --dport 80 -j ACCEPT