Значок клиента говорит «подключено», интерфейс существует, а приложение всё равно ни до чего не достучится. Такое сочетание обычно, потому что виртуальный интерфейс может оставаться на месте, пока его удалённый партнёр, адреса или маршруты отсутствуют. ip link — первый подходящий инструмент, и одновременно тот, который легче всего перечитать. Флаги и счётчики описывают один слой, а слои над ними отказывают независимо. Это ещё и инструмент, который цитируют, желая доказать, что туннель поднят, — именно то утверждение, которое он сам по себе подтвердить не может.

Читайте интерфейс, прежде чем читать значок

Начните с ip -details link show dev tun0, как описано в руководстве по ip-link, подставив интерфейс, которым клиент действительно владеет, а не привычное имя. Флаги, тип, MTU и идентичность интерфейса — полезные наблюдения. Формулировка состояния виртуального интерфейса не обязана вести себя как индикация несущей физического кабеля, поэтому воспринимайте UP как утверждение об интерфейсе, а не о туннеле.

Это различие объясняет самый запутанный случай: интерфейс, который сохраняется, пока удалённая сторона переподключается или недоступна.

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

Добавьте счётчики и запрос, который должен их задействовать

Используйте поддерживаемое представление статистики, ip -s link show dev tun0, и отметьте счётчики пакетов и байт в обе стороны. Затем создайте безвредный запрос, который должен пройти через интерфейс, и сравните нужное направление. Запрос, ушедший прямым маршрутом другого приложения, эти счётчики не сдвинет, и в этом суть упражнения.

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

Снимите показания дважды, до и после, вместо того чтобы доверять одному снимку.

Адреса и маршруты — отдельные шаги

Звено может существовать без префикса, без конфигурации распознавателя или без маршрута, нужного приложению. Проверьте адрес с помощью ip address show dev tun0, затем проверьте, какой маршрут выберет пункт назначения, с помощью ip route get для реальной цели. Эти три наблюдения отвечают на три разных вопроса, и только последнее — о пересылке.

Для IPsec состояние политики безопасности и ассоциации тоже может иметь значение, и не каждая схема IPsec выглядит как простой интерфейс tun. Поиск устройства tun, которого никогда не должно было быть, — быстрый способ сделать неверный вывод.

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

Не удаляйте то, что не опознали

Незнакомый интерфейс не обязательно устарел. Установите его владельца, прежде чем что-либо удалять, и используйте документированный демонтаж клиента или управляемую конфигурацию, когда удаление действительно задумано. Удаление живого туннеля, чтобы посмотреть, что будет, — это тест, отвечающий на вопрос, которого никто не задавал.

Если интерфейс принадлежит среде контейнеров или пространству имён сети, которое вы не создавали, владелец в одной команде, и его стоит найти первым.

Эта осторожность относится и к ip link set down, которое выглядит обратимым и часто им не является.

Что должно остаться после осмотра

Хороший осмотр заканчивается четырьмя фактами: имя интерфейса и пространство имён, его флаги и MTU, прирост счётчиков от реального запроса и маршрут с адресом, которые приложению действительно нужны. Когда они записаны, следующий шаг очевиден и принадлежит конкретному слою. Без них каждое последующее изменение — догадка с планом отката.

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

Храните вывод рядом с тикетом, потому что позднее сравнение полезно только тогда, когда видно, что изменилось.

Затем замкните цикл, проверив приложение снова, потому что интерфейс никогда не был тем, что волновало пользователя.

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