У меня следующая установка:
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