Назад | Перейти на главную страницу

Перенаправление порта iptables не работает для localhost

Я хочу перенаправить весь трафик с порта 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

Помните, что вы отправляете с локального хоста. Итак, вам нужно перенаправить выходной пакет.