Правило маршрутизації читає мітку пакета, а не conntrack
Маршрутизація за політикою читає мітку пакета; conntrack зберігає інше значення з довшим життям. Копіювання між ними — крок, який хтось має написати.
Чотири перевірки відокремлюють робоче правило мітки від робочого маршруту: яку мітку читає правило, чи пакет ще несе її в момент пошуку, чи було відновлено мітку з'єднання на наступних пакетах і чи чи маска й пріоритет відповідного правила дозволяють йому спрацювати. Зростаючий лічильник доводить лише те, що якесь правило з чимось збіглося. Він нічого не каже про те, що ніс пакет, коли ядро обирало його шлях.
Дві мітки живуть у різних місцях і спливають за різними графіками.
Дві мітки, два життя
Мітка пакета належить одному skb, подорожує з ним через хуки і споживається селектором fwmark маршрутизації за політикою. Мітка з'єднання належить запису conntrack, зберігається протягом пакетів цього потоку і є невидимою для правила маршрутизації, доки щось не скопіює її назад. Збереження мітки пакета в з'єднанні — це запис; відновлення — окрема дія. Ні те ні інше не відбувається неявно.
Тому набір правил може виглядати узгодженим, тоді як рішення про маршрут бачить нуль: значення було збережене, і ніщо його не відновило.
Копіювання між ними — крок, який пишете ви
Два важливі твердження працюють у протилежних напрямках: одне зберігає мітку пакета в з'єднанні, друге завантажує мітку з'єднання на пакет. Яке з них потрібне, залежить від того, коли відбувається класифікація щодо потоку. Проєкту може бути потрібна лише мітка пакета, а додавання маркування через conntrack тому, що якийсь обхідний прийом використовував обидві, — це шлях, яким проста політика набуває другого режиму відмови.
ct mark set meta mark meta mark set ct mark
Запишіть напрямок поруч із правилом, бо з синтаксису на перший погляд це не очевидно. Перший рядок зберігає, другий відновлює, і жоден не передбачає іншого.
Класифікуйте до пошуку, який це споживає
Локально створений трафік і трафік, пересланий з LAN, проходять через різні хуки й досягають рішень про маршрут у різні моменти. Правило виходу, яке працює для власних з'єднань маршрутизатора, не доводить, що пакет пересланого клієнта було позначено до його пошуку. Розмістіть класифікацію там, де пошук, який її споживає, ще не відбувся, і перевірте, чи не перезаписують значення наступні правила в тому самому ланцюжку. Порядок у ланцюжку — частина конфігурації, а не деталь реалізації.
Збереження стану з'єднання також потребує явного плану. Якщо класифікується лише перший пакет потоку, наступним пакетам потрібне відновлення збереженої мітки, інакше вони підуть немаркованим шляхом. У цьому різниця між міткою, що описує з'єднання, і міткою, що описує пакет.
Поставте маршруту позначене питання
ip route get 10.77.0.10 mark 0x2
Перегляньте правила й таблицю, потім запитайте маршрут із включеною міткою, а також джерело або вхідний інтерфейс, коли вони впливають на політику. Звичайний пошук без мітки відповідає на інше питання і охоче повідомить шлях, якого ви не хотіли. Перевірте маску й пріоритет правила, а також його значення, і переконайтеся, що вибрана таблиця містить придатний маршрут.
Зростаючий лічильник — це доказ того, що якесь правило збіглося з якимось пакетом. Це не доказ того, що підсумковий пакет ніс потрібну мітку в правильній точці рішення.
Читайте мітку, напрямок, момент і маску. Чотири перевірки, і маршрут перестає бути загадкою.