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

iptables: перенаправить порт на сервер, привязанный к определенному IP

В системе Linux с несколькими IP-адресами у меня возникла проблема с перенаправлением привилегированного порта на непривилегированный порт, на котором слушает сервер, привязанный к определенному IP-адресу.

Добавьте это правило в iptables для перенаправления входящего трафика с порта 80 на порт 8080:

iptables --table nat --append PREROUTING --protocol tcp --dport 80 \
    --jump REDIRECT --to-ports 8080

Затем запустите netcat для прослушивания всех IP-адресов, порт 8080:

nc -l 0.0.0.0 8080

Затем отправьте пакет на порт 80 с другой машины:

echo foo | nc 10.0.0.39:80
echo foo | nc 10.0.0.39:8080

Оба этих пакета получены. Теперь о странном. Когда вы заставляете netcat прослушивать определенный IP-адрес, он не видит перенаправленный пакет.

nc -l 10.0.0.39 8080

Теперь пакет, отправленный на порт 80, не получен; только пакет на порт 8080. Разница, очевидно, заключается в том, как сервер связывает порт прослушивания - 0.0.0.0 работает, а конкретный IP - нет.

Проблема не в netcat, потому что nginx (где я использую vhosting на основе IP) имеет ту же проблему.

Я попытался расширить правило iptables, указав, что адрес назначения - 10.0.0.39, но это все равно не работает.

Перенаправить или скрыть объект от ваших клиентских приложений? Если вам нужна прозрачность, может сработать что-то вроде этого

iptables -A PREROUTING -t nat -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.39:8080
iptables -A OUTPUT -t nat -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.39:8080