from: cgroup-iptables-disable-app_copyq-net.md
#[功能] 挂载、创建 cgroup(名为disable_net) ,设置其class_id, 令iptables丢弃该class_id的网络包function mountCreateCgroup__disable_net__my_classid__iptables_drop(){
set -e -u[[ $# -lt 1 ]] && return 41
local my_classid="$1"
##local my_classid=123 #命令展开形式(例)local net_cls_d="/sys/fs/cgroup/net_cls"
#挂载cgroup的net_cls
sudo mkdir -p $net_cls_d
##sudo mkdir -p /sys/fs/cgroup/net_cls #命令展开形式
sudo mount | grep $net_cls_d || sudo mount -t cgroup -onet_cls net_cls $net_cls_d
##............................|| sudo mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls #命令展开形式#查看已挂载的cgroup
sudo mount | grep cgroup
#cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
#net_cls on /sys/fs/cgroup/net_cls type cgroup (rw,relatime,net_cls)#新建cgroup (名为disable_net)
sudo cgcreate -g net_cls:/disable_net#默认classid为0
cat $net_cls_d/disable_net/net_cls.classid # == 0#修改classid为123(例)
echo $my_classid | sudo tee $net_cls_d/disable_net/net_cls.classid # == 123(例)
##echo 123 | sudo tee /sys/fs/cgroup/net_cls/disable_net/net_cls.classid # == 123(例) #命令展开形式(例)cat $net_cls_d/disable_net/net_cls.classid # == 123(例)#令iptables丢弃 classid==123(例) 的 网络包裹, 从而达到禁止网络访问的效果
sudo iptables -A OUTPUT -m cgroup --cgroup $my_classid -j DROP
##sudo iptables -A OUTPUT -m cgroup --cgroup 123 -j DROP #命令展开形式(例)
} #end_func
使用举例
#挂载、创建 cgroup(名为disable_net) ,设置其class_id, 令iptables丢弃该class_id的网络包
my_classid=123
mountCreateCgroup__disable_net__my_classid__iptables_drop $my_classid#获得域名163.com对应的ip
site_domain="163.com"
site_ip=$(dig +short "$site_domain") # == 59.111.160.244
web_url="http://${site_ip}" # == http://59.111.160.244#普通curl正常访问网络
curl "${web_url}"#实测 经过 该net_cls 的 curl命令确实不能访问网络
sudo cgexec -g net_cls:disable_net curl --verbose "${web_url}"
#* Trying 59.111.160.244:80... #停在这里#运行copyq但不允许其访问网络
sudo cgexec -g net_cls:disable_net /usr/bin/copyq
##sudo DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY cgexec -g net_cls:disable_net /usr/bin/copyq #备用命令
参考:
cgroup 子系统之 net_cls 和 net_prio