流量整形:tc 过滤器附加到 HTB 类?

流量整形:tc 过滤器附加到 HTB 类?

我可以将 tc 过滤器附加到 HTB 类而不是 HTB qdisc 吗?

例如:

tc class add dev $IF_LAN parent 1:100 classid 1:180 htb rate 19kbit ceil 2000kbit prio 4

在哪里:

 1:100 -> Is an HTB inner class.

这个问题源于这样一个事实:我可以附加一个TC 过滤器到一个类而不会引发错误,但是后来当我看到 tc 统计数据时,我意识到没有进行过滤。

提前致谢。

编辑:我在 tc 手册中找到了 tc-filter 语法:

tc  filter  [  add  |  change  | replace ] dev DEV [ parent qdisc-id | root ] protocol prootocol prio priority filtertype [ filtertype specific parameters ] flowid flow-id

(相关部分是父 qdisc-id

那么,我只能将过滤器附加到 qdisc 还是有解决方法?

答案1

应该是可能的,我们使用:

/sbin/tc qdisc add dev $DEV root handle 1: htb default 1
/sbin/tc class add dev $DEV parent 1: classid 1:3 htb rate $RATE burst $BURST
/sbin/tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip src $IP flowid 1:3

classid 1:3第三行将过滤器附加到第二行(和)中定义的类flowid 1:3

答案2

这是有可能的。我认为 tc(8) man 不够全面。

引自man7.org/tc(8)

tc 过滤器
如果 tc 过滤器附加到某个类,则首先会查询它们以获取相关指令。过滤器可以匹配数据包头的所有字段,以及 ipchains 或 iptables 应用的防火墙标记。

刚刚检查了我的 Linux 5.0.3-zen1-2-zen 笔记本电脑,它可以运行。

lang-bash
sudo tc qdisc add dev enp3s0 root handle 1: htb default 10
# inner class
sudo tc class add dev enp3s0 parent 1: classid 1:1 htb rate 100kbps
# leaf classes
sudo tc class add dev enp3s0 parent 1:1 classid 1:10 htb rate 100kbps
sudo tc class add dev enp3s0 parent 1:1 classid 1:20 htb rate 100kbps
sudo tc class add dev enp3s0 parent 1:1 classid 1:30 htb rate 100kbps

sudo tc filter add dev enp3s0 parent 1: protocol ip matchall flowid 1:1
sudo tc filter add dev enp3s0 parent 1:1 u32 match ip dst 192.168.1.6 flowid 1:30

ping -c1 192.168.1.6
ping -c2 192.168.1.1
sudo tc -s -g class show dev enp3s0 
sudo tc -s filter show dev enp3s0 parent 1:
sudo tc -s filter show dev enp3s0 parent 1:1

第一个过滤器的父级是 qdisc,它将 flowid 设置为内部类1:1。第二个过滤器的父级是内部类1:1,它做出最终裁决,选择叶类1:30

最后 3 个命令的输出:

$ sudo tc -s -g class show dev enp3s0 
+---(1:1) htb rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
     |    Sent 294 bytes 3 pkt (dropped 0, overlimits 0 requeues 0) 
     |    backlog 0b 0p requeues 0
     |
     +---(1:10) htb prio 0 rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
     |          Sent 196 bytes 2 pkt (dropped 0, overlimits 0 requeues 0) 
     |          backlog 0b 0p requeues 0
     |     
     +---(1:20) htb prio 0 rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
     |          Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
     |          backlog 0b 0p requeues 0
     |     
     +---(1:30) htb prio 0 rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
                Sent 98 bytes 1 pkt (dropped 0, overlimits 0 requeues 0) 
                backlog 0b 0p requeues 0


$ sudo tc -s filter show dev enp3s0 parent 1:
filter protocol ip pref 49152 matchall chain 0 
filter protocol ip pref 49152 matchall chain 0 handle 0x1 flowid 1:1 
  not_in_hw
$ sudo tc -s filter show dev enp3s0 parent 1:1
filter protocol all pref 49152 u32 chain 0 
filter protocol all pref 49152 u32 chain 0 fh 800: ht divisor 1 
filter protocol all pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:30 not_in_hw  (rule hit 3 success 1)
  match c0a80106/ffffffff at 16 (success 1 ) 

参见:结果 qdisc 表示为图表

笔记:为了使作为内部类父级的过滤器能够工作,上级内部类或 qdisc 中的过滤器应该引用内部类(使用classid或),即 保留链。flowidqdisc --filter--> inner class --filter--> leaf class

还要确保 htbdefault设置为叶类。

相关内容