Linux-Networking
帶有 iptables 的 QOS 和帶有不穩定 WAN 的 tc
我在 Linux 下有一個路由器/網關,我想添加一些 QoS 來為特定流預留頻寬。這可以通過 iptables/netfilter 和 tc 來完成,但所有範例都是從您事先知道可用的總頻寬這一事實開始的。
問題是,我的 WAN 是移動的 3G 連接,性能參差不齊。第 1 天,我可以有 5 Mbps,下雨天 2 下降到 2 Mbps。我如何保證我的流 1 將始終具有 100Kbps 的低延遲可用?
我想到了一個複雜的解決方案,使用每天或每小時的腳本來檢查頻寬並動態創建和應用 QoS 腳本,但這對我來說不是一個好的解決方案。
您應該能夠使用 hfsc 調度程序實現您的目標。您將有能力保留一部分頻寬並通過“實時”提供低延遲保證,其他類將按比例使用“連結共享”填充其餘頻寬。
這裡重要的是使用實時而不是連結共享,因為實時,為了確保能夠在最後幾毫秒發送數據包,能夠阻止其他類發送數據包。
為了完成你想要的,你需要在根類上設置一個上限(可能是 10MB),但在葉子類上沒有 ul 。由於 hfsc linkshare 在所有“ls”類之間共享頻寬的方式,它們將共享可用頻寬,如果有更多,則超過 m2 值。
例如,您可以使用這種設置:
# dns, ntp, teamspeak iptables -t mangle -A POSTROUTING -o eth0 -p udp -m multiport --dports 53,123,9987 -j CLASSIFY --set-class 1:100 # Default tcp iptables -t mangle -A POSTROUTING -o eth0 -p tcp -j CLASSIFY --set-class 1:200 # Default udp iptables -t mangle -A POSTROUTING -o eth0 -p udp -j CLASSIFY --set-class 1:300 # ROOT QDISC - default goes on class 100 because it's probably arp gratuitous or whois since all ip traffic is already classified tc qdisc add dev eth0 root handle 1:0 hfsc default 100 # ROOT CLASS - Interface eth0, noeud parent de la branche : 1:0, id de la branche : 1:10 tc class add dev eth0 parent 1:0 classid 1:10 hfsc ls m2 10000kbit ul m2 10000kbit # CLASS 100 - VOIP, DNS, NTP tc class add dev eth0 parent 1:10 classid 1:100 hfsc sc m1 400kbit d 10ms m2 100kbit # QDISC tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel quantum 300 noecn # fq_codel requires to change the quantum for low bandwitdth # CLASS 200 - some tcp tc class add dev eth0 parent 1:10 classid 1:200 hfsc ls m1 80kbit d 10ms m2 80kbit # QDISC - some tcp tc qdisc add dev eth0 parent 1:200 handle 210: fq_codel # CLASS 300 - some udp tc class add dev eth0 parent 1:10 classid 1:300 hfsc ls m1 20kbit d 10ms m2 20kbit # ratio tcp / udp will then be 4:1 # QDISC - some udp tc qdisc add dev eth0 parent 1:300 handle 310: fq_codel quantum 300 noecn
值可能需要根據您的需要進行更改,尤其是在 100 類中,儘管我嘗試編寫這些數字以適應您的 3G。