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

iptables dnat не работает для https

У меня http-сервер прослушивает порты 8080 (http) и 8081 (https) на 127.0.0.1

У меня есть эти правила iptables для перенаправления с / на $external_ip:

iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 80  -j DNAT --to-destination 127.0.0.1:8080
iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 443 -j DNAT --to-destination 127.0.0.1:8081

Сервер - это экземпляр Tomcat, использующий библиотеки apache APR для обработки https-соединений.

Что-то мне не хватает?

ОБНОВЛЕНИЕ: Цепочки для таблицы NAT: $ iptables -t nat -L -n -v

Chain PREROUTING (policy ACCEPT 1111 packets, 69838 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   14   724 REDIRECT   tcp  --  eno1   *       0.0.0.0/0            101.0.105.178        tcp dpt:80 redir ports 8080
    6   360 REDIRECT   tcp  --  eno1   *       0.0.0.0/0            101.0.105.178        tcp dpt:443 redir ports 8081

Chain INPUT (policy ACCEPT 1064 packets, 66008 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 9 packets, 596 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 9 packets, 596 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Обходной путь (вроде, как бы, что-то вроде)

Ни iptables, ни Tomcat, ни Apache APR не любят прослушивание через интерфейс обратной петли.

Я наконец заставил его работать, используя интерфейс, отличный от вот (127.0.0.1)

iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 80  -j DNAT --to-destination $local_ip:8080
iptables -t nat -A PREROUTING -i eno1 -p tcp -d $external_ip --dport 443 -j DNAT --to-destination $local_ip:8081

В моем случае я использовал фиктивный интерфейс (модуль Linux: манекен), поскольку я хотел, чтобы Tomcat "слушал" с "частного" IP.

Я публикую это как ответ для будущих людей, у которых будет такая же проблема, как и у меня, но я не помечаю этот ответ как принятый, поскольку я не решаю проблему использования обратной петли и не объясняю, почему он работает. хорошо с http но не с https.

Я вижу, что ваши правила верны. Возможность блокировки трафика вашим брандмауэром была проверена в ваших комментариях. Правило NAT было выполнено несколько раз, как указано в счетчике байтов и пакетов, показанном в выходных данных iptables -t nat -L -n -v.

Вам нужно убедиться, что вы можете получить доступ к порту 443 локально, и вы можете проверить, что ваш веб-сервер прослушивает этот порт, используя netstat -lnp.