Пакет напуска лаптоп, никога не стига до VPN шлюза и нито един брояч на защитната стена не се мести. Таблицата за маршрутизиране вече е решила съдбата на пакета: запис blackhole съвпадна с него и ядрото го изхвърли, преди който и да е интерфейс да го види. Това поведение е полезно, когато дадена дестинация трябва да се провали в затворено състояние, но това е маршрутно действие с тесен обхват. Именно третирането му като пълен kill switch е мястото, където проектите се объркват.

Какво всъщност покрива действието за изхвърляне

Търсенето на маршрут избира таблица, след това най-дългия съвпадащ префикс в нея. Маршрутът blackhole е обикновен запис, чието действие е изхвърляне, затова засяга само пакети, които биха избрали този запис след цялото решение. Променете таблицата с правило за политика или добавете по-конкретен префикс и изхвърлянето вече не се прилага.

Затова обхватът на blackhole е точен и лесен за описване: покрива префикса, в таблицата, за това семейство адреси. Не покрива дестинация, която друга таблица би спечелила, и не покрива IPv6 само защото префиксът IPv4 се изхвърля.

ip route get показва решението, преди да разположите каквото и да е, включително таблицата и типа маршрут. Четенето на този изход е по-бързо от това да гадаете по неуспешна заявка кое правило или префикс е сработило.

Blackhole не е същото като unreachable или prohibit

Linux предлага три типа маршрути, подобни на изхвърляне, и те се различават по това какво вижда подателят. Blackhole изхвърля пакета без отговор, затова клиентът вижда изтичане на времето. Маршрут unreachable връща съобщение ICMP unreachable, затова връзката се проваля бързо с грешка за хост или мрежа. Маршрут prohibit връща грешка за административна забрана, което е по-близо до умишлен отказ на политика.

Изберете поведението, което искате приложението да види. Тихото изхвърляне е подходящо, когато не искате да разкривате политиката, а незабавната грешка е по-добра, когато потребителите трябва да разберат защо дадена дестинация е недостъпна. Смесването на типовете в мрежата създава тикети за поддръжка, които описват една и съща политика като три различни неизправности.

Не предполагайте, че всеки запис за изхвърляне е взаимозаменяем, когато диагностицирате връзка. Текстът на грешката, моментът и прихващането на пакети се различават, а типът маршрут в таблицата ви казва кой от тях гледате. ръководството за ip-route изброява типовете и поведението им при грешка.

Как се сравнява с kill switch

Kill switch е филтриране на пакети: правило на защитната стена, което изхвърля изходящия трафик, който би излязъл извън тунела. Маршрутът blackhole е решение за препращане, взето по-рано в стека. И двете могат да спрат трафик, но виждат различни неща и пропускат различни случаи.

MechanismWhat it blocksWhat it missesHow failure looks
Blackhole routeDestinations matching the prefix and tableOther tables, other address families, traffic with a different routeSilent timeout
Firewall kill switchEgress not bound to the tunnel interfaceRules that are too broad can break the endpoint or DHCPDropped packets with counters
WireGuard AllowedIPsDestinations not routed into the interfaceTraffic that never enters the interface at allNo tunnel route, direct egress

Обхватът е мястото, където сравнението има значение. Защитната стена може да съпоставя собственик, порт или интерфейс и да блокира приложение, като оставя крайната точка достъпна; маршрутът не може. Обратно, маршрутът може да изпрати цял префикс в изхвърляне без зареден филтър на пакети, което е полезно в минимална система.

AllowedIPs на WireGuard е криптоключово маршрутизиране, а не защитна стена. То решава кои префикси на дестинации се приемат в интерфейса, а профил, който изброява само подмрежата на тунела, просто оставя другите дестинации на обичайния маршрут по подразбиране. Затова профилите за пълен тунел използват 0.0.0.0/0 и затова wg-quick също инсталира правила на защитната стена, когато може.

Дръжте крайната точка на тунела извън изхвърлянето

Външният адрес на крайната точка трябва да остане достъпен през физическия интерфейс. Изхвърляне, което обхваща и този адрес, пречи на ръкостискането да излезе и тунелът никога не се вдига, което изглежда като повреда на VPN, а не като маршрутна политика. Проверете маршрута до крайната точка преди и след промяната.

Административният достъп принадлежи към същия преглед. Ако единственият път до рутера или клиента е тунелът, прекалено широко изхвърляне може да ви заключи извън машината, която би ви позволила да го премахнете. Дръжте документиран извънлентов маршрут, конзола или връщане с таймер.

IPv6 се нуждае от собствен запис и собствен преглед. Проект, който изхвърля IPv4 в blackhole, а оставя IPv6 по маршрута по подразбиране, изтича точно трафика, който политиката е трябвало да спре, и грешката е невидима в тест само за IPv4.

Въведете го поетапно с таймер и връщане назад

Приложете маршрута с кратко автоматично премахване, за да не може грешка да остане след рестарт. Командите по-долу използват диапазон за документация; заменете го с префикса, който вашият проект действително изхвърля:

sudo ip route replace blackhole 10.0.0.0/8
ip route get 10.1.2.3
sudo systemd-run --on-active=60 /sbin/ip route del blackhole 10.0.0.0/8

Втората команда трябва да отчете маршрута blackhole и таблицата, от която идва. Третата планира премахване след една минута, което е достатъчно време да потвърдите политиката и достатъчно кратко, за да се възстановите от грешка на отдалечен хост. След като поведението е потвърдено, направете записа постоянен чрез същото управление на конфигурацията, което притежава другите маршрути.

Затворете промяната, като запишете префикса, таблицата, семейството адреси и метода за връщане. Изхвърлянето е умишлено изключение в маршрутния проект и следващият инженер трябва да знае кой трафик е трябвало да спре, преди да реши дали още му принадлежи.

Подобни статии