Перейти к содержанию

Рекомендуемые сообщения

Опубликовано (изменено)

Всем привет.

Есть необходимость добавить дефолтный маршрут в таблицу маршрутизации.

ip route add default dev $IF_NAME table $TABLE_NUM

На определенных события роутер возвращает таблицу в исходное состояние. 

Необходимо после таких событий добавлять маршрут заново, выполняя команду выше. Подскажите, пожалуйста, каким образом это можно сделать?

 

Я знаю, что для внесения пользовательских изменений в таблицу netfilter существует хук ndm/netfilter.d, но не смог найти информацию, что нужно использовать для модификаций routing table.

Попробовал привязать команду к netfilter.d. Однако во время выполнения скрипта в таблице все еще находится мой маршрут. Сразу после выполнения скрипта он удаляется какой-то системной очисткой.

Если прикрутить костыль в виде sleep 1, скрипт будет работать с состоянием таблицы уже после очистки и таким способом можно решить мою изначальную задачу. Но хотелось бы воспользоваться правильным способом без костыльных таймаутов.

 

Костыльное решение с наглядной демонстрацией проблемы:

/etc/ndm/netfilter.d/010-route.sh

Спойлер
#!/opt/bin/sh

IF_NAME="tun0"
TABLE_NUM=11

addRoute() {
    if [ -z "$(ip route list table $TABLE_NUM | grep default)" ]; then
        echo 'ADDING DEFAULT ROUTE'
        ip route add default dev $IF_NAME table $TABLE_NUM
    else
        echo 'DEFAULT ROUTE ALREADY EXIST'
    fi
}

echo 'SCRIPT CALLED'
echo 'BEFORE SLEEP'
addRoute
sleep 1
echo 'AFTER SLEEP'
addRoute

 

Логи:

Спойлер
Май 26 01:03:12
ndhcpc
GigabitEthernet1: received ACK for 192.168.0.186 from 192.168.0.1 lease 240 sec.
Май 26 01:03:12
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: SCRIPT CALLED.
Май 26 01:03:12
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: BEFORE SLEEP.
Май 26 01:03:12
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: DEFAULT ROUTE ALREADY EXIST.
Май 26 01:03:13
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: AFTER SLEEP.
Май 26 01:03:13
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: ADDING DEFAULT ROUTE.

 

В примере скрипт пытается добавить роут, потом спит 1 секунду и пытается добавить его снова.

Роутер получает ACK, что триггерит очистку таблиц системой, вызывается хук netfilter.d.

По логам видно, что при первой попытке добавления роут еще существует в таблице. После sleep 1 система очистила таблицу и роут отсутствует.

 

Изменено пользователем ivanvan
Опечатки
Опубликовано

qmxocynjca, спасибо за ссылку, уже читал эту доку.

iflayerchanged.d и deprecated ifipchanged.d не вызываются на моем событии.

Пробовал смотреть, что из этого списка зовется - увидел только neighbour.d. Из описания не совсем понимаю, к какому механизму он привязан, но кажется, что завязываться на него тоже неправильно.

Опубликовано (изменено)
13 часов назад, ivanvan сказал:

Всем привет.

Есть необходимость добавить дефолтный маршрут в таблицу маршрутизации.

ip route add default dev $IF_NAME table $TABLE_NUM

На определенных события роутер возвращает таблицу в исходное состояние. 

Необходимо после таких событий добавлять маршрут заново, выполняя команду выше. Подскажите, пожалуйста, каким образом это можно сделать?

 

Я знаю, что для внесения пользовательских изменений в таблицу netfilter существует хук ndm/netfilter.d, но не смог найти информацию, что нужно использовать для модификаций routing table.

Попробовал привязать команду к netfilter.d. Однако во время выполнения скрипта в таблице все еще находится мой маршрут. Сразу после выполнения скрипта он удаляется какой-то системной очисткой.

Если прикрутить костыль в виде sleep 1, скрипт будет работать с состоянием таблицы уже после очистки и таким способом можно решить мою изначальную задачу. Но хотелось бы воспользоваться правильным способом без костыльных таймаутов.

 

Костыльное решение с наглядной демонстрацией проблемы:

/etc/ndm/netfilter.d/010-route.sh

  Показать контент
#!/opt/bin/sh

IF_NAME="tun0"
TABLE_NUM=11

addRoute() {
    if [ -z "$(ip route list table $TABLE_NUM | grep default)" ]; then
        echo 'ADDING DEFAULT ROUTE'
        ip route add default dev $IF_NAME table $TABLE_NUM
    else
        echo 'DEFAULT ROUTE ALREADY EXIST'
    fi
}

echo 'SCRIPT CALLED'
echo 'BEFORE SLEEP'
addRoute
sleep 1
echo 'AFTER SLEEP'
addRoute

 

Логи:

  Показать контент
Май 26 01:03:12
ndhcpc
GigabitEthernet1: received ACK for 192.168.0.186 from 192.168.0.1 lease 240 sec.
Май 26 01:03:12
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: SCRIPT CALLED.
Май 26 01:03:12
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: BEFORE SLEEP.
Май 26 01:03:12
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: DEFAULT ROUTE ALREADY EXIST.
Май 26 01:03:13
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: AFTER SLEEP.
Май 26 01:03:13
ndm
Opkg::Manager: /opt/etc/ndm/netfilter.d/010-route.sh: ADDING DEFAULT ROUTE.

 

В примере скрипт пытается добавить роут, потом спит 1 секунду и пытается добавить его снова.

Роутер получает ACK, что триггерит очистку таблиц системой, вызывается хук netfilter.d.

По логам видно, что при первой попытке добавления роут еще существует в таблице. После sleep 1 система очистила таблицу и роут отсутствует.

 

возьмите за пример
https://github.com/Entware/graveyard/blob/a510e7f02954beccae68adfdfb89dff15bcfcf8b/ipset-dns-keenetic/src/010-bypass-table.sh
проверяете состояние вашего интерфейса/наличие правила и всё

Изменено пользователем Denis P
Опубликовано (изменено)
8 минут назад, Александр Рыжов сказал:

Так это ровно тот же костыль из первого поста.

Но нет же, в первом посту  netfilter.d, а в этом (вашем)  ifstatechanged.d

Изменено пользователем Denis P
Опубликовано
1 час назад, Александр Рыжов сказал:

вряд ли станут меняться

А они меняются

 

4 часа назад, Denis P сказал:

а в этом (вашем)  ifstatechanged.d

Выше писал, что в моем кейсе (получение ACK) ifstatechanged.d не вызывается

Опубликовано
26 минут назад, Le ecureuil сказал:

А ifipchanged?

Тоже не вызывается

Сразу напишу остальные хуки, которые проверял:

  • ndm/wan.d
  • ndm/schedule.d
  • ndm/ifcreated.d
  • ndm/ifdestroyed.d
  • ndm/ifipchanged.d
  • ndm/ifip6changed.d
Опубликовано
1 час назад, ivanvan сказал:

Тоже не вызывается

Сразу напишу остальные хуки, которые проверял:

  • ndm/wan.d
  • ndm/schedule.d
  • ndm/ifcreated.d
  • ndm/ifdestroyed.d
  • ndm/ifipchanged.d
  • ndm/ifip6changed.d

Спасибо за репорт, посмотрю.

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.