Назад | Перейти на главную страницу

Как на самом деле работают таблицы маршрутизации на основе политик?

Насколько я понимаю, маршрутизация на основе политик в Linux состоит из трех основных компонентов: таблиц маршрутизации, маршрутов и правил. Я следовал многим руководствам, и в каждом из них это кажется правильным, поэтому я создаю таблицу маршрутов, добавляю к ней маршрут, а затем добавляю правило для квалификации трафика для использования этой таблицы.

Мне это кажется логичным, есть список правил, и если трафик соответствует правилу, он просматривает таблицу маршрутов и сообщает, как добраться до пункта назначения, однако это, похоже, не работает для меня, и теперь я пришел в ряде других статей, где сразу после настройки таблиц маршрутизации субъекты затем добавляют те же маршруты в основную таблицу маршрутов, я не уверен, почему это требуется, если мое понимание того, как это должно работать, неверно, или это не работает.

Вот хороший пример из Linux Advanced Routing & Traffic Control HOWTO в нем есть следующий отрывок (на случай, если ссылка исчезнет):

Один создает две дополнительные таблицы маршрутизации, скажем, T1 и T2. Они добавляются в / etc / iproute2 / rt_tables. Затем вы настраиваете маршрутизацию в этих таблицах следующим образом:

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2

Ничего особенного, просто создайте маршрут к шлюзу и создайте маршрут по умолчанию через этот шлюз, как вы бы сделали в случае одного восходящего провайдера, но поместите маршруты в отдельную таблицу для каждого провайдера. Обратите внимание, что сетевого маршрута достаточно, поскольку он сообщает вам, как найти любой хост в этой сети, который включает шлюз, как указано выше.

Затем вы настраиваете основную таблицу маршрутизации. Рекомендуется направлять вещи к непосредственному соседу через интерфейс, подключенный к этому соседу. Обратите внимание на аргументы `src ', они гарантируют, что выбран правильный исходящий IP-адрес.

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

Затем ваши предпочтения для маршрута по умолчанию:

ip route add default via $P1

Далее вы настраиваете правила маршрутизации. Они фактически выбирают, с какой таблицей маршрутизации маршрутизировать. Вы хотите убедиться, что вы маршрутизируете данный интерфейс, если у вас уже есть соответствующий исходный адрес:

ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

Этот набор команд гарантирует, что все ответы на трафик, поступающий на конкретный интерфейс, будут получены от этого интерфейса.

Хорошо, поэтому я совершенно не понимаю, почему после добавления маршрутов в специально созданную новую таблицу маршрутов вы затем идете и добавляете их в основную таблицу маршрутов, какой в ​​этом был смысл, может кто-нибудь объяснить?

На самом деле, я думаю, что путаница возникает из-за того, что эти инструкции смешивают две темы:

  • Работа с политикой маршрутизации
  • Оптимальная настройка стандартной таблицы маршрутизации

Эти три строки

    ip route add $P1_NET dev $IF1 src $IP1
    ip route add $P2_NET dev $IF2 src $IP2
    ip route add default via $P1

предназначены для обработки трафика, который по какой-либо причине не соответствует маршрутам вашей политики (например, вы добавляете петлю на маршрутизаторе и используете ее для управления). Они не являются строго обязательными для работы PBR, но лучше все же иметь их там.