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


46
2017-12-11 11:41


Источник


В этом разделе представлен более общий ответ: serverfault.com/questions/380447/iptables-preroute-localhost - Jeroen
Может ли кто-нибудь с rep добавить обратную косую черту в команду до разрыва строки? - Ciro Santilli 新疆改造中心 六四事件 法轮功


Ответы:


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

61
2017-12-11 12:34



Нет необходимости в первом правиле. Локально созданные пакеты не проходят через цепочку PREROUTING. - Khaled
Я добавил исходное правило для компиляции, так как он хочет перенаправить внешний трафик. Правило не нуждается в источнике / адресате, если они говорят только, чтобы принять все IP-адреса - Andy
Я ничего не понял, когда ответил. - Andy
Привет Энди, я все еще получаю Подключение к server.com | <ip> |: 443 ... не удалось: соединение отклонено. - Chris
Привет, Крис, это подключение к localhost | 127.0.0.1 | 443 или это домен? Если последний и вы используете его с вашего сервера, у вас может возникнуть проблема с внутренней маршрутизацией. Вы можете дважды проверить, попробовав wget server.com:8080 (хотя я предполагаю, что причиной того, что вы перенаправляете порты, является то, что он заблокирован извне?). У моей собственной VPC есть эта проблема, однако вы можете установить обходной путь, определив домен как 127.0.0.1 в файле / etc / hosts. - Andy


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

 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

Без этой настройки ядра это не сработает.


6
2018-06-16 02:24



Это тоже сработает. Я думаю, что все это в iptables является чище. - quadruplebucky
Фактически, параметр ядра не задан, если пункт назначения находится на другом компьютере, выстроить виртуальную машину или удаленную машину.
это не если у вас есть два правила, как предложил Энди выше. - quadruplebucky
Извините, я говорил о случае пересылки на другую машину, где DNAT не работает. Я рассматривал этот ответ для решения проблемы, когда я пытался переслать что-то, что считало, что он подключается к локальному хосту с помощью утилизатора на той же машине. например, запуск сервера имен в контейнере для локальных запросов.
На самом деле это, по-видимому, «зависит от версии ядра> = 3.6. - quadruplebucky


Как насчет этого?

iptables -t nat -A OUTPUT -d 127.0.0.1   -p tcp --dport 443 -j REDIRECT - to-port 8080


2
2017-12-11 17:28





Вы сказали, что получаете В соединении отказано ошибка. Это означает, что локальный процесс не прослушивается на порту, к которому вы пытаетесь подключиться! Чтобы проверить процессы прослушивания, используйте команду:

$ 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
2017-12-11 11:44



Спасибо за ответ. Процесс прослушивает порт 8080. Поэтому я хочу перенаправить весь трафик на этот порт. - Chris
Вы уверены, что процесс также прослушивает интерфейс цикла? Он может слушать только ваш физический интерфейс. Как правило, вашему веб-серверу нужно будет слушать 0.0.0.0, а не, скажем, 192.168.10.0 - MrMajestyk