LINUX.ORG.RU
ФорумAdmin

Iptables + cgroup path - нашел воспроизводимый баг

 , ,


1

2

Нашел баг в iptables, при рестарте сервиса перестает работать iptables match его cgroup path.

Есть мнения?

Пишу сразу как shell скрипт чтоб было можно копи пастить. Скрипт исполняем на свежей Ubuntu 24.04, можно и в виртуалке.

# функция тестирования
webtest() { curl 127.0.0.1 -m1 &>/dev/null && echo WEB OK || echo WEB FAIL; }

systemctl restart nginx
iptables -F OUTPUT
# будем матчить nginx и банить ответы от него.
iptables -A OUTPUT -m cgroup --path system.slice/nginx.service -m comment --comment rule1 -j DROP
webtest
# => WEB FAIL , правильный результат
systemctl stop   nginx.service
# здесь system.slice/nginx.service исчезает из дерева cgroup..
systemctl start  nginx.service
webtest 
# => WEB OK , неправильно!!! Видимо , когда по новой создался cgroup path, то старое правило iptables перестало его матчить..

#Теперь методы исправления. Времена чудес..

#method 1.
    # Произойдет рефреш маппинга cgroup path в iptables. Необъяснимо, но работает.
    iptables -Z OUTPUT 1
    webtest
    # => WEB FAIL , правильный резльтат

#method 2
    # удалим старое правило (rule1) и добавим новое аналогичное (rule2). Произойдет рефреш маппинга cgroup path в iptables.
    iptables -D OUTPUT -m cgroup --path system.slice/nginx.service -m comment --comment rule1 -j DROP
    iptables -A OUTPUT -m cgroup --path system.slice/nginx.service -m comment --comment rule2 -j DROP
    webtest
    # => WEB FAIL , правильный результат

★★★★★

Код смотреть не собираюсь, но подозреваю, что путь резолвится в какую-то сущность, которая меняется при пересоздании группы. Цепочка дескрипторов или типа того, например.

anonymous
()
Ответ на: комментарий от Bers666

Все работает ровно так, как написано в коде.

Проверка существования группы проводится только на момент создания правила.

Любое изменение iptables - это её полное перестроение.

Я бы попробовал добавить это правило при отсутствии группы и посмотреть на работоспособность его после запуска, остановки и повторного запуска процесса в группе.

vel ★★★★★
()
Ответ на: комментарий от vel

1. При отсутствии группы оно и не добавится
2. Если добавили но прибили группу то даже листинг правил iptables выдаст ошибку. Тогда удалить правило по номеру можно.

Bers666 ★★★★★
() автор топика
Последнее исправление: Bers666 (всего исправлений: 1)
Ответ на: комментарий от Bers666

Видимо очень востребованная фича, раз она до сих пор в таком состоянии.

Я пока не очень понимаю на сколько дорого искать по имени.

Если в CG при создании/удалении есть callback, то задача решается достаточно дёшево.

Если знаешь как исправить, то пришли разработчикам патч. Помоги себе и опенсорсному софту :)

Я в своё время помог ipset научиться работать в netns.

vel ★★★★★
()