1. 参考资料
Linux 上的虚拟网络接口,主要要了解一下 IFB,对输入的流量进行整形
IFB
wiki介绍《Linux 高级路由与流量控制手册》关于各种队列
Queue
和排队规则Queueing Disciplines
的介绍Linux 流量控制
Traffic Control
关于
Ingress
和Egress
的介绍关于
HTB - Hierarchical Token Bucket
队列的介绍HTB 官方介绍
2. 内核配置
开启
IFB - Intermediate Functional Block support
, 这个会影响下行限速功能,如果只需要限制上行即出站的流量,也可不启用此模块将
Networking support > Networking options > QoS and/or fair queueing
这一页的内容全部选中,可以选择编译进内核或作为外部模块,开机时加载;- 其中
TBF - Token Bucket Filter
,这个会影响上行限速功能
- 其中
3. tc
工具移植
RK3566 SDK 中
busybox
集成的 tc 工具过于简陋,不支持流量整形,需要重新移植 tc 工具tc工具是
iproute2
中的一个组件,获取iproute2
源码,我选择使用 5.18.0版本编译环境:
Ubuntu20.04
进入源码目录,执行
configure
iproute2-5.2.0$ ./configure
修改
config.mk
中的AR
CC
,指定交叉编译工具链修改
config.mk
, 取消HAVE_SELINUX
HAVE_ELF
HAVE_MNL
HAVE_CAP
这几个宏定义编译
iproute2-5.2.0$ make clean && make
查看编译得到的 tc工具是不是目标平台格式的文件
使用这个 tc工具替换 RK3566 中的
/sbin/tc
3. 限速测试
上行限速,限个
500kbps
试试tc qdisc add dev eth0 root tbf rate 500Kbit latency 50ms burst 15kb
使用
iperf3
上行测速,限速成功下行限速,需要借助一个虚拟网口
ifb0
来实现# 创建一个虚拟网口ifb0,用于流量重定向和整形 ip link add ifb0 type ifb ip link set dev ifb0 up # 将网口eth0入站流量重定向到ifb0 # 在eth0上添加一个入站队列qdisc tc qdisc add dev eth0 handle ffff: ingress # 在eth0上添加一个过滤器,将所有IP包都重定向到网口ifb0上 tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0 # 在网口ifb0上添加一个HTB队列 tc qdisc add dev ifb0 root handle 1: htb default 10 # 创建一个类class,匹配这个类的流量将被限制为500kbps tc class add dev ifb0 parent 1: classid 1:1 htb rate 500Kbit # 创建一个过滤器,将ifb0上的所有流量都匹配到上一步创建的类上 tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:1
使用
iperf3
下行测速,限速成功