Осмотр интерфейса Linux VPN с помощью ip link, слой за слоем
Флаги и счётчики описывают только один слой. Прочитайте звено, затем счётчики, затем адреса и маршруты, прежде чем решать, что туннель сломан.
Значок клиента говорит «подключено», интерфейс существует, а приложение всё равно ни до чего не достучится. Такое сочетание обычно, потому что виртуальный интерфейс может оставаться на месте, пока его удалённый партнёр, адреса или маршруты отсутствуют. 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, прирост счётчиков от реального запроса и маршрут с адресом, которые приложению действительно нужны. Когда они записаны, следующий шаг очевиден и принадлежит конкретному слою. Без них каждое последующее изменение — догадка с планом отката.
Сравните эти четыре факта с теми же четырьмя из рабочей сессии. Если имя интерфейса и пространство имён совпадают, а прирост счётчиков равен нулю, запрос так и не дошёл до туннеля. Если прирост счётчиков здоровый, а маршрут указывает в другое место, туннель в порядке, а маршрутизация нет. Именно это сравнение превращает груду вывода в решение.
Храните вывод рядом с тикетом, потому что позднее сравнение полезно только тогда, когда видно, что изменилось.
Затем замкните цикл, проверив приложение снова, потому что интерфейс никогда не был тем, что волновало пользователя.