Рейтинг:3

Linux: можно ли атомарно заменить таблицу маршрутизации?

флаг in

Это с помощью ip route или аналогичного способа атомарной замены таблицы маршрутизации? Я хотел бы подготовить таблицу маршрутизации, а затем атомарно заменить старую таблицу маршрутизации вновь созданной.

правило айпи?

ОБНОВИТЬ: Я хотел бы подготовить таблицу маршрутизации и заменить ту, которая в настоящее время активна как атомарная операция. Мне нужно сделать это из моего собственного демона.

drookie avatar
флаг za
Не очень понятно, что именно вы делаете. Для автоматических действий с таблицей маршрутизации существует множество протоколов динамической маршрутизации. Для обработки сетевых пакетов с учетом нескольких условий также существуют правила ip. Но на самом деле никто не «заменяет» таблицы маршрутизации.
mlom avatar
флаг in
@drookie: я обновил вопрос.
Рейтинг:1
флаг cl
A.B

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

Алгоритм:

  1. предыдущее состояние:

    Таблица маршрутизации 1000 уже добавлена, а также правило с предпочтением 20000, выполняющее поиск в этой таблице (здесь нет селектора, потому что эта информация не была доступна из OP):

    $ ip -4 правило
    0: из всех локальных поисковых систем
    20000: из всего поиска 1000
    32766: из всех основных поисковых запросов
    32767: из всех поисковых запросов по умолчанию
    
  2. подготовка:

    Таблица маршрутизации 1001 готовится заранее с помощью нескольких ip route добавить ... таблица 1001 команды. Поскольку на него не ссылается ни одно правило, оно по-прежнему неактивно. Это таблица маршрутизации, которая заменит таблицу маршрутизации 1000.

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

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

    IP-правило добавить pref 20001 перейти к 32766
    ip правило добавить pref 20002 поиск 1001
    
  4. атомарно переключиться на более новую таблицу маршрутизации с Другие перейти к правило с более ранним предпочтением, которое пропустит как правило для более старой таблицы маршрутизации, так и правило, которое пропустит более новую таблицу маршрутизации.

    IP-правило добавить pref 19999 перейти к 20002
    
  5. очистить

    IP-правило del pref 20000
    IP-правило del pref 20001
    IP-правило del pref 19999
    
  6. вернуться в предыдущее состояние: повторно использовать предыдущий идентификатор таблицы маршрутизации и значения предпочтения правила маршрутизации

    • повторите в таблице маршрутизации 1000 те же операции, которые ранее выполнялись в таблице маршрутизации 1001 на шаге 2, начиная с ее очистки

      таблица сброса IP-маршрутов 1000
      ip route добавить ... таблица 1000
      ...
      
    • сбросить настройки и ссылку на предыдущее состояние и очистить

      ip правило добавить преф 20000 поиск 1000
      IP-правило del pref 20002
      таблица сброса IP-маршрутов 1001
      

    Или переключение ролей таблиц 1000 и 1001 в следующей итерации, вероятно, позволит избежать двойного заполнения маршрутов.

    Состояние теперь вернулось к шагу 1.

Если цель состоит в том, чтобы заменить главный таблицы маршрутизации, просто учтите, что это таблица с идентификатором 254 (и что это единственная таблица (вдоль местный таблица маршрутизации) для получения автоматических маршрутов ядра: лучше всегда использовать noprefixroute для адресов и добавления маршрутов демоном в этом случае): в приведенном выше алгоритме не так много изменений, за исключением, возможно, замены перейти 32766 с перейти 32767 или аналогичное изменение. Также любой новый маршрут, добавленный в таблицу маршрутизации (даже если он не указан), требует проверки с самим собой или маршрутами, уже присутствующими в этой таблице, или с текущими активными правилами и маршрутами, на которые ссылаются таблицы.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.