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

Прочитайте адрес назначения, прежде чем трогать туннель

Загрузите сайт один раз при включённом туннеле, а затем посмотрите на адрес партнёра, к которому браузер действительно подключился. В Linux, ss -tunp выводит удалённый адрес каждого открытого сокета, а dig +short для того же имени показывает, что вернул резолвер. Держите оба числа перед собой.

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

Запустите поиск второй раз из другой сети и запишите ответ IPv6 вместе с ответом IPv4. Туннелю, который несёт оба семейства, нужно исключение в обоих, иначе браузер тихо откатывается на путь IPv6, которого вы никогда не касались. Запишите адреса и дату туда, куда вы снова посмотрите.

Поставьте один маршрут хоста на клиенте

Предположим, интерфейс называется home-wg, а маршрутизатор LAN стоит на 192.168.1.1. NetworkManager принимает маршрут, чей шлюз — этот маршрутизатор и чья длина префикса покрывает все 32 бита, и ядро предпочитает его, потому что побеждает самый длинный префикс.

nmcli connection modify home-wg +ipv4.routes "198.51.100.20/32 192.168.1.1"
nmcli connection up home-wg
ip route get 198.51.100.20

Шлюз должен быть достижим без туннеля; направить следующий шаг на адрес туннеля — значит разрушить цель, ведь пакет снова войдёт в интерфейс, которого вы пытаетесь избежать. После того как соединение снова поднимется, ip route get для исключения должен выводиться шлюз LAN, а та же команда для публичного резолвера должна по-прежнему выводить устройство туннеля.

В профиле wg-quick нет поля маршрутов, поэтому то же исключение живёт в строке PostUp , которая добавляет маршрут хоста в главную таблицу, делая интерфейс LAN его устройством. Опустите и снова поднимите интерфейс после правки, потому что работающий интерфейс никогда не перечитывает свой файл. Правила fwmark, которые устанавливает wg-quick, направляют только его собственные инкапсулированные пакеты, поэтому обычный трафик браузера по-прежнему идёт по главной таблице и находит ваш /32.

Kill switch — следующая вещь, которая это блокирует

Политика брандмауэра, которая пропускает трафик только на интерфейсе туннеля, отбросит исключение даже тогда, когда маршрут абсолютно правильный. Читайте правила за переключателем, а не доверяйте переключателю, потому что реализующие kill switch правила обычно ограничены именем интерфейса.

Вам нужно узкое разрешение для физического интерфейса и той единственной цели, размещённое до отбрасывания, пока политика по умолчанию остаётся нетронутой. Полная пауза kill switch доказывает мысль, но и оставляет машину открытой, пока вы забудете включить его снова.

Проверьте два направления по отдельности. Запрос на адрес исключения должен успешно проходить, а запрос на несвязанный сайт по-прежнему должен выходить через туннель. Если оба успешны, но второй сообщает домашний адрес, то неверен порядок правил брандмауэра, а не маршрут.

DNS решает, на какой адрес браузер звонит

Когда имя разрешается внутри туннеля, резолвер провайдера может ответить другим адресом, чем локальный. Тогда ваш маршрут применяется к адресу, с которым браузер никогда не связывается, и страница загружается через туннель так, будто ничего не изменилось. Этот сбой выглядит как сломанное исключение, даже когда таблица маршрутизации верна.

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

То же исключение на маршрутизаторе, один раз, для каждого устройства

Когда туннель работает на маршрутизаторе, маршрут хоста относится к таблице маршрутизации по политикам маршрутизатора и указывает на шлюз WAN вместо шлюза LAN. Каждое устройство за ним наследует исключение, что важно для стриминговой приставки или рабочего ноутбука, сетевые настройки которого вы не можете изменить.

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

Запишите адрес, дату и причину в заметках маршрутизатора. Исключение, построенное вокруг адреса, который позже переезжает, превращается в неисправность, которую через год никто не сможет объяснить, и исправление всегда выглядит загадкой, пока кто-нибудь не найдёт старую заметку.

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