Инструменты высокого уровня, такие как NetworkManager, обычно удаляют адрес и маршрут в ссылках «linkdown» (т. е. с флагом NO-CARRIER, отображаемым на интерфейсе). Таким образом, если интерфейс управляется таким инструментом, можно ожидать, что его маршрут будет появляться и исчезать при подключении и отключении.
Я понимаю, что использование NetworkManager может быть слишком навязчивым с протоколом динамической маршрутизации, используемым в то же время, и поэтому может быть не лучшей идеей.
Но на самом деле стек маршрутизации ядра уже предоставляет такую функцию без необходимости изменять какой-либо адрес или маршрут: ignore_routes_with_linkdown.
Как и несколько других записей, эта появилась в ядре 4.2 (поэтому доступна в ядре 4.19 Debian 10) и была показано затем в kernelnewbies.org когда он появился, был задокументировано только с ядра 5.11:
ignore_routes_with_linkdown — логическое значение
Игнорировать маршруты, канал которых не работает, при выполнении поиска FIB.
Итак, если интерфейс называется мгмт0
и маршрут, который он предоставляет, следует использовать только тогда, когда на нем обнаружен перевозчик, нужно просто сделать:
sysctl -w net.ipv4.conf.mgmt0.ignore_routes_with_linkdown=1
или вставьте это /etc/sysctl.conf
.
Теперь, когда этот интерфейс, все еще поддерживаемый административно, отключен, запись маршрута отображается обратно IP-маршрут
показал бы флаги мертвая ссылка
вместо единого флага связь
чтобы сообщить пользователю, что действительно этот маршрут в настоящее время игнорируется во время поиска FIB.
Примечание: чтобы интерфейс обнаружил ссылку, он должен быть включен. Так что он должен оставаться в административном порядке. Если он был отключен при потере несущей, он не может быть автоматически восстановлен позже при обнаружении несущей, поскольку такого обнаружения больше не будет.
Полный пример:
ip link add name vethtest1 up type veth имя однорангового узла vethtest1peer
ip link add name vethtest2 up type veth имя пира vethtest2peer
ip link set dev vethtest2peer up
IP-адрес добавить 192.0.2.2/25 dev vethtest1
IP-адрес добавить 192.0.2.3/24 dev vethtest2
Установка адресов устанавливает автоматические маршруты ядра LAN. vethtest1
чей одноранговый интерфейс не был поднят, будет иметь статус NO-CARRIER, а его маршруты получат связь
флаг.
# ip route show to root 192.0.2.0/24
192.0.2.0/25 dev vethtest1 ссылка на область ядра proto src 192.0.2.2 linkdown
192.0.2.0/24 dev vethtest2 ссылка на область ядра proto src 192.0.2.3
Маршрут до 192.0.2.100 будет использовать vethtest1
так как он получил более узкий маршрут (несмотря на наличие связь
флаг).
# ip маршрут получить 192.0.2.100
192.0.2.100 dev vethtest1 src 192.0.2.2 uid 0
тайник
Затем с новой настройкой:
sysctl -w net.ipv4.conf.vethtest1.ignore_routes_with_linkdown=1
приходит новое поведение:
# ip route show to root 192.0.2.0/24
192.0.2.0/25 dev vethtest1 ссылка на область ядра proto src 192.0.2.2 мертвая ссылка вниз
192.0.2.0/24 dev vethtest2 ссылка на область ядра proto src 192.0.2.3
# ip -4 netconf show dev vethtest1
inet vethtest1 переадресация вкл. rp_filter выкл. mc_forwarding выкл. proxy_neigh выкл. ignore_routes_with_linkdown вкл.
# ip маршрут получить 192.0.2.100
192.0.2.100 dev vethtest2 src 192.0.2.3 uid 0
тайник
Теперь, если интерфейс получает носитель (здесь моделируется запуск его однорангового интерфейса):
ip link set dev vethtest1peer up
маршрут восстанавливается через него:
# ip route show to root 192.0.2.0/24
192.0.2.0/25 dev vethtest1 ссылка на область ядра proto src 192.0.2.2
192.0.2.0/24 dev vethtest2 ссылка на область ядра proto src 192.0.2.3
# ip маршрут получить 192.0.2.100
192.0.2.100 dev vethtest1 источник 192.0.2.2 uid 0
тайник