Intereting Posts
Как извлечь одну строку, за которой следует ряд строк Как включить автозапуск YouTube с помощью youtube-dl & mpv? Разница между вызовом openssl s_client в cron и терминале Intel Ethernet Connection I219-V не работает под Linux на ноутбуке ASUSPRO B, сообщает драйвер e1000e: «Контрольная сумма NVM не действительна» Как запустить Windows с помощью виртуализации GPU? как извлечь значение из строки в xml с помощью grep или awk в Linux Получу ли я критические обновления безопасности, если я заблокирую CentOS yum для конкретной версии репо? найти отсутствует результат – как это возможно? Установка пакета с расширением SDP & SDX Sed для печати только первого соответствия шаблону линии Пользовательская Launcher не появляется в Slingshot (eOS Freya) Список ВСЕХ Ansible переменных для хоста или группы с помощью специальной команды? Как копировать / вставлять данные в буфер обмена Windows и из буфера обмена Windows в буфер обмена OpenSuse с помощью VNC? Запустите 64-битное приложение на 32-битной системе (Ubuntu) Как сделать sda1 больше / использовать файлы загрузки по умолчанию в sdb1

Перенаправить весь входящий и исходящий трафик с порта на определенный 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 ).