![使用 tc 速率限制除来自一个 IP 之外的所有流量](https://linux22.com/image/155162/%E4%BD%BF%E7%94%A8%20tc%20%E9%80%9F%E7%8E%87%E9%99%90%E5%88%B6%E9%99%A4%E6%9D%A5%E8%87%AA%E4%B8%80%E4%B8%AA%20IP%20%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F.png)
目前,我有以下规则来限制端口 22 上的流量。这适用于所有流量,但是我不希望它应用于一个 IP(例如 xxxx),如何做到这一点?因此,如果流量来自 xxxx 和端口 22,则不应有任何速率限制。
tc filter add dev eth1 parent ffff: protocol ip u32 \
match ip sport 22 0xffff \
police rate 800kbit burst 24000 drop flowid :1
答案1
您可以添加一个过滤器,将该 IP 与空的 IP 相匹配行动这会将数据包分类为“通过”,而不经过进一步的过滤器。由于如果不指定优先级,则无法猜测顺序,因此两个过滤器都应该有一个优先事项(又名普里奥或者偏好) 放。因此,如果您想让 IP 192.0.2.10 免受速率限制,您可以用这两个替换您的过滤器:
tc filter add dev eth1 parent ffff: protocol ip priority 1 \
u32 match ip src 192.0.2.10 action pass
tc filter add dev eth1 parent ffff: protocol ip priority 2 \
u32 match ip sport 22 0xffff action police rate 800kbit burst 24000 drop flowid :1
注意警察也是一个动作,但动作关键字是可选的(而对于只有一个经过选项)。
另外,如果它仍然适合这种情况,您应该考虑对出口流量使用整形(在必须丢弃之前延迟),而不是对入口流量进行监管(仅丢弃):这可能会提高性能(避免线路上出现重复的数据包,因为滴)。