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

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

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

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

Добавив скрипт на автоматический перезапуск роутера и также собирая логи, в один из перезапусков я получил от своей программы следующие ошибки:

WindowsTerminal_qguQdD1oJy.thumb.png.49264c45bea886ee68f8b4c9aecab43b.png

Здесь сервис успел запуститься, а "error while fixing iptables in group" возникает на событие "/opt/etc/ndm/netfilter.d/***". Здесь по дублирующимся логам (вторая и третья ошибка) можно понять, что очистка IPTables вызывалась несколько раз за короткий промежуток времени, что и вызывало ошибку "iptables: No chain/target/match by that name", однако учитывая, что софт по итогу в любом случае получал событие "/opt/etc/ndm/netfilter.d/***" - я закрывал на это глаза.

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

Telegram_vlwzkYJAZr.thumb.png.dfa656a890e571df0bc1194dc55463fb.png

Так совпало, что очистка IPTables со стороны Keenetic NDMS вызывалась в тот момент, когда моя программа только-только запускалась, т.е. по временной линии это выглядит как:

  1. MagiTrickle создаёт цепочку в IPTables с названием MT_xxxxxxxx.
  2. MagiTrickle наполняет цепочку MT_xxxxxxxx.
  3. Keenetic NDMS в этот же момент очищает IPTables.
  4. MagiTrickle упал в ошибку, ибо он все ещё наполнял цепочку, которой уже не стало.

Ошибки во время запуска я игнорировать не могу, ибо неправильное заполнение IPTables (когда iptables возвращает статус 1) подразумевает неправильную работу IPTables требующего постороннего вмешательства (например, если пакет установлен на другой роутер, предположим на AsusWRT, где может не быть какого-то модуля ядра Linux расширяющего функционал IPTables - Entware всё-таки не привязан к Keenetic; а собственно мой софт тоже).

Следует также помнить, что мой софт не является Bash скриптом - это исполняемый бинарный файл, который вызывается (автоматически) только один раз - во время запуска службы ("/opt/etc/init.d/***").

Из всего вышесказанного хотелось бы получить какое-то решение со стороны команды разработчиков Keenetic по поводу данной проблемы. Одни из вариантов:

  • В Keenetic NDMS перестать очищать IPTables (предположительно требует очень много работы со стороны команды разработчиков Keenetic, так что обрасывается);
  • Keenetic NDMS может сообщать по тем же эвентам о том, что он намеревается очистить IPTables за условные пол секунды до очистки, чтобы софт мог "подождать" работу Keenetic NDMS перед выполнением своих команд (предполагает добавление таймаутов, что будет являться костылём в Keenetic NDMS);
  • Добавить в Keenetic NDMS возможность блокировать очистку IPTables на условные 5 секунд, когда сама программа (а по факту скрипт запуска службы в файле "/opt/etc/init.d/***") будет сообщать Keenetic NDMS о том, что сейчас лучше не очищать IPTables и требуется подождать.

Буду рад ответу со стороны команды разработчиков Keenetic!

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

Никак это решено не будет. Официальный путь - заполнять скриптом из /opt/etc/ndm

Но и это плохо работает. Когда iptables дергается часто. У меня с IPsec было что дергало 5-6 раз в секунду. И даже скрипты спотыкались. 
 

И да. Если вы заполнили свою цепочку один раз - рано или поздно кинетик ее убьет. Без вариантов. 
 

Я лично поэтому использую таблицу RAW

Изменено пользователем gaaronk
Опубликовано
2 hours ago, gaaronk said:

Если вы заполнили свою цепочку один раз - рано или поздно кинетик ее убьет.

Это знаю. У меня висят хэндлеры на это. Проблема в том, что тут совпадают тайминги с запуском программы и началом очистки, от чего программа падает

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

Это знаю. У меня висят хэндлеры на это. Проблема в том, что тут совпадают тайминги с запуском программы и началом очистки, от чего программа падает

Значит надо избавиться от цепочек, переделать в одну команду. Я так и сделал в свое время.

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

Система полностью асинхронная и никто никого ждать, а также переделывать не будет. Ну и система записывает таблицу целиком за раз, а не цепочку за цепочкой - реализация userspace netfilter у нас своя, потому он записывает всю таблицу целиком атомарно.

Правильное решение такое:

 - накапливаем вызовы netfilter.d, если он пришел, то надо текущую запись точно прервать (при активном процессе) и начать заново

 - если при записи возникла хоть какая-то ошибка из разряда ENOENT, значит нужно начать все заново, не кидая ошибок

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

Да, это сложно, но только такая схема является совместимой.

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

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

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

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

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

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

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

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

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

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

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

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