iptables и cgroups v2 (xt_cgroup netfilter)

«Это…» Ну да.

«Как» - вот где все усложняется.

По сути, у вас есть два реальных варианта, которые я могу придумать. Предполагая, что вы используете Gnu libc и у вас есть поддержка nsswitch (я смутно помню, что некоторые дистрибутивы могли это отключить?), Одним из вариантов может быть замена «обычного» модуля NSS DNS (например, / lib64 / libnss_dns * ) с пользовательской версией, которая будет проверять, возможно, ~ / .config / resolv.conf или около того.

Обратите внимание: под словом «заменить» я подразумеваю добавление другого модуля с уникальным именем, на который вы затем ссылаетесь из /etc/nsswitch.conf . Можно «просто» разветвить код, использованный для создания «нормальной» версии, и добавить что-нибудь для создания из него версии для каждого пользователя.

Другой вариант - использовать пространства имен ядра для «монтирования» замены resolv.conf с точки зрения процессов каждого пользователя. (См. Очень подробное описание IBM в комментариях.)

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

Третий вариант, который приходит мне в голову, - это создать для каждого пользователя chroot тюрьму с жесткой связью или монтированием большинства файлов и несколькими избранными файлами, такими как resolv. conf изменен на месте.

8
24.12.2017, 10:32
2 ответа

Согласноhttps://www.spinics.net/lists/netdev/msg352495.htmlправильный синтаксис для v2 cgroup:

iptables -A OUTPUT -m cgroup ! --path test -j LOG
0
27.01.2020, 20:13

Часть ответа на ваш вопрос содержится в моем ответе, на который вы ссылаетесь:

if you want to move an already running process to the cgroup, well... you can't! (...) iptables (...) doesn't match when the cgroup is switched

В этом случае iptables соответствует иногда , как в вашем правиле журнала cgroup v1.

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

.
sh -c "echo \$$ > /sys/fs/cgroup/unified/test/cgroup.procs && ping 8.8.8.8"

Именно это и делает этот замещающий скрипт cgexec для cgroup v2. Возможно, вам придется отредактировать сценарий, чтобы заменить значение переменной CGBASEна/sys/fs/cgroup/unified(и получить правильный путь для вашей среды с помощьюmount -t cgroup2).

РЕДАКТИРОВАТЬ :Обновлен novpn.sh для поддержки cgroups v2 с флагом -2.

Но разве это должно сработать?

Я немного удивлен, что этот ответ для cgroup v2 действительно работает, учитывая эту проблему-подробнее в примечаниях на этой странице.

cgroup controllers can only be mounted in one hierarchy (v1 or v2).

$ cat /proc/cgroups
#subsys_name    hierarchy   num_cgroups enabled
...
net_cls         3           1           1

Это означает, что контроллер net _cls привязан к cgroup v1 (, иначе иерархия будет равна 0 ), но iptables по-прежнему работает с параметром cgroup v2.Насколько я понимаю, сетевой контроллер :net _cls — это просто концепция cgroup v1, которая была заменена пространством имен cgroup v2 cgroup. Таким образом, кажется, что мы можем использовать правила iptables cgroup v1 и iptables cgroup v2 одновременно, если ОС поддерживает как cgroup v1, так и v2.

Общие сведения о запуске служб в группе управления сетью:

За исключением Fedora 31, которая переключилась на cgroup v2 по умолчанию, в настоящее время большинство дистрибутивов по-прежнему используют cgroup v1 по умолчанию. cgmanagerдействительно не нужен, и я недавно удалил его из требований из ответа, на который вы ссылаетесь.

cgmanagerустарела и была удалена в бионике в пользу systemdсобственной реализации управления cgroup. К сожалению, systemdсопровождающие отказались от опции NetClass для cgroup v1, поскольку они сосредоточены на cgroup v2.

Таким образом, с cgroup v1 становится сложно запускать службы в группе управления сетью, потому что вам нужно выполнить все эти шаги ДО желаемого основного процесса службы (, например. tor relay, исполняемый файл apache, все, что )выполняется без какой-либо помощи со стороны systemd, который является средством запуска службы:

  1. Создайте контрольную группу
  2. Создайте правила iptables (Та же проблема для cgroup v2)
  3. Начать (и не двигаться! )основной процесс службы в соответствующей контрольной группе, что сложно, например, для. apache2 в качестве его прямого родителя обычно systemd (PID=1 ), а не какая-то случайная подоболочка, которую вы можете переместить в cgroup

Это может быть возможно с помощью сценария инициализации службы модулей systemd. В противном случае можно использовать cgconfig, см. этот вопрос/ответ для Ubuntu -, но я бы держался подальше от cgrulesengd, так как это может помешать systemd.

1
27.01.2020, 20:13

Теги

Похожие вопросы