Насколько мне известно, в Linux нет функции, позволяющей переключать две таблицы маршрутизации или атомарно заменять существующее правило маршрутизации. Все еще возможно получить атомарный переключатель, как показано ниже. Вся гимнастика с промежуточными правилами должна быть атомарной на любом шаге без каких-либо оговорок. Во всех смыслах и целях перейти к
приведенные ниже правила являются необязательными, и квазиатомарность все равно будет достигнута без них.
Алгоритм:
предыдущее состояние:
Таблица маршрутизации 1000 уже добавлена, а также правило с предпочтением 20000, выполняющее поиск в этой таблице (здесь нет селектора, потому что эта информация не была доступна из OP):
$ ip -4 правило
0: из всех локальных поисковых систем
20000: из всего поиска 1000
32766: из всех основных поисковых запросов
32767: из всех поисковых запросов по умолчанию
подготовка:
Таблица маршрутизации 1001 готовится заранее с помощью нескольких ip route добавить ... таблица 1001
команды. Поскольку на него не ссылается ни одно правило, оно по-прежнему неактивно. Это таблица маршрутизации, которая заменит таблицу маршрутизации 1000.
добавьте новое правило маршрутизации (которое может иметь дополнительные селекторы), ссылаясь на него в более позднем значении предпочтения, но сначала пропустите его с помощью перейти к правило
... указывая на обычное правило, которое ищет главный, поэтому не существует даже случая, когда старая таблица маршрутизации повлияет на некоторые пакеты, а более новый вариант маршрутизации повлияет на другие пакеты одновременно до завершения переключения. Возможно, это не имеет большого значения и перейти к
приведенные ниже правила можно пропустить, если такая строгая атомарность не требуется.
IP-правило добавить pref 20001 перейти к 32766
ip правило добавить pref 20002 поиск 1001
атомарно переключиться на более новую таблицу маршрутизации с Другие перейти к правило с более ранним предпочтением, которое пропустит как правило для более старой таблицы маршрутизации, так и правило, которое пропустит более новую таблицу маршрутизации.
IP-правило добавить pref 19999 перейти к 20002
очистить
IP-правило del pref 20000
IP-правило del pref 20001
IP-правило del pref 19999
вернуться в предыдущее состояние: повторно использовать предыдущий идентификатор таблицы маршрутизации и значения предпочтения правила маршрутизации
повторите в таблице маршрутизации 1000 те же операции, которые ранее выполнялись в таблице маршрутизации 1001 на шаге 2, начиная с ее очистки
таблица сброса IP-маршрутов 1000
ip route добавить ... таблица 1000
...
сбросить настройки и ссылку на предыдущее состояние и очистить
ip правило добавить преф 20000 поиск 1000
IP-правило del pref 20002
таблица сброса IP-маршрутов 1001
Или переключение ролей таблиц 1000 и 1001 в следующей итерации, вероятно, позволит избежать двойного заполнения маршрутов.
Состояние теперь вернулось к шагу 1.
Если цель состоит в том, чтобы заменить главный таблицы маршрутизации, просто учтите, что это таблица с идентификатором 254 (и что это единственная таблица (вдоль местный таблица маршрутизации) для получения автоматических маршрутов ядра: лучше всегда использовать noprefixroute
для адресов и добавления маршрутов демоном в этом случае): в приведенном выше алгоритме не так много изменений, за исключением, возможно, замены перейти 32766
с перейти 32767
или аналогичное изменение. Также любой новый маршрут, добавленный в таблицу маршрутизации (даже если он не указан), требует проверки с самим собой или маршрутами, уже присутствующими в этой таблице, или с текущими активными правилами и маршрутами, на которые ссылаются таблицы.