Iptables + cgroup path - нашел воспроизводимый баг
Нашел баг в 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 , правильный результат