Перенаправление порта 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 для перенаправления локального трафика тоже?

5 ответов

PREROUTING не используется интерфейсом обратной связи, вам также необходимо добавить правило 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

Для перенаправления пакетов с локального хоста на другую машину действует правило:

 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

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

Я также нашел эту проблему. После всех этих способов он все еще не работал.

  1. echo "1" > /proc/sys/net/ipv4/ip_forward
  2. используйте «OUTPUT» в iptables для перенаправления локального хоста

Наконец-то я нашел причину, почему это не сработало! Потому что REDIRECT в iptables всегда REDIRECT на localhost, а не на eth0 или другое сетевое устройство. Таким образом, запрос будет перенаправлен на локальный хост, если ваш сервер привязывает eth0, получить его невозможно.

ВЫ ТАКЖЕ ДОЛЖНЫ ДОБАВИТЬ ЭТУ СТРОКУ:

      iptables -t nat -A OUTPUT -p tcp -d 0.0.0.0 --dport 443 -j DNAT --to-destination 0.0.0.0:8080
Другие вопросы по тегам