Я хочу перенаправить весь трафик с порта 443 на внутренний порт 8080. Я использую этот конфиг для iptables:
iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
--dport 443 -j REDIRECT --to-ports 8080
Это работает для всех внешних клиентов. Но если я пытаюсь получить доступ к порту 443 с той же машины, я получаю сообщение об ошибке в соединении.
wget https://localhost
Как я могу расширить правило iptables для перенаправления локального трафика?
PREROUTING не используется интерфейсом loopback, вам также необходимо добавить правило OUTPUT:
iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080
Чтобы перенаправить пакеты с localhost на другую машину, правило:
iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT --to-destination 10.x.y.z:port
будет работать, НО вам также необходимо включить эту опцию в ядре:
sysctl -w net.ipv4.conf.all.route_localnet=1
Без этой настройки ядра он не будет работать.
Как насчет этого?
iptables -t nat -A ВЫХОД -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-port 8080
Вы сказали, что получаете В соединении отказано ошибка. Это означает, что локальный процесс не прослушивает порт, к которому вы пытаетесь подключиться! Чтобы проверить процессы прослушивания, используйте команду:
$ sudo netstat -lnp | grep 8080
После применения правила у вас должен быть процесс, прослушивающий порт 8080 для подключения.
Похоже, вместо этого у вас должно быть следующее правило:
$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
--dport 443 -j REDIRECT --to-ports 8080
Помните, что вы отправляете с локального хоста. Итак, вам нужно перенаправить выходной пакет.