Петля маршрута по умолчанию в WireGuard: найдите путь конечной точки
Маршрут по умолчанию отправляет собственные зашифрованные пакеты туннеля обратно внутрь него. Прочитайте путь конечной точки, добавьте один маршрут к хосту, затем проверьте и откатите.
Интерфейс поднимается, конфигурация партнёра выглядит правильно, и ни одно рукопожатие так и не завершается. Добавление маршрута по умолчанию через туннель — это шаг, который часто вызывает это: та же таблица маршрутизации теперь решает, куда должны идти собственные зашифрованные пакеты туннеля, и ответ, который она выдаёт, ведёт обратно в туннель. Ничто не может нести внешний пакет, который нёс бы внутренний, поэтому соединение останавливается, не начавшись. Исправление небольшое, но у него есть порядок, и проверка важнее правки.
Подтвердите петлю, прежде чем менять маршрут
Прочитайте текущий адрес конечной точки партнёра и затем спросите стек маршрутизации, куда пойдёт пакет на этот адрес. Если ответ называет интерфейс туннеля, петля подтверждена и дальнейшая диагностика не нужна. Сохраните оба вывода в журнале изменений, прежде чем что-либо трогать, потому что сравнение после исправления — это те же две команды. Петля не тонка, как только её увидишь; сложность в том, что интерфейс выглядит здоровым, пока это происходит.
sudo wg show wg1 endpoints
ip route get 198.51.100.20
ip rule show
Включите правила политики в эту запись. Маршрут по умолчанию, который выглядит правильным в главной таблице, всё ещё может проиграть правилу, выбирающему другую таблицу для помеченного или непомеченного трафика, и петля появится снова с таблицей маршрутов, которая выглядит в порядке.
Читайте путь конечной точки, а не путь туннеля
Путь конечной точки — это маршрут, по которому зашифрованные датаграммы идут к публичному адресу партнёра, и он должен оставаться вне туннеля, пока туннель существует. Путь туннеля — это всё, что партнёру разрешено нести. Эти два пути делят одну таблицу маршрутизации, и именно поэтому одна запись, захватывающая всё, может обрушить их друг в друга. Разделение трафика туннеля и собственного транспорта туннеля — это вся проблема проектирования, и каждый поддерживаемый инструмент решает её где-то немного иначе.
Проверьте оба семейства адресов отдельно, если интерфейс несёт оба. Работающее исключение IPv4 ничего не говорит о том, доступна ли ещё конечная точка IPv6, и смешанная конфигурация может выглядеть работающей, пока не будет выбран адрес IPv6 партнёра.
Восстановите путь конечной точки одним согласованным изменением
Существуют два поддерживаемых подхода, и их смешивание — это то, что делает работающую установку непредсказуемой. Первый — позволить инструменту, владеющему интерфейсом, управлять всем туннелем: wg-quick имеет специальную обработку диапазона партнёров по умолчанию, которая устанавливает отдельную таблицу, правила политики и метку сокета, что удерживает внешние пакеты вне туннеля. Оставьте этот механизм нетронутым, вместо того чтобы воспроизводить половину его вручную. Установка, которая смешивает вручную добавленный маршрут по умолчанию с менеджером, уже устанавливающим метки и правила, обычно даёт сбой после переподключения, когда менеджер перезаписывает состояние, которое предполагал ручной шаг.
Второй — ручной дизайн, в котором конечная точка получает явный маршрут к хосту через физический шлюз. Добавьте этот маршрут перед маршрутом по умолчанию, замените, а не добавьте, чтобы устаревшая запись не могла победить, и подтвердите поиск после этого.
sudo ip route replace 198.51.100.20/32 via 192.0.2.1 dev eth0
ip route get 198.51.100.20
sudo ip route add default dev wg1
Проверьте, а затем сохраните путь назад
Продвигающаяся отметка времени рукопожатия — первое доказательство, и она сильнее интерфейса, который просто существует. Продолжите тестом приложения через туннель, затем намеренно опустите интерфейс и подтвердите, что хост возвращается в пригодное состояние, а не держит маршрут по умолчанию, указывающий в никуда. Этот последний шаг люди пропускают, и именно он решает, оставит ли перезагрузка машину без связи.
sudo wg show wg1 latest-handshakes
sudo wg-quick down wg1
ip route show default
ip route get 198.51.100.20
Прежде всего сохраните текущее состояние маршрутизации и убедитесь, что есть путь входа, не зависящий от туннеля: консоль, адрес внешнего управления или коллега на месте. Удалённую машину, потерявшую маршрут по умолчанию, нельзя восстановить через соединение, которое она только что потеряла, и самый безопасный шаг в runbook — тот, что сделан до первой команды.