已建立会话的 iptables 伪装规则

已建立会话的 iptables 伪装规则

我有以下设置:

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:3000192.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.clgw.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

相关内容