В системе 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