使用しているHTB構造について疑問があります。
私の目的は、ローカルネットワーク内のユーザーのダウンロードとアップロードの速度を制限することです。ネットワークの各ユーザーは、ドメインの個人リストを持っており、ドメインの速度を上げたり下げたりすることはできません。
つまり、user1はslashdot.orgへのアクセスをダウンロード時8KB、アップロード時3KBに制限することができ、user2はslashdot.orgへのアクセスを4KBダウンおよび1KBアップに制限できます。
今のところ、うまく機能するiptables/tcのカップルをセットアップしますが、規模は非常に小さく、2つまたは3つの仮想ホストを同時に使用します(残念ながら、実際のサイズのテストは実行できません)。
これが私の現在の構造です(LANの出力にあるものだけを表示します。アップロード用のものは単にこれの「コピー」です)
インターフェイスに接続されたHTBqdisc(ハンドル2 :)。デフォルトのトラフィッククラスはクラスFFFFです。
ルートクラス2:1はHTB qdiscの直下にあり、レートと天井リンク容量に上限があります。
2:1の子としてのデフォルトのクラス2:FFFF、レートは1kbsp、上限はDOWNLINK容量。
次に、特定のドメインからのユーザーに新しい制限がある場合に動的に追加される他のクラスがあり、そのドメインからのダウンロード速度を制御するために新しいtcクラスが追加されます。
とりあえず、これが私がしたことです:
一意のID(ここではポイントではなくデータベースから取得)を使用して新しいtcクラスを作成します。親としてクラス2:1、レート値は1bps、ceil値は制限されたダウンロード速度に設定されます。
Tcコマンドは次のとおりです。
-------------- BEGIN SCRIPT --------------
DOWNLINK=800
## Setting up the static tc qdisc and class
$tc qdisc add dev $LAN_IFACE root handle 2: htb default 0xFFFF
# Main class so the default class can borrow bandwith from the others
$tc class replace dev $LAN_IFACE parent 0x2: classid 0x2:0x1 htb rate $DOWNLINK ceil $DOWNLINKkbps
# add the default class of class id 2:a under the main class of classid 2:1
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0xFFFF htb rate 1kbps ceil $DOWNLINKkbps prio 0
# add to the leaf class 2:10 for default traffic a sfq qdisc
$tc qdisc add dev $LAN_IFACE parent 0x2:0xFFFF handle 0xFFFF: sfq perturb 10
## The dynamic part called each time a new restriction for a couple domain/user is added
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0x$idHex htb rate 1bps ceil $speedDownkbps prio 1
# Add the sfq at the leaf class 2:1$id
$tc qdisc add dev $LAN_IFACE parent 0x2:0x$idHex handle 0x$idHex: sfq perturb 10
# $id is the mark added by iptables for this couple domain/user
$tc filter replace dev $LAN_IFACE parent 0x2:0 protocol ip prio 3 handle 0x$id fw flowid 0x2:0x$idHex
-------------- END SCRIPT --------------
すべての通常のトラフィック(速度制限なし)はデフォルトのクラスに移動し、制限されたトラフィックは対応するtcクラスに送信する必要があります。
私が真剣に疑う点は、デフォルトクラスと制限付きクラスに最小1bpsの速度レートを使用することです。作成される制限付きクラスの数を制御できません。また、制限付きクラスの合計レートがルートクラスの1つを超えないようにします。
もう1つのポイントは、デフォルトのprio0と制限付きクラスprio1を追加したため、デフォルトのクラスが借用する必要がある場合(ほとんどの場合、非常に遅いレートに従って)、このクラスは他の制限付きドメインの前に提供されます。しかし、デフォルトクラスのセルをルートクラスの1つとして保持すると、これらのドメインは飢えませんか?
いくつかのカップルドメイン/ユーザーの速度を制限しながら、ユーザーが制限のない使用のために適切な対話性と帯域幅を維持できるようにするにはどうすればよいですか?
Htb qdiscのデフォルトクラスを指定しないと、フィルターに一致しないパケットがハードウェアの速度でキューから取り出されるため、ここでデフォルトクラスが役立つかどうかも疑問に思っています。 (しかし、ここでも制限されたクラスを飢えさせていますか?)
私はtcとネットワークQoSに非常に慣れていないので、アドバイス、批評家(建設的なもの;))を歓迎します。
ヴィンセント。
分類子を含めなかったため、各クラスで正確に意味するトラフィックを推測するのは困難です。たとえば、発信httpまたはsshトラフィックは対話性にとって非常に重要であり、着信httpはそれほど重要ではありません。
サービスごとに特定の帯域幅を保証します。つまり、着信httpdトラフィック用にx kbpsあり、ユーザー間で均等に分割されます。ユーザーが10人または100人の場合は、公平です。」これらの各サービスに優先度の高いユーザーまたは優先度の低いユーザーがいる場合は、それらのクラスと分類子を追加する必要があります。
(また、着信トラフィックではなく、インターフェイスからの発信トラフィックのみを形成できることを知っていることを願っています。つまり、アップリンクを制限したい場合は、インターネットへの発信インターフェイスを使用するか、 中間キューイングデバイス 。lartc.orgガイドは非常に優れたリソースです。)