VPN подключён, но один сервис не работает: изолируйте этап
Завершённое рукопожатие ничего не говорит об имени, маршруте, размере пакета или слушателе. Пройдите четыре этапа и позвольте первому сбою назвать неисправность.
«Подключено» — наименее информативный факт в заявке на VPN. Он фиксирует, что две стороны завершили рукопожатие, и ничего не говорит об имени, которое запрашивалось, интерфейсе, через который ушёл пакет, его размере или о том, приняла ли его дальняя сторона. Поэтому один сервис может не работать, пока все остальные приложения на том же ноутбуке работают. Пройдите этапы по порядку, и первый сбойный этап назовёт неисправность.
Начните с имени, а не с туннеля
Сначала разрешите имя, а потом маршрутизируйте, потому что плохой ответ делает каждую следующую проверку бессмысленной. Запросите имя через системный резолвер и сравните этот ответ с адресом, который приложение действительно использовало. Приватное имя, возвращающееся как публичный адрес, означает, что запрос ушёл к резолверу, которому нечего на него отвечать. Имя, которое не разрешается, — та же категория, только громче.
resolvectl query host.internal
getent hosts host.internal
Браузеры с собственной настройкой безопасного DNS падают здесь, пока остальная система работает. Поэтому жалоба, касающаяся только браузера, относится прежде всего к этому этапу, до того как кто-то тронет маршрут. Сравните обе команды, а не одну, потому что getent идёт по пути NSS, а запрос к резолверу — нет.
Спросите ядро, какой путь оно выбрало
Таблица маршрутизации — это порядок предпочтений, и путь, который выбирает ядро, не всегда тот, что на схеме. Спросите его напрямую о нужном пункте назначения. Ответ называет интерфейс, следующий хоп и адрес источника, который будет использован. Пакет может выйти через туннель с адресом источника, который дальняя сторона отвергает, а более конкретная запись в физической таблице может отправить его через интерфейс Wi-Fi.
ip route get 10.20.30.40
ip -brief address show
Читайте поля dev, via и src именно в этом порядке, потому что каждое снимает своё подозрение. Этот этап отвечает и за состояние, установленное клиентом, так как правила файрвола и маршруты могут остаться после аварийного выхода. Поэтому «нет интернета без туннеля» и «нет интернета, пока не запущен клиент» — одна семья неисправностей, а не две.
Проверьте размер пакета
Маленький ответ, который возвращается, пока большая передача замирает, прежде всего указывает на MTU пути. Один зонд с установленным битом do-not-fragment, отправленный изнутри туннеля, отделяет этот этап от остальных. Поднимайте нагрузку, пока зонд не сбойнёт, и у вас будет число, которое имеет значение.
ping -M do -s 1400 10.20.30.40
Маленькие зонды проходят, пока листинг каталога или загрузка висят, — это подпись этого этапа. Жалоба звучит как учётные данные или правило файрвола, и это ни то ни другое.
Число — свойство пути, а не клиента, поэтому значение, работающее на офисном подключении, может сбойнуть на мобильном канале. Держите команду зонда вместе с заявкой, потому что следующему человеку нужно то же измерение. Если проходит меньшая нагрузка, решение — clamp или более низкий MTU туннеля, а не новый шифр.
Проверьте дальнюю сторону
Проверьте пункт назначения по его адресу, затем посмотрите, что там слушает. Отказ в соединении и соединение, которое никогда не отвечает, — разные находки. Первое говорит, что что-то запущено и не обслуживает этот порт, а второе — что ничего не вернулось. Ни то ни другое по умолчанию не является проблемой клиента.
curl -sv http://10.20.30.41:8080/health
nc -vz -w 3 10.20.30.41 3389
ss -lnt 'sport = :8080'
Ничто доступное через туннель не может быть сервисом, слушающим только на 127.0.0.1, потому что слушатель никогда не видит пакет. Когда файрвол дальнего хоста разрешает офисную подсеть и отвергает пул туннеля, результат выглядит как сбой клиента и им не является. Remote Desktop или общий доступ к файлам, которые ломаются, пока веб-трафик выживает, обычно оказываются здесь, как бы пользователь это ни сформулировал.
Соотнесите жалобу с одним этапом
Большинство сообщений сводятся к одной из пяти форм, и каждая форма называет этап. Один сайт, работающий только через туннель, — это ответ имени или политика, привязанная к адресу источника. Обновления сбойнут без туннеля, пока просмотр работает, — это проблема имени или маршрута для того клиента.
То, что всё останавливается при запуске клиента провайдера, — установленное состояние, то есть вопрос маршрута и файрвола. Один сервис недоступен, пока остальные в порядке, — это дальняя сторона. Передачи замирают через несколько секунд — это размер пакета. Сопоставьте форму, прежде чем запускать команды, потому что она решает, какие доказательства собирать первыми.
Запишите этап, который дал первый сбой, вместе с выводом команды. Заявка, где сказано, что адрес источника был неверным, с приложенной строкой маршрута, стоит действий, а та, что сообщает о сломанном VPN, — нет.