web-dev-qa-db-ja.com

iptablesを使用したQOSと不安定なtc WAN

Linuxでルーター/ゲートウェイを使用していますが、特定のフロー用に帯域幅を予約するためにQoSを追加したいと思います。これはiptables/netfilterとtcを使用して実行できますが、すべての例は、使用可能な合計帯域幅を事前に知っているという事実から始まります。

問題は、私のWANは移動する3G接続であり、パフォーマンスが変動することです。1日目は5 Mbps、雨の2日目は2Mbpsになります。どうすれば保証できますか。フロー1は常に100Kbpsを低遅延で利用できますか?

帯域幅をチェックし、QoSスクリプトを動的に作成して適用するための毎日または毎時のスクリプトを使用する複雑なソリューションを考えましたが、それは私にとって良いソリューションではありません。

1

Hfscスケジューラーで目標を達成できるはずです。帯域幅の一部を予約し、「リアルタイム」で低遅延を保証する機能があります。他のクラスは、残りの帯域幅を「リンクシェア」で比例的に満たします。

ここでは、リンクシェアではなくリアルタイムを使用することが重要です。リアルタイムは、最後のミリ秒で確実にパケットを送信できるようにするために、他のクラスを停止してパケットを送信できるためです。

目的を達成するには、ルートクラスの上限を高くする方法(おそらく10MB)を設定する必要がありますが、リーフクラスの上限は設定しないでください。 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に合うようにこれらの数値を書き込もうとしました。

Hfscとそのしくみについて詳しくは、man tc-hfsc、 この投稿 、および この記事 の詳細をご覧ください。

1
Sanael