Чтобы узнать, держит ли блокировочный выключатель, реальный аккаунт не нужен; под угрозой оказывается именно аккаунт. Проверка создаёт короткое окно, когда трафик может выйти за пределы туннеля, а может и не выйти, поэтому полезной нагрузкой должно быть то, что не жалко потерять. Сейчас я делаю это с приманкой и запасным профилем браузера, и ответ получается яснее, чем при прежней схеме с браузером и веб-почтой. Далее я иду в том же порядке, который предлагает клиент: настройка, назначение, переход, затем доказательство.

Тест отвечает только на один узкий вопрос: во время этого перехода может ли это приложение выйти в сеть за пределами туннеля? он ничего не говорит о том, разумна ли остальная политика. Держите рамки настолько узкими, и результат стоит записать.

Найдите выключатель и его область действия в клиенте

Откройте клиент и найдите настройку блокировки, прежде чем менять сетевое состояние. Производители называют её по-разному: выключатель, режим блокировки, сетевой замок, блокировка трафика вне туннеля. Название говорит меньше, чем параметры внутри. Важно, применяется ли блокировка всегда или только когда приложение решит, что туннель только что отказал, и охватывает ли она все приложения или выбранный список.

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

Профиль тоже запишите: протокол, семейства адресов и включён ли раздельный туннель. Заявление о защите всего устройства бессмысленно, если профиль намеренно исключает несколько приложений, а исключение, которое вы настроили сами, — не утечка. Справочник настроек OpenVPN Connect — как раз такая страница, где указано, какой переключатель меняет какое поведение, хотя названия в разных клиентах различаются.

Выберите приманку, которая работает и без туннеля

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

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

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

Выполняйте переходы в фиксированном порядке

Делайте переходы по одному и давайте каждому несколько секунд на стабилизацию, потому что клиенты часто сносят и заново строят правила именно в этот промежуток. Один и тот же короткий тест каждый раз делает наблюдения сопоставимыми:

curl -sS -o /dev/null -w 'http=%{http_code}\n' --max-time 5 http://decoy.example/
echo "curl_exit=$?"
dig +short decoy.example
curl -6 -sS -o /dev/null -w 'v6_http=%{http_code}\n' --max-time 5 http://decoy.example/
echo "curl_v6_exit=$?"
TransitionExpected with the block onFailure signature
Manual disconnectDecoy stops answering within secondsDecoy still returns 200
Server or path failureBlocked, with no exemption for the old endpointDirect access during the gap
Quit the appClient-dependent; record what happensBlock disappears with the process
Wi-Fi to EthernetBlock holds until the tunnel returnsTraffic flows mid-change

Строка с выходом из приложения заслуживает отдельного прогона, даже если в обычном использовании вы никогда не закрываете клиент. Если блокировка снимается при выходе, падение или принудительное обновление дают ту же экспозицию, и это факт о развёртывании, а не о вашем терпении. В Windows эквивалентные пробы — Resolve-DnsName decoy.example и curl.exe -s -o NUL -w "%{http_code}" http://decoy.example/.

Отличите блокировку от сломанного резолвера

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

Коды выхода curl разделяют эти случаи. 6 — сбой разрешения имени, 7 — соединение отклонено, 28 — тайм-аут. Заблокированный маршрут обычно проявляется как тайм-аут или отказ по литеральному адресу, а блокировка только DNS оставляет 6 и скрывает всё остальное. Кэшированная страница или портал авторизации обманывают глаз, поэтому доказательство — код выхода, а не экран.

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

Запишите область, которую покрывает результат

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

Один проход покрывает одну сборку клиента, один профиль, один переход и одно семейство адресов. Запишите эти четыре пункта вместе с результатом:

  • Сборка клиента и платформа, а также применяется ли настройка к профилю или глобально.
  • Профиль, протокол и любые исключения раздельного туннеля.
  • Проверенный переход и то, как вы его вызвали.
  • Семейства адресов и DNS, с кодами выхода curl для заблокированного и незаблокированного состояний.

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

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