Одна мережа /24 для лабораторного принтера зникає між двома викликами ip route show, а журнал клієнта лише повідомляє, що мережа змінилася. З командою, префіксом і вашими правами все було гаразд. Корпоративний клієнт, який володіє моделлю маршрутизації хоста, знову утверджує цю модель щоразу, коли хтось інший її редагує, тому доданий вами запис видаляється як сторонній. Боротьба з ним у тій самій таблиці — програшна позиція. Рішення — повністю припинити конкуренцію за цю таблицю і помістити виняток туди, куди монітор ніколи не дивиться.

Монітор пояснює зниклий маршрут

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

ip route show
ip route add 192.168.2.0/24 dev enp0s31f6
sleep 5; ip route show

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

Друга таблиця невидима для монітора

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

Плата за це — супровід. Два об'єкти можуть розійтися, і позиція правила в списку важить не менше, ніж маршрут усередині таблиці, яку воно вибирає.

Побудуйте виняток, а потім змусьте його перемогти

Створіть таблицю, встановіть маршрут і додайте правило, яке вибирає таблицю для цього адресата. Пріоритет вирішує, чи перевіряється ваше правило до чи після правил, вставлених клієнтом, а правило, відсортоване пізніше, ніколи не досягається, тому число є частиною проєкту, а не оздобою. Потім запитайте ядро, що воно насправді зробить, — це інше питання, ніж те, що ви налаштували.

ip rule add to 192.168.2.0/24 table 110 pref 30010
ip route add 192.168.2.0/24 dev enp0s31f6 table 110
ip route get 192.168.2.50

ip route get вирішує маршрут, який використало б ядро, включно з пристроєм і адресою джерела. Він не друкує ідентифікатор таблиці, тому поєднуйте його з ip rule show, коли потрібно підтвердити, яка таблиця перемогла. Разом вони відповідають на єдине важливе питання: чи виходить трафік до цієї адреси туди, куди ви задумали?

Інші форми тієї самої ідеї

Шаблон узагальнюється, щойно ви перестаєте думати адресатами. Локальна підмережа може залишатися доступною, поки тунель тримає маршрут за замовчуванням. Відповіді SSH-сервера, підключеного до локальної мережі, можуть виходити через той інтерфейс, через який прийшли, замість того щоб зникати в тунелі. А правило на основі інтерфейсу може заштовхати в тунель усе, що надходить на бездротовий інтерфейс, тоді як трафік, який породжує сам хост, залишається в Ethernet:

ip rule add iif wlan0 table 10
ip route add default dev tun0 table 10

Останній випадок відповідає вхідному інтерфейсу, а не адресату, — це інший тип правила й інша розумова модель. Пересланому трафіку також потрібен увімкнений net.ipv4.ip_forward, а далекий бік має маршрутизувати діапазон джерела назад або транслювати його; правило на одній машині ніколи не створює другу половину шляху.

Ставтеся до правила як до одноразового

Правила й табличні маршрути живуть у пам'яті. Після перепідключення пристрій тунелю може бути перейменований, призначена адреса може зміститися, а правило зі старим значенням тихо перестає збігатися. Застосуйте всю зміну заново з одного скрипта, який нею володіє, а потім перевірте знову ip rule show, поточне ім'я пристрою та свіжий ip route get на реальному адресаті, перш ніж довіряти винятку.

Два обмеження зберігаються за будь-якої ретельності. Клієнт і далі керує власними правилами фільтрації та конфігурацією резолвера, і виняток маршрутизації не скасовує ні того, ні того. Якщо клієнт також видаляє ваше правило політики, підтримувані шляхи — це його власна політика розділеного тунелю або клієнт, який дозволяє вам керувати маршрутами, наприклад OpenConnect; патчити бінарник постачальника, щоб заглушити його монітор, — це зобов'язання з супроводу з доданою перевіркою цілісності.

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

Схожі статті