使用 Cgroups2 在 Linux 中通过特定接口路由进程的流量

使用 Cgroups2 在 Linux 中通过特定接口路由进程的流量

我读过这种使用 Cgroups(Cgroups1)路由特定接口流量的方法:https://superuser.com/a/1048913/1662108

有没有办法做同样的事情Cgroups2

答案1

读了很多资料后我发现:

首先,应将 cgroup2 文件系统挂载在 /sys/fs/cgroup

mount -t cgroup2

必须创建一个 cgroup:

sudo mkdir -p /sys/fs/cgroup/direct

必须将 shell 添加到 cgroup 的任务列表中,这样所有子进程都将在这个 cgroup 内运行:

echo $$ | sudo tee /sys/fs/cgroup/direct/cgroup.procs > /dev/null

cgroup 文件夹必须对当前用户具有写入权限:

sudo chown -R "$(id -g -n)":"$(id -g -n)" /sys/fs/cgroup/direct

需要添加Iptables规则:

sudo iptables -t mangle -A OUTPUT -m cgroup --path direct -j MARK --set-mark 2147483647
sudo iptables -t nat -A POSTROUTING -m cgroup --path direct -o eth0 -j MASQUERADE

必须向 iproute2 添加路由表:

echo 252 direct | sudo tee -a /etc/iproute2/rt_tables > /dev/null

必须添加防火墙标记和附加路由:

sudo ip rule add fwmark 2147483647 table direct
sudo ip route add default via 192.168.1.1 table direct dev eth0

应禁用 RP 过滤器:

sudo sysctl -q -w net.ipv4.conf.eth0.rp_filter=0
sudo sysctl -q -w net.ipv4.conf.all.rp_filter=0

在此 shell 中运行的任何程序都将使用附加路由,并将其流量转发到eth0

sudo openvpn --config /path/to/some/config_file.ovpn

清理所有混乱的地方:

iptables -t mangle -D OUTPUT -m cgroup --path direct -j MARK --set-mark 2147483647
iptables -t nat -D POSTROUTING -m cgroup --path direct -o eth0 -j MASQUERADE
ip rule del fwmark 2147483647 table direct
ip route del default via 192.168.1.1 table direct dev eth0
sed -i "/^252\s/d" /etc/iproute2/rt_tables
sysctl -q -w net.ipv4.conf.eth0.rp_filter=1
sysctl -q -w net.ipv4.conf.all.rp_filter=1
cat /sys/fs/cgroup/direct/cgroup.procs | while read task_pid; do echo ${task_pid} | tee /sys/fs/cgroup/cgroup.procs > /dev/null; done
rmdir /sys/fs/cgroup/direct

相关内容