请教一下如何优雅的使用 TC 对大量的 IP 限速

150 天前
 Ansen
使用一台 ubuntu 22.04 为 100 个 IP 提供 nat 上网服务,目前我们需要对这 100 个 IP 进行限速

假设总带宽为 1000mbit ,需要对每个 IP 的最大带宽限制为 10mbit ,且保证每个 IP 的带宽为 10mbit

看了相关教程后,目前我能想到的是为每个 IP 都创建一个 rate 为 10mbit 的 htb 类配合 sfq 来进行限速
这样就意味着 如果 3000 个 IP 就会有 3000 个 htb 子类和 sfq 规则, 这一点都不优雅了, 而且如此多的规则管理起来也是个麻烦事



经过多次查找资料后, 有一个思路就是 将 N 个 IP 加到 ipset 集合里面中去, 然后在 mangle 中对这个集合添加 fwmark,

然后 添加 tc filter 时匹配 该 fwmark, 理论上只需要添加一个 10mbit htb 类和 sfq 就行了


但是根据我查到的资料, 同一个 htb 类下, 所有在线的成员平分该 htb 的 rate , 这就会导致 一个人使用时是 10mbi 带宽, 两个人同时使用就是 5mbit 的带宽了

这就达不到最开始的需求了: 每个 IP 需要保证 10mbit 的带宽且最大仅可使用 10mbit 的带宽, 哪怕总带宽还有剩余


PS: 隔壁公司装修, 吵得脑子都大了, 表述可能有点啰嗦了, 请见谅
3590 次点击
所在节点    Linux
27 条回复
Ansen
147 天前
@Ansen #20 我想要达到的结果是, 所有用户都能独享且最多能 10mbit
huangzhiyia
147 天前
@Ansen

#!/bin/sh -e


# 清除现有的 qdisc
tc qdisc del dev ens33 root
tc qdisc del dev ens33 ingress

# 配置上传( egress )限速
tc qdisc add dev ens33 root handle 1: htb default 30
tc class add dev ens33 parent 1: classid 1:1 htb rate 10000kbit burst 15k

# 限制特定 IP 地址的上传
tc class add dev ens33 parent 1:1 classid 1:10 htb rate 10000kbit
tc filter add dev ens33 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.102.134 flowid 1:10

tc class add dev ens33 parent 1:1 classid 1:20 htb rate 10000kbit
tc filter add dev ens33 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.102.135 flowid 1:20

# 限制所有 IP 地址的上传
tc class add dev ens33 parent 1:1 classid 1:30 htb rate 10000kbit
tc filter add dev ens33 protocol ip parent 1:0 prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:30

# 配置下载( ingress )限速
tc qdisc add dev ens33 handle ffff: ingress

# 限制特定 IP 地址的下载
tc filter add dev ens33 parent ffff: protocol ip prio 1 u32 match ip src 192.168.102.134 police rate 10000kbit burst 10k drop flowid :1
tc filter add dev ens33 parent ffff: protocol ip prio 1 u32 match ip src 192.168.102.135 police rate 10000kbit burst 10k drop flowid :1

# 限制所有 IP 地址的下载
tc filter add dev ens33 parent ffff: protocol ip prio 2 u32 match ip src 0.0.0.0/0 police rate 10000kbit burst 10k drop flowid :1

exit 0
huangzhiyia
147 天前
我测试的时候,这个是只有 7 Mbits/sec 左右,然后把 10000kbit 改成 15mbit 的时候,测试差不多就是 10 Mbits/sec 了
huangzhiyia
147 天前
@Ansen 不好意思,把特定 ip 写进去了,还是无效。看来没有太好的办法
Ansen
147 天前
@zmaplex #24 是的,目前 class 和 ip 一对一的情况下,是能做到我的需求的, 但是一旦 IP 数量多了,管理上就会变得很困难
dode
132 天前
一万个 IP 出去之前加一个交换机,交换机上设置 IP 限速
Ansen
130 天前
@dode #26 交换机拿不到隧道的 IP

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1058794

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX