想要在 Linux 实现,定时限速 Qos 。这几天一直在头疼这问题。 环境:OpenWrt 、Ubuntu 、tc 、iptables
想法:仅用 iptables 只能对包限制,限速并不理想,所以希望能够用 tc + iptables 实现类似爱快的 Qos 。

或者有更加优雅的 Qos 方法?要是用 crontab +脚本 来实现,感觉就不太「完美」,。
1 、仅用 tc 上行 下载限制均 成功
# 下行限速
tc qdisc add dev br-lan root handle 1: htb default 10
tc class add dev br-lan parent 1:0 classid 1:1 htb rate 1000mbit
tc class add dev br-lan parent 1:1 classid 1:11 htb rate 20mbit ceil 50mbit
tc class add dev br-lan parent 1:1 classid 1:12 htb rate 35mbit ceil 100mbit
tc filter add dev br-lan protocol ip parent 1:0 prio 0 u32 match ip dst 192.168.1.170/32 flowid 1:11
#################################################################
# 上行限速
# 加载 ifb 驱动并创建 ifb 网卡
ip link add dev br-lan-ifb name br-lan-ifb type ifb
ip link set dev br-lan-ifb up
# 将 br-lan 流量全部重定向到 br-lan-ifb 处理
tc qdisc add dev br-lan ingress
tc filter add dev br-lan parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev br-lan-ifb
tc qdisc add dev br-lan-ifb root handle 1: htb default 10
tc class add dev br-lan-ifb parent 1:0 classid 1:1 htb rate 30mbit
tc class add dev br-lan-ifb parent 1:1 classid 1:11 htb rate 1mbit ceil 2mbit
tc class add dev br-lan-ifb parent 1:1 classid 1:12 htb rate 3mbit ceil 4mbit
tc filter add dev br-lan-ifb protocol ip parent 1:0 prio 0 u32 match ip src 192.168.1.170/32 flowid 1:12
清空规则
tc qdisc del dev br-lan root 2>/dev/null
tc qdisc del dev br-lan ingress 2>/dev/null
tc qdisc del dev br-lan-ifb root 2>/dev/null
ip link del dev br-lan-ifb 2>/dev/null
iptables -t mangle -F POSTROUTING
iptables -t mangle -F PREROUTING
iptables -t mangle -L
2 、tc + iptables 下行限速 成功
tc qdisc add dev br-lan root handle 1: htb default 10
tc class add dev br-lan parent 1:0 classid 1:1 htb rate 1000mbit
tc class add dev br-lan parent 1:1 classid 1:11 htb rate 20mbit ceil 50mbit
tc class add dev br-lan parent 1:1 classid 1:12 htb rate 35mbit ceil 100mbit
# 替换 tc filter add dev br-lan protocol ip parent 1:0 prio 0 u32 match ip dst 192.168.1.170/32 flowid 1:11
tc filter add dev br-lan parent 1:0 protocol ip prio 0 handle 1011 fw classid 1:11
iptables -t mangle -A POSTROUTING -d 192.168.1.170 -j MARK --set-xmark 1011
iptables -t mangle -A POSTROUTING -d 192.168.1.170 -j RETURN

3 、tc + iptables 上行限速 失败
# 加载 ifb 驱动并创建 ifb 网卡
modprobe ifb numifbs=1
# 加载 ifb 驱动并创建 ifb 网卡
ip link add dev br-lan-ifb name br-lan-ifb type ifb
ip link set dev br-lan-ifb up
# 将 br-lan 流量全部重定向到 br-lan-ifb 处理
tc qdisc add dev br-lan ingress
tc filter add dev br-lan parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev br-lan-ifb
tc qdisc add dev br-lan-ifb root handle 1: htb default 10
tc class add dev br-lan-ifb parent 1:0 classid 1:1 htb rate 30mbit
tc class add dev br-lan-ifb parent 1:1 classid 1:11 htb rate 1mbit ceil 2mbit
tc class add dev br-lan-ifb parent 1:1 classid 1:12 htb rate 3mbit ceil 4mbit
#替换 tc filter add dev br-lan-ifb protocol ip parent 1:0 prio 0 u32 match ip src 192.168.1.170/32 flowid 1:12
tc filter add dev br-lan-ifb parent 1:0 protocol ip prio 1 handle 1021 fw classid 1:12
# 失败
iptables -t mangle -A PREROUTING -s 192.168.1.170 -j MARK --set-xmark 1011
iptables -t mangle -A PREROUTING -s 192.168.1.170 -j RETURN

尝试 PREROUTING POSTROUTING -s -d 都无效,但是看到网上又有成功的案例?
