Вопрос или проблема
Когда я добавляю IP к интерфейсу, ядро добавляет прямой маршрут в основную таблицу, а если я удаляю IP, ядро удаляет прямой маршрут из основной таблицы. Как показано ниже:
root@template:~# ip addr add 192.168.10.1/24 dev eth2
root@template:~# ip route show table main | grep 192.168.10
192.168.10.0/24 dev eth2 proto kernel scope link src 192.168.10.1
root@template:~# ip addr del 192.168.10.1/24 dev eth2
root@template:~# ip route show table main | grep 192.168.10
root@template:~#
Если добавить другую таблицу маршрутизации в /etc/iproute2/rt_tables, как сделать так, чтобы новая таблица работала как основная таблица, автоматически добавляя/удаляя прямые маршруты?
Спасибо!
К сожалению, я думаю, что это невозможно – такое поведение, похоже, закодировано в ядре.
Когда добавляется новый маршрут, вызывается fib_add_addr
в net/ipv4/fib_frontend.c
(см. здесь). При условии, что флаг IFA_F_NOPREFIXROUTE
не установлен в запросе (который будет получен из аргумента noprefixroute
для команды ip
в пользовательском пространстве), при добавлении адреса ядро автоматически создаст маршрут для префикса адреса через вызов fib_magic(RTM_NEWROUTE, ...)
(см. здесь).
fib_magic
решает, в какую таблицу добавить маршрут следующим образом (источник):
tb_id = (type == RTN_UNICAST) ? RT_TABLE_MAIN : RT_TABLE_LOCAL;
Поскольку маршрут префикса ссылки является одноадресным маршрутом, он добавляется в основную таблицу.
Тем не менее, вы можете остановить ядро от добавления этого маршрута в первую очередь, передав noprefixroute
в вызов ip addr add
, а затем добавить его самостоятельно в правильную таблицу, выполнив что-то вроде ip route add 192.168.10.0/24 scope link table 1000
.
Ответ или решение
Для автоматического добавления маршрутов на уровне ядра (особенно директ- маршрутов с протоколом "kernel" и областью "link") в нестандартные таблицы маршрутов в Linux необходимо использовать определенные механизмы. К сожалению, такое поведение, как автоматическое добавление маршрутов при добавлении IP-адреса к интерфейсу, изначально закодировано в ядре. Однако, можно обойти это ограничение, использовав опцию noprefixroute
и написав соответствующие скрипты для автоматизации.
Шаги для настройки автоматического управления маршрутизацией
-
Создание новой таблицы маршрутов:
Убедитесь, что ваша новая маршрутизирующая таблица добавлена в файл/etc/iproute2/rt_tables
. Например:echo "1000 my_custom_table" >> /etc/iproute2/rt_tables
-
Добавление адреса без автоматического создания маршрута:
При добавлении IP-адреса к интерфейсу используйте опциюnoprefixroute
. Это предотвратит автоматическое создание маршрута в основной таблице. Пример команды:ip addr add 192.168.10.1/24 dev eth2 noprefixroute
-
Ручное добавление маршрута в новую таблицу:
Теперь, после добавления IP-адреса, вручную добавьте директ-маршрут в созданную вами таблицу. Используйте следующую команду:ip route add 192.168.10.0/24 scope link table my_custom_table
-
Скрипт для автоматизации:
Вам может понадобиться создать скрипт, который будет обрабатывать события добавления и удаления IP-адресов. Это можно сделать с помощьюifupdown
,NetworkManager
или аналогичных инструментов. Пример простого скрипта на bash и его размещение в нужной директории (например, в/etc/network/if-up.d/
):#!/bin/bash if [ "$IFACE" = "eth2" ]; then case "$MODE" in start) ip route add 192.168.10.0/24 scope link table my_custom_table ;; stop) ip route del 192.168.10.0/24 scope link table my_custom_table ;; esac fi
-
Запросы обновления:
В зависимости от используемого вами дистрибутива, могут быть альтернативные методы реализации замены. Возможно использованиеinotify
илиnetlink
для мониторинга событий маршрутизации.
Заключение
Конечно, предложенные шаги требуют некоторых усилий, но они позволят вам настроить автоматическое управление маршрутами в соответствии с вашими требованиями. Если вы хотите, чтобы маршруты автоматически добавлялись в новую таблицу, настройка скрипта на ваше усмотрение – это, пожалуй, самый надежный и гибкий способ минимизировать вмешательство вручную. Не забудьте протестировать конфигурацию и убедиться, что все работает, как ожидается.
Это решение подойдет для любых случаев, когда требуется расширенное управление маршрутам и даст вам возможность настраивать сетевую инфраструктуру более гибко.