У меня следующая установка:
Приложение А - делает HTTP-запросы к некоторому API, работающему на http: // локальный: 8090.
Приложение B - перехватывает HTTP-запрос от A, прокси, работающего на http: // локальный: 8080.
Можно ли принудительно направить HTTP-трафик из одного приложения в другое приложение, работающее на том же хосте?
Я пробовал что-то подобное:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080
Но кажется, что он работает, только если местом назначения HTTP-запроса является какой-то внешний API, он не работает, если сервер ресурсов API развернут также на локальном хосте (я подозреваю, что это связано с --dport 80). Я не очень разбираюсь в iptables, но возможно ли такое? Если да, то как я могу этого добиться?
Правило iptables может работать, но вы необходимо активировать маршрутизацию на машине, чтобы это работало с локально доставленными пакетами. Также имейте в виду, что на новых машинах localhost часто преобразуется в loopback IPv6 (:: 1), поэтому вам потребуются соответствующие правила ip6tables. Первоначальный сбой подключения на IPv6 может быть замаскирован и вернуться, чтобы преследовать вас позже, с помощью автоматического перехода на IPv4 в вашем тестовом клиенте (например, это то, что делает curl, если вы не укажете -6 в командной строке)
Если пакеты приходят извне, вам нужно установить такое же правило в цепочке PREROUTING.
# Activate forwarding
# Note: These forward settings are not reboot persistent
# Note: Putting your machine in router mode resets a lot of IP stack parameters
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv4.ip_forward=1