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

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

Схожі статті