Перенаправить весь входящий и исходящий трафик с порта на определенный ip

Я запускаю сервер узлов внутри док-контейнера на порту 8080 и я могу получить к нему доступ через 172.17.0.2:8080 (ip контейнера), теперь я хочу получить доступ к этому ip с localhost:9099 .

Я попытался с помощью iptables перенаправить этот трафик, приходящий на localhost:9099 на 172.17.0.2:8080 но все меры напрасны.

Это команда, которую я использовал. Пожалуйста, поправьте меня, где я иду не так. Заранее спасибо.

 sudo iptables -t nat -A PREROUTING -p tcp --dport 9099 -j DNAT --to-destination 172.17.0.2:8080 

Я получил помощь от этого ответа, но не работал.

Есть несколько проблем с вашей попыткой:

  • использование localhost означает, что соединения инициируются с хоста, а не с другого хоста. Таким образом, для этого требуется цепочка OUTPUT , а не цепочка PREROUTING поскольку маршрутизация изначально не была задействована.
  • IP-адрес источника, который будет 127.0.0.1 также должен быть изменен после изменения пункта назначения. Это требует дополнительного правила POSTROUTING . Необязательное -m conntrack --ctstate DNAT проверит, что первый OUTPUT действительно совпадал первым, и это не какая-то попытка подделки.
  • По крайней мере, в Linux 127.0.0.0/8 обрабатывается специально в стеке маршрутизации, и пакет будет отброшен до срабатывания правила POSTROUTING . Чтобы удалить специальную обработку и разрешить маршрутизацию «снаружи» блока 127.0.0.0/8 , интерфейс, на котором произойдет redirect, должен иметь флаг route_localnet установленный в 1, или ничего из вышеперечисленного будет недостаточно.

Поскольку интерфейс не известен из Вопроса, имя интерфейса извлекается из маршрута и помещается в переменную. Приспособьте это при необходимости. Вы также можете использовать псевдоинтерфейс all чтобы установить флаг глобально.

Таким образом, в итоге это сводится к (как корень или с помощью sudo ):

 iptables -t nat -A OUTPUT -p tcp --dport 9099 -j DNAT --to-destination 172.17.0.2:8080 iptables -t nat -A POSTROUTING -s 127.0.0.0/8 -d 172.17.0.2 -m conntrack --ctstate DNAT -j MASQUERADE interface=$(ip -o route get 172.17.0.2 | grep -o 'dev [^ ][^ ]*'|sed 's/^dev //') echo 1 > /proc/sys/net/ipv4/conf/$(interface)/route_localnet 

После того, как все это сказано, вы должны попытаться использовать адрес не 127.0.0.0/8 , все еще локальный для хоста. Это может упростить вещи, не требуя route_localnet (и, возможно, иногда не требуя дополнительного правила POSTROUTING ).