想要在 Linux 实现,定时限速 Qos 。这几天一直在头疼这问题。 环境:OpenWrt 、Ubuntu 、tc 、iptables
想法:仅用 iptables 只能对包限制,限速并不理想,所以希望能够用 tc + iptables 实现类似爱快的 Qos 。
或者有更加优雅的 Qos 方法?要是用 crontab +脚本 来实现,感觉就不太「完美」,。
# 下行限速
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
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
# 加载 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 都无效,但是看到网上又有成功的案例?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.