![TC 哈希过滤器 - 单一规则删除](https://linux22.com/image/567123/TC%20%E5%93%88%E5%B8%8C%E8%BF%87%E6%BB%A4%E5%99%A8%20-%20%E5%8D%95%E4%B8%80%E8%A7%84%E5%88%99%E5%88%A0%E9%99%A4.png)
对于流量整形,我当前使用的设置与 LARTC 的设置完全相同,如下所示:
http://lartc.org/howto/lartc.adv-filter.hashing.html
我有一个简单的问题 - 每次我想修改哈希表中的某些内容(例如将 IP 分配给不同的 flowid)时,我都需要删除整个过滤表并逐个过滤器重新添加。(我实际上不是手动执行此操作,我有一个很好的程序可以帮我完成此操作...但仍然...)有一个问题 - 我以这种方式分配了大约 10k 个过滤器,删除并重新填充整个过滤表可能会非常冗长,这对流量整形来说并不好。我的程序可以轻松删除仅需要删除的规则(从而将整个问题减少到几个命令和几毫秒),但我根本不知道只删除一个哈希规则的命令。
我的 tc 过滤器显示:
filter parent 1: protocol ip pref 1 u32
filter parent 1: protocol ip pref 1 u32 fh 2: ht divisor 256
filter parent 1: protocol ip pref 1 u32 fh 2:a:800 order 2048 key ht 2 bkt a flowid 1:101
match 0a0a0a0a/ffffffff at 16
filter parent 1: protocol ip pref 1 u32 fh 2:c:800 order 2048 key ht 2 bkt c flowid 1:102
match 0a0a0a0c/ffffffff at 16
filter parent 1: protocol ip pref 1 u32 fh 800: ht divisor 1
filter parent 1: protocol ip pref 1 u32 fh 800::800 order 2048 key ht 800 bkt 0 link 2:
match 00000000/00000000 at 16
hash mask 000000ff at 16
愿望:'tc filter del ...' 命令删除只有一个特定过滤器(例如 0a0a0a0a IP 匹配(IP 地址 10.10.10.10))。删除一些小子组也是不错的选择 - 例如,我仍然可以非常快速地重新创建一个存储桶(bkt a)。
我的尝试:我尝试使用 prio 对所有过滤器进行编号,但没有帮助——它们只是在下面创建了一些无法使用(但可删除)的东西,但是存储桶中的过滤器在被删除后仍然保留在那里。
有任何想法吗?
编辑-我正在添加该问题的简化的 tl;dr 描述:
我在某些接口上创建了哈希过滤器,就像这样http://lartc.org/howto/lartc.adv-filter.hashing.html
我想找到一个命令,从表中删除一条规则(例如 1.2.1.123),其余规则保持不变并继续运行。
答案1
我知道这是一篇旧帖子,但我正在使用它,而且它似乎效果很好:
添加过滤器:
tc filter add dev eth1 parent 1: handle ::100 prio 1 protocol ip u32 match ip dst 10.10.10.10/32 flowid 1:100
删除过滤器:
tc filter del dev eth1 parent 1: handle 800::100 prio 1 protocol ip u32
只需将所需的每个过滤器的数字更改为“100”
答案2
我尝试了以下命令并且它似乎有效:
$ sudo tc filter delete dev eth1 protocol ip parent 1: prio 1 u32 match ip src 10.10.10.10 flowid 1:2
相同的命令可以与单词 后面的add
、replace
和选项一起使用。delete
filter
答案3
我知道这是一个老问题,但我只想在这里发布,供任何寻求详细答案的人参考。接受的答案有效,但没有解释它是如何工作的。
过滤器句柄(例如2:a:800
)由 3 个部分组成:
- 哈希表
2
- 存储桶
a
(哈希表内部2
) - 过滤索引
800
(存储桶内a
)
这 3 个都是十六进制的。一个哈希表可以有多个 bucket。一个 bucket 可以有多个 filter。
如果创建时未定义,TC 将为您创建默认句柄,即800:0:800
,800:0:8001
依此类推。
要删除哈希表800
桶内的过滤器,您可以执行以下操作:a
2
tc filter del dev eth1 handle 2:a:800 prio 1 u32