Почему Linux выбирает более короткий префикс? (strongSwan, таблица 220)

Почему Linux выбирает более короткий префикс? (strongSwan, таблица 220)

У меня есть 2 следующих маршрута:

# ip ro show table 0|grep 10.250
10.250.0.0/16 via 10.80.1.1 dev ens5 table 220 proto static src 10.80.1.76 
10.250.1.4 via 10.80.1.45 dev ens5 

Первый взят из таблицы 220, управляемой strongSwan, другой я создал вручную для теста.

Я ожидаю, что явный /32путь всегда победит, но

# ip ro get 10.250.1.4
10.250.1.4 via 10.80.1.1 dev ens5 table 220 src 10.80.1.76 uid 0 
    cache 

Linux по-прежнему предпочитает /16.

Почему это так?

решение1

Это потому, что strongSwan использует маршрутизацию политик. Недостающая часть для объяснения этого — это выводip ruleс дополнительной записью, установленной strongSwan, которая обычно выглядит так:

# ip rule
0:  from all lookup local
220:    from all lookup 220
32766:  from all lookup main
32767:  from all lookup default

Маршрутизацияправилапросматриваются в порядке предпочтения (порядок, показанный выше) для ссылки на различные маршрутытаблицы, пока не будет найден маршрут (или ни одного (возможный случай, если нигде не было маршрута по умолчанию или присутствуют «отрицательные» маршруты) и не Network is unreachableбудет возвращена ошибка, например). Правило маршрутизации pref 220 выполняется до стандартного правила маршрутизации pref 32766, поэтому таблица маршрутизации 220 проверяется первой. Поскольку в таблице маршрутизации 220 10.250.0.0/16 соответствует 10.250.1.4, маршрут был найден: оценка маршрута останавливается здесь, что бы ни было выбрано в более поздних таблицах.основнойТаблица маршрутизации для этого пункта назначения никогда не достигается.

Когда результат ip route get ...показывает таблицу маршрутизации, отличную отместный,основной(или таблицапо умолчаниюесли оно не оставлено пустым, как это обычно бывает), это означает, что должно быть правило маршрутизации, ссылающееся на эту таблицу, и оно будет видно с помощью ip rule.

Для многих другихмаршрутизация на основе политикслучаях будет дополнительный селектор вместо "wildcard" from all. Обычно используется исходный IP-адрес/сеть или входящий интерфейс: снова для изменения обычного результата маршрутизации. Есть даже другие возможности, такие как порт, uid и т. д. Целевой IP-адрес/сеть уже выбран обычными записями маршрута, поэтому редко будет использоваться в качестве селектора в правилах маршрутизации.

Связанный контент