當大量的網路封包在有限的頻寬中傳輸,總有一些服務的封包會因為搶不過其他封包而造成卡頓,例如玩遊戲時,若同時也在下載其他大型檔案,就會造成遊戲卡頓甚至斷線。這時候客製化QOS來決定哪些封包能優先被傳送,就能有效地提升指定服務的順暢度,進而提升使用者在網路上的體驗。
本篇文章接介紹如何在OpenWRT系統上設置QOS
要掌握QOS的設定方式,首先要了解Linux系統的netfilter、iptables、routing table及tc。
iptables及netfilter的詳細用法這邊不贅述,有時間會再寫一篇介紹。
以下是tc的設定方式,在指定的網卡介面中產生若干個佇列,並定義這些佇列的頻寬、優先權及handle number。假設想要把封包導到handle number為100的佇列,只要在iptables裡使用MARK來將該封包標記為100,當MARK與handle number相等時,封包就會被成功導入handle number佇列。
#!/bin/sh
DEVe=`uci get network.wan.ifname`
DEVt=tun0
#Flush
tc qdisc del dev $DEVe root > /dev/null 2>&1
tc qdisc del dev $DEVt root > /dev/null 2>&1
#Classify for Up link
tc qdisc add dev $DEVt root handle 1: htb default 11 #root 1
tc qdisc add dev $DEVe root handle 1: htb default 31 #root 1
tc class add dev $DEVt parent 1: classid 1:1 htb rate 8Mbit ceil 8Mbit prio 0 #class 1.1
tc class add dev $DEVt parent 1:1 classid 1:11 htb rate 8Mbit ceil 8Mbit prio 1 #1.1.1 Game
tc class add dev $DEVe parent 1: classid 1:2 htb rate 20Mbit ceil 20Mbit prio 2 #class 1.2
tc class add dev $DEVe parent 1:2 classid 1:21 htb rate 20Mbit ceil 20Mbit prio 3 #1.2.1 youtube, live
tc class add dev $DEVe parent 1: classid 1:3 htb rate 10Mbit ceil 10Mbit prio 4 #class 1.3
tc class add dev $DEVe parent 1:3 classid 1:31 htb rate 1Mbit ceil 1Mbit prio 5 #1.3.1 SpeedTest, default
tc class add dev $DEVe parent 1:3 classid 1:32 htb rate 6Mbit ceil 6Mbit prio 6 #1.3.2 https, mail, smtp
tc class add dev $DEVe parent 1:3 classid 1:33 htb rate 2Mbit ceil 2Mbit prio 7 #1.3.3 ftp-data
tc class add dev $DEVe parent 1:3 classid 1:34 htb rate ${DL134}Kbit ceil ${DL134}Kbit prio 8 #1.3.4 80port
#Classify for Down link
#tc class add dev $DEVe parent 1: classid 1:4 htb rate 500Kbit ceil 500Kbit prio 9 #class 1.4
#tc class add dev $DEVe parent 1:4 classid 1:41 htb rate 500Kbit ceil 500Kbit prio 10 #1.4.1
echo "Class OK"
#SFQ perturb 10 : reset the algorithm after 10 secs
tc qdisc add dev $DEVt parent 1:11 handle 111: sfq perturb 10
tc qdisc add dev $DEVe parent 1:21 handle 121: sfq perturb 10
tc qdisc add dev $DEVe parent 1:31 handle 131: sfq perturb 50
tc qdisc add dev $DEVe parent 1:32 handle 132: sfq perturb 50
tc qdisc add dev $DEVe parent 1:33 handle 133: sfq perturb 50
tc qdisc add dev $DEVe parent 1:34 handle 134: sfq perturb 50
echo "SFQ OK"
#Filter for UL
tc filter add dev $DEVt parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11 #1.1.1 Game
tc filter add dev $DEVe parent 1:0 protocol ip prio 2 handle 2 fw classid 1:21 #1.2.1 youtube, live
tc filter add dev $DEVe parent 1:0 protocol ip prio 3 handle 3 fw classid 1:31 #1.3.1 default
tc filter add dev $DEVe parent 1:0 protocol ip prio 4 handle 4 fw classid 1:32 #1.3.2 http, https, mail, smtp
tc filter add dev $DEVe parent 1:0 protocol ip prio 5 handle 5 fw classid 1:33 #1.3.3 ftp-data
tc filter add dev $DEVe parent 1:0 protocol ip prio 6 handle 6 fw classid 1:34 #1.3.4 80port
tc filter add dev $DEVe parent 1: prio 7 protocol ip u32 match ip dport 80 0xffff flowid 1:34
echo "filter UL OK"
#Filter for DL
#tc qdisc add dev $DEVe ingress
#tc qdisc add dev $DEVe parent 1:41 handle 141: sfq perturb 50
#tc filter add dev $DEVe parent 1:0 protocol ip prio 7 handle 7 fw police rate 100Mbit burst 100M drop flowid 1:41
#echo "filter DL OK"
設定完成後,再回去確認iptables及routing table是否都有做相對應的設置,接著就能利用tcpdump指令來觀察封包是否有被正確的導入所指定的網卡中。
感謝您耐心閱讀~
本專題將會持續收錄Violet的學習筆記,主題不一。
若有理解不對的地方,歡迎留言指教!
若喜歡我的文章,歡迎贊助支持,您的支持將會成為我繼續創作的動力!