Туннель поднят, сайты IPv4 загружаются, а одно имя хоста заканчивается тайм-аутом. Немедленный вывод — VPN сломан или учётные данные неверны, и обычно ни то, ни другое не правда. Имя вернуло и адрес IPv4, и адрес IPv6, приложение выбрало один, и только у одного из этих кандидатов был рабочий путь. Решение о выборе принял клиент; туннель просто не покрывал то, что он выбрал.

Выбор — не обещание покрытия

Выбор адреса по умолчанию, описанный в RFC 6724, определяет, какую пару источника и назначения хост предпочитает, когда доступно несколько. Happy Eyeballs добавляет поверх стратегию соединения: он начинает попытки в обоих семействах и оставляет то, что ответит первым, чтобы пользователь не ждал истечения тайм-аута сломанного семейства.

Ни один из механизмов не создаёт маршрут. Если ваш туннель несёт только IPv4, кандидат AAAA остаётся законным пунктом назначения, который клиент может попробовать, и сбой проявляется как медленная загрузка, а не как ошибка, потому что браузер откатился. Пользователь сообщает о медленном сайте, а не о сломанном, и тикет поддержки наследует эту неопределённость. Воспроизведите это с фиксированным семейством — и отчёт станет конкретным.

Именно из-за этого отката симптом несогласован между приложениями. Браузер скрывает задержку; клиент командной строки с фиксированным семейством сразу показывает реальный сбой.

Определите, какое семейство запрос действительно использовал

Начните с имени, а не с туннеля. Запросите оба типа записей и запишите, что вернулось:

dig +short A example.com
dig +short AAAA example.com
curl -4 -sS -o /dev/null -w '%{http_code}\n' https://example.com
curl -6 -sS -o /dev/null -w '%{http_code}\n' https://example.com

Если запрос v4 успешен, а запрос v6 завершается неудачей, вы воспроизвели проблему в отлаживаемой форме. Если оба успешны из оболочки, а браузер всё равно терпит неудачу, посмотрите на собственный резолвер приложения или кэшированный ответ, прежде чем трогать туннель.

Держите семейство и назначение в своих заметках. Тикет «сайт не загружается через VPN» никто не сможет проверить, а тикет «AAAA не работает, A работает» указывает на конкретный маршрут.

Проверьте маршрут для этого семейства

Для сбойного семейства спросите ядро, какой путь оно использует, и сравните его с настроенными адресами туннеля. В Linux ip -6 route get для пункта назначения показывает интерфейс и источник, которые были бы выбраны.

Затем проверьте сам туннель. Пиры WireGuard несут список разрешённых IP, а запись для 0.0.0.0/0 ничего не говорит об IPv6. Если в списке пира нет префикса IPv6, у клиента нет причин отправлять трафик AAAA в туннель, и пакет уходит туда, куда хост отправил бы его иначе.

Правила брандмауэра и политика NAT заслуживают такой же проверки для каждого семейства. Правило, написанное для IPv4, не покрывает IPv6 ни на одной платформе, и это самая частая причина, почему одно семейство работает, а другое нет.

Не отключайте IPv6, чтобы упростить скриншот

Отключение IPv6 во всей системе уберёт симптом и оставит вас без диагностики. Оно также ломает любое назначение, которое работает только по IPv6, и скрывает ту же ошибку для следующего приложения. Если машине действительно не следует использовать IPv6, это осознанная политика с владельцем и тестом. Отключение во время инцидента — ни то, ни другое.

Решите, что клиент должен делать с семейством, и настройте это явно: проведите его через туннель или заблокируйте поддерживаемым способом, чтобы выбор никогда не предлагал недостижимого кандидата. Оба варианта — законные проекты. Глобальное отключение — ни один из них, потому что это вообще не проект.

Что указать в тикете

Запишите четыре вещи: имя хоста, семейство, которое не сработало, маршрут, выбранный ядром, и результат запроса, специфичного для семейства. Этого набора достаточно, чтобы кто-то другой воспроизвёл сбой, не гадая, какой из двух путей вы имели в виду.

Правила выбора адресов RFC 6724 объясняют, почему клиент предпочёл именно этого кандидата, а RFC 8305 объясняет гоночное поведение, скрывшее задержку. Ни одно из них не проложит маршрут за вас, и именно это должен сделать туннель.

Похожие статьи