我试图限制 cgroup 中某个应用程序的下载(入口)速率。我能够通过在 iptables 中标记应用程序的输出数据包来成功限制上传(出口)速率,然后设置 tc 过滤器来处理标记的数据包。然而,当我对 ingress 执行相同的步骤时,它不起作用。
我遵循的限制步骤上传:
- 按 cgroup 标记 OUTPUT 数据包
$ sudo iptables -I OUTPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope'\
-j MARK --set-mark 11
- 按根 qdisc 上的固件标记 (11) 进行过滤
$ tc qdisc add dev $IFACE root handle 1: htb default 1
$ tc filter add dev $IFACE parent 1: protocol ip prio 1 handle 11 fw \
action police rate 1000kbit burst 10k drop
这成功地将firefox的上传速率限制为1000kbit。
我尝试限制的步骤下载:
- 按 cgroup 标记 INPUT 数据包
$ sudo iptables -I INPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope'\
-j MARK --set-mark 22
- 按入口 qdisc 上的固件标记 (22) 进行过滤
$ tc qdisc add dev $IFACE ingress handle ffff:
$ tc filter add dev $IFACE parent ffff: protocol ip prio 1 handle 22 fw \
action police rate 1000kbit burst 10k drop
我可以使用 iptables 成功阻止应用程序的下载:
$ sudo iptables -I INPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-....scope' -j DROP
所以看起来 iptables 正在标记 cgroup 的输入数据包,但由于某种原因,tc 无法过滤它们,或者可能在 tc 过滤器生效之前数据包已被消耗?如果是这样,那么标记输入数据包有什么用呢?
如果有办法阻止 cgroup 的输入数据包,那么一定有办法限制它们,对吧?
答案1
根据@AB 评论:
你在 mangle/INPUT 中设置的标记对 tc 没有影响,因为 tc 入口发生在 waaaay 之前。查看:en.wikipedia.org/wiki/Netfilter#/media/
...
要保存连接标记,请-j CONNMARK --save-mark
用于 cgroup 的出站数据包,使用以下命令检索入站数据包中的 connmarkTC-康马克,最后,将数据包重定向到IFB应用警察。
- 标记cgroup连接数据包(双向):
$ sudo iptables -A OUTPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope' \
-j MARK --set-mark 0x11
$ sudo iptables -A OUTPUT -t mangle -j CONNMARK --save-mark
- 创建ifb接口
$ modprobe ifb
$ ip link set ifb0 up
$ tc qdisc add dev ifb0 root htb #For policing, we don't care about the qdisc type
- 检索
connmark
$IFACE 入口并将其重定向到 ifb0
$ tc qdisc add dev $IFACE ingress handle ffff:
$ tc filter add dev $IFACE parent ffff: protocol all prio 10 u32 match u32 0 0 flowid 1:1 \
action connmark \
action mirred egres s redirect dev ifb0
- 对 ifb0 root qdisc 中标记的数据包应用监管器
$ tc filter add dev ifb0 parent 1: protocol ip prio 20 handle 0x11 fw \
action police rate 1000kbit burst 10k drop
这会将 Firefox 的下载速率限制为 1000kbit。