Какая-то дичь с маршрутизацией в Linux 5

Aug 21, 2020 12:15


Традиционная избитая задача.

Есть Linux-маршрутизатор, есть два провайдера (аплинка). Есть локальная сеть, есть N-ное количество машин с "серыми" адресами в DMZ, которые обслуживают внешних клиентов через DNAT. Нужно, чтобы:
  1. Ответ на запрос, пришедший снаружи, отправился обратно через того же самого провайдера (аплинка), что и SYN-пакет.
  2. Соединения, инициируемые изнутри, уходили бы внаружу исходя из каких-то наперёд заданных критериев. Например, "первый линк основной, второй резервный".

Собственно, ничего нового. IProute2+IPTables+nf_conntrack - наше всё. Алгоритм простой. Видим пакет от нового соединения ("-m state --state new"). Пришел снаружи - ставим на соединение метку по номеру провайдера. Пришел изнутри - ставим метку в зависимости от выбранного нами способа распределения соединений по аплинкам. Потом копируем метку с соединения на пакет. И при помощи правил iproute2 уже разруливаем куда надо. Типа того:
some-machine:~$ ip rule ls
0: from all lookup local
100: from all lookup main
101: from all fwmark 0x1 lookup prov1
102: from 1.2.3.4/27 lookup prov1
103: from all fwmark 0x2 lookup prov2
104: from 5.6.7.8/24 lookup prov2

При этом в таблице main маршрут для default отсутствует. Во избежание ошибок. Ибо нефиг.

Получается, что сначала обрабатываются все локальные маршруты по таблице main. Затем обрабатываются пакеты с метками в табицах prov1, prov2. Если нет ни записи в main, ни метки, то пакет выбрасывается, так как непонятно куда его маршрутизировать. Все счастливы.

Так вот в 4-м ядре всё это прекрасно работало. В 5-м почему-то уже не работает. Говорят, что там якобы конкретно переделали механизм Reverse Path Filtering, из-за чего появились новые спецэффекты. А может по причине замены iptables на nftables. Но это не точно.

Симптомы следующие (проверил на 5.3-м ядре в Debian несколько раз).

Независимо от того, какую метку я ставлю на пакет для исходящего соединения, система всё равно маршрутизирует его через prov2. Почему - я так и не понял. И почему именно через него - тоже не понял. Единственный способ заставить его уйти через prov1 - это таки дописать в таблицу main маршрут по умолчанию (default) через нужного провайдера. При Лужкове раньше такой фигни не было! И мне это совсем не нравится, потому что ломает всю мою логику работы с аплинками.

В общем, вопрос требует дальнейшего исследования, экспериментов, а возможно и чтения исходников ядра. К сожалению, я всё ещё нахожусь "в центрифуге" и непонятно когда из неё выберусь. И выберусь ли вообще. Так что... моё дело предупредить. Если кто-нибудь располагает информацией по вопросу или может сделать "лабу", готов сотрудничать. Мне тоже нужны ответы, ибо нафиг так жить надо чинить сломанное.

linux, непонятки, it

Previous post Next post
Up