Рукопожатие есть, адрес пропал: три состояния WireGuard
Свежее рукопожатие доказывает, что партнёр ответил, а не то, что интерфейс сохраняет свой адрес или что следующий пакет уйдёт через нужный восходящий канал.
WireGuard может одновременно иметь свежее рукопожатие и не иметь адреса, и это состояние согласовано, а не противоречиво. Рукопожатие — событие партнёра, адрес принадлежит интерфейсу, а маршрут решает, через какой восходящий канал пакет покидает хост. Три уровня, три владельца, и каждый может отказать, пока два других выглядят здоровыми.
Чтение их как одного статуса и превращает двухминутную диагностику в целый день, уходящий на перезапуск служб.
Рукопожатие — событие партнёра, а не событие адресации
Рукопожатие WireGuard доказывает, что настроенный партнёр ответил действительным ключом и что сеансовые ключи актуальны. Оно ничего не говорит о локальном адресе на интерфейсе и о том, ведёт ли туда какой-либо маршрут. Адрес назначает помощник или сетевой менеджер, а конфигурация протокола лишь называет партнёров и ключи. Путаница между этими двумя и есть причина, по которой здоровое рукопожатие читают как работающий туннель.
Поэтому wg show может сообщить о рукопожатии возрастом в секунды на интерфейсе, который не примет ни одного пакета от приложения.
Менеджер, пересоздающий интерфейс, может сбросить адрес, не трогая конфигурацию партнёра, и следующее рукопожатие сразу успешно, потому что ключи не менялись. Строка журнала об успешном рукопожатии точна и не имеет отношения к сбою.
| Observation | Which layer it belongs to | Wrong conclusion it invites |
|---|---|---|
| Handshake a few seconds old | Peer and keys | The tunnel is usable for application traffic |
Address present on wg0 | Interface configuration | Traffic actually egresses through it |
Route points at wg0 | Forwarding table | The outer packet uses the intended uplink |
У адреса интерфейса есть свой владелец
Адрес на туннельном устройстве может прийти из строки Address помощника, от DHCP-клиента, работающего на интерфейсе, или от демона управления, создающего его при подключении. Чем бы он ни был, этот компонент владеет адресом и восстановит его или нет по своей логике. Чтение адреса без указания его владельца оставляет вас без объяснения, почему он исчез.
Два владельца на одном интерфейсе — классический сбой. Запуск помощника и настольного сетевого менеджера на одном устройстве создаёт гонку, в которой один удаляет то, что другой только что настроил, а конечная точка всё это время отвечает.
Выберите одного владельца и позвольте другому инструменту наблюдать, а не управлять. Это решение стоит записать, потому что симптом появляется недели спустя и выглядит как случайная потеря адреса.
Восходящий канал выбирает маршрут, а не интерфейс
Внутренний маршрут, указывающий на wg0, решает, что трафик входит в туннель. Отдельное решение отправляет зашифрованные внешние пакеты к партнёру, и на хосте с несколькими восходящими каналами это решение приходит из таблицы пересылки и правил политики. Роуминг Wi-Fi может сменить внешний путь, не трогая внутренний адрес.
Итак, работающий туннель и недоступный партнёр — совместимые состояния, как и корректный партнёр со сломанным внутренним маршрутом. Три наблюдения нужно брать вместе, в один момент, иначе сравнение бессмысленно.
Сравните три состояния за один проход
Три команды только для чтения отвечают на три вопроса в том порядке, который быстрее всего изолирует сбой. Запустите их, ничего не меняя между ними.
ip address show dev wg0
ip route get 10.80.0.1
wg show wg0 latest-handshakes transfer
Первая показывает, есть ли у интерфейса адрес вообще, а вторая — какое устройство использовало бы конкретный адрес назначения прямо сейчас. Третья сообщает время последнего рукопожатия и счётчики байт, и только она из трёх описывает партнёра, а не локальный хост.
Читайте счётчики наряду с отметкой времени. Рукопожатие, которое постоянно обновляется, пока передача стоит на месте, означает, что партнёр отвечает, но ничего полезного не проходит, и это указывает на маршрутизацию или ACL, а не на ключи. Отметка времени, которая перестаёт двигаться при наличии адреса, указывает вверх по течению. Оба прочтения берутся из одной и той же строки вывода, и ни одно не видно, если проверять только наличие рукопожатия.
Исправьте то конкретное состояние, которое неверно, а затем проверьте приложение, а не туннель. Свежее рукопожатие — доказательство о партнёре, а доказательство о партнёре не доказывает, что следующий запрос из вашего браузера найдёт адрес, маршрут и работающий восходящий канал. руководство по wg-quick прямо говорит, что из этого настраивает помощник, а что относится к протоколу.