WireGuard: два половинні маршрути проти 0.0.0.0/0 у wg-quick
Два діапазони /1 покривають ті самі адреси, що й /0, але wg-quick маршрутизує їх інакше. Перевірте правила політики, позначки та шлях до кінцевої точки перед редагуванням.
Два префікси /1 покривають точно ті самі адреси IPv4, що й один /0, і ця рівність діє лише всередині списку дозволених префіксів партнера. Вона перестає діяти тієї миті, коли інструмент налаштування вирішує, як маршрутизувати, бо Linux wg-quick обробляє усталений префікс як особливий випадок, а не як арифметику. Особлива гілка встановлює окрему таблицю, два правила політики, позначку сокета й налаштування зворотного шляху, яких пара половинних маршрутів ніколи не отримує. Тому, коли після правки перестає працювати проксі або браузер, префікси — найменш цікава частина зміни.
Список префіксів — не вся конфігурація
AllowedIPs виконує дві роботи одночасно, і лише одна з них стосується покриття. Для самого WireGuard список — це криптоключова маршрутизація: він визначає, які призначення шифруються в бік партнера і які адреси джерела цьому партнеру дозволено використовувати. Для wg-quick той самий список слугує ще й специфікацією маршрутів, і створюваний маршрут залежить від того, у яку гілку список випадково потрапляє. Тому однакове покриття за двох різних форм списку нічого не каже про однаковий стан хоста.
Усталена конфігурація забирає це рішення з ваших рук, бо Table типово автоматичний, і інструмент сам вибирає, куди ляжуть маршрути. Інший менеджер мережі, обгортка дистрибутива або власне значення Table знову змінюють результат, тому порада, написана для одного хоста, може виглядати хибною на наступному.
Що особлива гілка додає понад маршрут
Запис /0 надсилає wg-quick шляхом усталеного маршруту: окрема таблиця маршрутизації отримує усталений маршрут, одне правило політики скеровує туди непозначений трафік, друге правило зберігає конкретніші маршрути основної таблиці як головні, а інтерфейс отримує позначку брандмауера на власний сокет. Ця позначка — сторож петлі. Зашифровані дейтаграми, що несуть трафік тунелю, виходять зі встановленою позначкою, щоб правило, яке скеровує все інше в тунель, не проковтнуло власні транспортні пакети тунелю.
Натомість пара записів /1 іде звичайним шляхом маршруту. Два маршрути потрапляють у налаштовану таблицю, і жоден із навколишніх механізмів не з'являється — не тому, що він непотрібний, а тому, що до цього шляху коду ніколи не входили.
Де два уклади розходяться
Розбіжність виявляється спершу як рекурсія. Коли половинні маршрути в основній таблиці, власна транспортна адреса партнера потрапляє всередину префікса тунелю, тож пакет, який має нести тунель, збігається з маршрутом, що вказує всередину тунелю. Щось має його виключити: маршрут хоста для поточної кінцевої точки, позначка, поставлена вручну, або правило, специфічне для інтерфейсу. Маршрут хоста працює, доки не зміниться адреса кінцевої точки, що трапляється з кінцевими точками на основі DNS, мандрівними клієнтами та конфігураціями з кількома партнерами.
По-друге, усе, що міркує про позначки, змінює поведінку. Прозорий проксі, який локально перенаправляє з'єднання, створює нові сокети, чиї позначки й джерела відрізняються від початкового потоку клієнта, і правила політики, які породжує особлива гілка, були частиною того, що розділило ці потоки. Читати власне вихідне з'єднання проксі — інша вправа, ніж перевіряти, чи доступне початкове призначення.
Прочитайте правила й позначки перед правкою
Зафіксуйте поточний стан, поки тунель здоровий, потім ще раз після зміни, і порівняйте два дампи, а не міркуйте з файлу конфігурації. Уключіть правила політики, кожну таблицю, позначку інтерфейсу й записані кінцеві точки.
ip rule show
ip -4 route show table all | grep -E 'default|wg1'
wg show wg1 fwmark
wg show wg1 endpoints
Якщо перший рядок виводу втратив правило для непозначеного трафіку й окрема таблиця порожня, особлива гілка не працює, і жодна арифметика префіксів не відновить її ефектів. Нульова позначка на інтерфейсі, який раніше її мав, — той самий сигнал, видимий в одному значенні.
Відрепетируйте втрату тунелю перед випуском
Якщо розкладка з половинними маршрутами — свідомий вибір, вона має явно забезпечити відсутні частини: шлях до кінцевої точки, що переживає зміни адрес, задуману поведінку при падінні тунелю й еквівалентну обробку IPv6. Запишіть це як вимоги, а не виявляйте під час збою. Потім відрепетируйте відмову, бо повний тунель, який тихо повертається на фізичний аплінк, гірший за той, що просто перестає працювати.
sudo ip -4 route add 198.51.100.20/32 via 192.0.2.1 dev eth0
ip -4 route get 198.51.100.20
sudo wg-quick down wg1
Пошук маршруту має розв'язувати кінцеву точку через фізичний інтерфейс, не проходячи тунель, а вимкнення інтерфейсу має залишати хост у стані, який обіцяв дизайн. Проксі, що працює після заміни, доводить, що згенерований стан хоста мав значення; він не доводить, що запобігання петлям і поведінка у вимкненому стані пережили правку.