klink0v (klink0v) wrote,
klink0v
klink0v

Category:

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

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

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


  1. Ответ на запрос, пришедший снаружи, отправился обратно через того же самого провайдера (аплинка), что и SYN-пакет.

  2. Соединения, инициируемые изнутри, уходили бы внаружу исходя из каких-то наперёд заданных критериев. Например, "первый линк основной, второй резервный".

Собственно, ничего нового. IProute2+IPTables+nf_conntrack — наше всё. Алгоритм простой. Видим пакет от нового соединения ("-m state --state new"). Пришел снаружи — ставим на соединение метку по номеру провайдера. Пришел изнутри — ставим метку в зависимости от выбранного нами способа распределения соединений по аплинкам. Потом копируем метку с соединения на пакет. И при помощи правил iproute2 уже разруливаем куда надо. Типа того:

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

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

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

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

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

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

Tags: it, linux, непонятки
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments