Сделать `ip rule` более приоритетным, чем `local`

Я пытаюсь перенаправить часть входящего трафика в другое место назначения с помощью fwmarks.

Процедура

1) Пометить соответствующие входящие пакеты:

iptables -t mangle -A PREROUTING -i pppoe0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 6

2) Добавить правило для направления помеченных пакетов в таблицу маршрутизации "200".

ip rule add fwmark 6 table 200

3) Добавьте маршрут по умолчанию в таблицу маршрутизации "200" к новому месту назначения.

ip route all default via 192.168.33.2 table 200

Проблема

iptables -L PREROUTING -t mangle -v показывает пакеты, соответствующие правилу, которое я создал в шаге 1, однако они никогда не пересылаются туда, куда я ожидаю.

Я думаю, проблема в том, что трафик предназначен для адреса, который считается локальным для хоста, а правила local ip совпадают с правилом, которое я добавил в шаге 2, например.

~# ip rule show
0:      from all lookup local   <--- taking priority...
32765:  from all fwmark 0x6 lookup 200   <--- ... over this.
32766:  from all lookup main
32767:  from all lookup default

Вопрос: есть ли способ заставить мое правило иметь приоритет над локальными правилами?

1
задан 27 April 2020 в 04:55
1 ответ

Вы можете указать приоритет правила с помощью ключевого слова preference (или prio или pref и т. д.), чтобы переопределить значение по умолчанию. приоритет (который обычно «на единицу ниже самого низкого приоритета, не равного 0»), который будет выбран для правила.

Вы также можете создать правило, которое дублирует другое правило, но с другим приоритетом, а затем удалить исходное правило с другим приоритетом: это эквивалентно изменению приоритета правила.

Вот как это можно сделать здесь:

ip rule add preference 200 fwmark 0x6 lookup 200
ip rule add preference 300 lookup local
ip rule delete preference 0

Это перемещает правило, ищущее локальную таблицу маршрутизации, с 0 на 300, оставляя место для других правил, имеющих приоритет, например, правило с приоритетом 200. Такой порядок предотвращает любые потеря соединения (при условии, что таблица маршрутизации 200 сама по себе не приводит к потере соединения).


Пример на SU, где я использовал это в ответ на маршрутизацию (и туннелирование) трафика, обычно предназначенного для локальной системы без NAT и fwmark:

Использование Wireguard для предоставления машине в локальной сети общедоступного адреса из VPS


Отказ от iptables часто является лучшим способом заставить его работать. Для этого требуется kernel >= 4.17:

Расширена поддержка соответствия правил fib, включая спорт, dport и ip proto. match (для завершения поддержки совпадения из 5 кортежей).Общие случаи использования Маршрутизация на основе политик в центре обработки данных требует сопоставления 5 кортежей

Без iptables и меток это будет выглядеть так:

ip rule add preference 200 iif pppoe0 ipproto tcp dport 80 lookup 200

Плюс обратное направление, которое в зависимости от проблемы может быть другой интерфейс или, в некоторых случаях, специальные слова iif lo, означающие локально инициированные:

ip rule add preference 201 iif ... ipproto tcp sport 80 lookup 200

Я не могу дать полный ответ, потому что задействовано много факторов, и это зависит от конечной цели, которая не здесь очень ясно (вы можете взглянуть на мой ответ SU, чтобы увидеть все, что может пойти не так и что нужно изменить, например, ARP в некоторых случаях).

1
ответ дан 20 May 2021 в 15:01

Теги

Похожие вопросы