如何使用 iptables 和 tc 监管属于 cgroup 的入口(输入)数据包?

如何使用 iptables 和 tc 监管属于 cgroup 的入口(输入)数据包?

我试图限制 cgroup 中某个应用程序的下载(入口)速率。我能够通过在 iptables 中标记应用程序的输出数据包来成功限制上传(出口)速率,然后设置 tc 过滤器来处理标记的数据包。然而,当我对 ingress 执行相同的步骤时,它不起作用。


我遵循的限制步骤上传:

  1. 按 cgroup 标记 OUTPUT 数据包
$ sudo iptables -I OUTPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope'\
  -j MARK --set-mark 11
  1. 按根 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。


我尝试限制的步骤下载:

  1. 按 cgroup 标记 INPUT 数据包
$ sudo iptables -I INPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope'\
  -j MARK --set-mark 22
  1. 按入口 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应用警察。


  1. 标记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
  1. 创建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

  1. 检索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
  1. 对 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。

相关内容