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
Търсенето на маршрут трябва да определи крайната точка от физическия интерфейс, без да пресича тунела, а спирането на интерфейса трябва да остави хоста в състоянието, което дизайнът е обещал. Прокси, което работи след замяната, доказва, че генерираното състояние на хоста е имало значение; то не доказва, че предотвратяването на цикли и поведението в спряно състояние са преживели редакцията.