У меня 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
.