我读过这种使用 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