Linux-Networking

帶有 iptables 的 QOS 和帶有不穩定 WAN 的 tc

  • March 14, 2016

我在 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。

您應該閱讀有關 man tc-hfsc、這篇文章這篇文章的更多資訊,以了解有關 hfsc 及其工作原理的更多資訊。

引用自:https://serverfault.com/questions/762921