Диагностика

DNAT угоняет :443: конфигурация верна, а порт мёртв

Осколочные nat-правила уводят трафик до того, как он дойдёт до сервиса. Сравнение сертификата снаружи и с localhost вскрывает перехват мгновенно.

6 мин чтения

Симптом

Входной сервер не применяет свою конфигурацию, сколько бы её ни редактировали: снаружи порт :443 «ведёт себя чужим», соединение не поднимается. Конфигурация на сервере при этом объективно корректна. Тупик: плумбинг здоров, а трафика нет.

Причина: ядро уводит трафик до сервиса

На сервере остались осколочные правила iptables в таблице nat от прошлой роли «прозрачный форвардер»:

PREROUTING -d <IP-сервера> --dport 443 -j DNAT --to <чужой-сервер>:443
+ MASQUERADE под них

Входящий трафик на порт молча уводится ядром на другой сервер ещё до того, как дойдёт до локального сервиса. Конфигурация локального сервиса полностью исправна — поэтому её правки ни на что не влияют.

Диагностическое золото — расхождение «снаружи ≠ с localhost» на одном порту. Reality/TLS маскируется под конкретный сайт, поэтому сертификат выдаёт подмену:

openssl s_client -connect <IP>:443 -servername <ожидаемый-SNI> </dev/null | openssl x509 -noout -subject

Снаружи возвращается сертификат чужого сервиса — того, куда уводит DNAT. А с самого сервера (-connect 127.0.0.1:443) — правильный: DNAT-правило с привязкой к внешнему интерфейсу не срабатывает для loopback-трафика, отсюда иллюзия «изнутри всё верно».

Решение

Вывод. Когда «конфигурация правильная, но не работает», подозревайте перехват на слое ниже приложения: ядро (DNAT, redirect, policy-routing) способно молча увести трафик мимо сервиса, и приложение об этом не узнает. Сравнение поведения снаружи и с localhost на одном порту мгновенно вскрывает сетевой перехват, а проверка идентичности по сертификату — быстрый способ поймать подмену назначения.

Как подключиться за 2 минуты
Частые вопросы

Частые вопросы

Почему конфигурация сервера верна, а порт 443 всё равно не работает?
На сервере остались осколочные iptables-правила DNAT от прошлой роли «прозрачный форвардер» — ядро молча уводит входящий трафик на другой сервер ещё до того, как он дойдёт до локального сервиса.
Как быстро обнаружить такой перехват трафика на уровне ядра?
По расхождению «снаружи ≠ с localhost»: сравнить сертификат через openssl s_client снаружи и на 127.0.0.1 — снаружи вернётся чужой сертификат, с localhost — правильный.
Почему проверка с самого сервера показывает, что всё в порядке?
DNAT-правило привязано к внешнему интерфейсу и не срабатывает для loopback-трафика, поэтому изнутри картина верная, а снаружи трафик подменяется.
Что делать с найденными осколочными правилами DNAT?
Проверить nat-таблицу командой iptables -t nat -S | grep DNAT и удалить осколочные правила точечно, не трогая docker-managed MASQUERADE.
Когда стоит подозревать перехват на сети, а не ошибку в конфиге?
Когда конфигурация объективно правильная, но не работает, — тогда вероятен перехват на уровне ниже приложения: DNAT, redirect или policy-routing ядра.
Похожее

Ещё в базе знаний

Подключите рабочий VPN

Инструкции базы знаний написаны под ключи VPN PRO: ключ выдаёт Telegram-бот за минуту, работоспособность гарантируем. Промокод VPN10 — 10 дней бесплатно, без карты.

Промокод VPN10 — 10 дней бесплатно · до 31 августа · передавайте друзьям