Policy-based routing и rp_filter

Возникла довольно несложная задача – роутить определенный трафик (по адресу назначения, ip/mask+порт) на другой интерфейс. Ввиду относительного большого к-ва данных адресов, был выбран ipset (hash:net,port). Выглядело это в упрощенном виде примерно так:

iptables -t mangle -A OUTPUT -m set --match-set $MY_SET dst,dst -j MARK --set-mark $MY_MARK
ip rule add fwmark $MY_MARK table $MY_TABLE
ip route add default via $GW_IP table $MY_TABLE
ipset add $MY_SET target_host_ip,80
ipset add …
wget http://target_host -O -

Вроде все просто, ан нет – не работает. Анализ трафика на целевом интерфейсе (где $GW_IP) показывает, что при TCP handshake проходит SYN→, возвращается ←SYN/ACK, однако ACK уже нет. Вместо него – группа ретрансмитов SYN→ и ←SYN/ACK. То бишь последний где-то кем-то дропается. Выяснять, где именно, было муторно, поэтому я попробовал упростить задачу: вместо роутинга по mark я сделал роутинг по from/to (from для того, чтобы «задействовать» source-based роутинг как часть «advanced», PBR):

ip rule add from $MY_IP to target_host_ip table $MY_TABLE
ip route add default via $GW_IP table $MY_TABLE

wget --bind-address $MY_IP http://target_host -O -

Опаньки, все работает. в чем же разница? Разумеется, man ip-rule не указывает никакой разницы м/у fwmark, from, tos и прочими критериями.

Некоторое гугление показало, что за косяк ответственен параметр rp_filter (Documentation/networking/ip-sysctl.txt). По умолчанию в sysctl.conf стоит net.ipv4.conf.default.rp_filter = 1, поэтому надо учитывать пометку, что «The max value from conf/{all,interface}/rp_filter is used when doing source validation on the {interface}.» То бишь 2 (loose mode) на целевом интерфейсе вполне устраняет ненужный дроп «обратных» пакетов.

Однако решение конкретной проблемы оставило у меня непонимание ее причин. rp_filter == 1 означает, что «Strict mode as defined in RFC3704 Strict Reverse Path. Each incoming packet is tested against the FIB and if the interface is not the best reverse path the packet check will fail. By default failed packets are discarded.» Для начала мне непонятно, почему обратный путь (и каков он в данном простейшем случае, если не такой же, как и прямой…) не_лучший? И почему c этой точки зрения есть разница м/у from/to и fwmark маршрутами?

P.S. Не то, чтобы я ожидал каких-то внятных разъяснений, просто я думаю, что это куда более интересная и достойная тема, нежели обсирание хомячков и слоупоков.

.

Beelzebubbie, пробовал всё громадьё рулей апстола на nftables переводить?
Шта с tproxy делать?

я пока в ряды тестеров этой

я пока в ряды тестеров этой новиночки записываться не готов :) ну и не любитель я transparent proxying…

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".