Проброс портов с помощью 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
, нам ответит устройство находящееся в локальной сети. Вот и все.