Проброс портов с помощью iptables

При поиске готовой информации о том как пробросить порты с помощью iptables сразу находится куча однотипных решений. Но все решения рассчитаны на то, что порты пробрасываются на шлюзе сети. Такой проброс плох тем, что на внутреннее устройство, на которое пробрасывается порт, пакет приходит с неизмененным source IP-адресом. Устройство отвечает согласно стандартной таблице маршрутизации - через шлюз.

Далее приведен пример из однотипного множества, но с учетом того, что сервер, на котором пробрасывается порт не является шлюзом.

non-local client ----> server(not gw) -----> local client
   8.8.8.8          1.2.3.4 | 192.168.1.15    192.168.1.2 

Имеется сервер с 2-мя сетевыми интерфейсами eth0 (1.2.3.4) и eth1 (192.168.1.15). Пробрасывается внешний порт 8080 на внутреннее устройство (192.168.1.2) на порт 80.

Первое правило отрабатывает на входящий трафик на порт 8080 и меняет destination IP на IP адрес устройства и нужный порт (80):

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80

Второе правило заменяет source IP на внутренний адрес сервера, чтобы ответы приходили на него:

iptables -t nat -A POSTROUTING -o eth1 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.15

Не забыть включить ip_forward:

echo 1 > /proc/sys/net/ipv4/ip_forward

Теперь, если зайти на 1.2.3.4:8080, нам ответит устройство находящееся в локальной сети. Вот и все.

comments powered by Disqus