«Это…» Ну да.
«Как» - вот где все усложняется.
По сути, у вас есть два реальных варианта, которые я могу придумать. Предполагая, что вы используете Gnu libc и у вас есть поддержка nsswitch (я смутно помню, что некоторые дистрибутивы могли это отключить?), Одним из вариантов может быть замена «обычного» модуля NSS DNS (например, / lib64 / libnss_dns *
) с пользовательской версией, которая будет проверять, возможно, ~ / .config / resolv.conf
или около того.
Обратите внимание: под словом «заменить» я подразумеваю добавление другого модуля с уникальным именем, на который вы затем ссылаетесь из /etc/nsswitch.conf
. Можно «просто» разветвить код, использованный для создания «нормальной» версии, и добавить что-нибудь для создания из него версии для каждого пользователя.
Другой вариант - использовать пространства имен ядра для «монтирования» замены resolv.conf
с точки зрения процессов каждого пользователя. (См. Очень подробное описание IBM в комментариях.)
Однако мне не известны какие-либо существующие инструменты для облегчения работы.
Третий вариант, который приходит мне в голову, - это создать для каждого пользователя chroot
тюрьму с жесткой связью или монтированием большинства файлов и несколькими избранными файлами, такими как resolv. conf
изменен на месте.
Согласноhttps://www.spinics.net/lists/netdev/msg352495.htmlправильный синтаксис для v2 cgroup:
iptables -A OUTPUT -m cgroup ! --path test -j LOG
Часть ответа на ваш вопрос содержится в моем ответе, на который вы ссылаетесь:
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
, который является средством запуска службы:
Это может быть возможно с помощью сценария инициализации службы модулей systemd. В противном случае можно использовать cgconfig
, см. этот вопрос/ответ для Ubuntu -, но я бы держался подальше от cgrulesengd
, так как это может помешать systemd
.