Назад | Перейти на главную страницу

правила маскировки iptables для установленного сеанса

У меня следующая установка:

Box1 [сервер]:
eth0 с ip 192.168.2.18 находится во внутренней сети с веб-сервером, работающим на порту 80.

Box2 [шлюз]:
eth0 с ip gw.gw.gw.gw с некоторым портом, доступным в Интернет, например номер порта 3000.
eth1 с ip 192.168.2.3 для внутренней сети

Box3 [клиент]:
eth0 с ip cl.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. Есть какие-нибудь подсказки относительно того, что мне здесь не хватает?

Я думаю, что следующие строки должны помочь:

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