いくつかのやり方があります。 Apache でもこの機能をモジュールでサポートしていますが、 ここでは Linux を使ってできること、 他のサービスでも同様に適用できることを示します。 これらのコマンドは、この文書の末尾に示す Jamal Hadi の発表から拝借してきたものです。
http, ftp, ストリーミングオーディオを使っている 2 つの顧客があり、 それぞれに限られた量のバンド幅を販売したいとしましょう。 これはサーバ自身で行います。
顧客 A には最大 2 メガビットを、顧客 B には 5 メガビットを割り当てます。 これらの顧客は、サーバに仮想 IP アドレスを作って分離します。
# ip address add 188.177.166.1 dev eth0 # ip address add 188.177.166.2 dev eth0 |
それぞれのサーバに適切な IP アドレスを割り当てるのは読者にお任せします。 有名なデーモンは、ほぼ間違いなくこの機能をサポートしています。
まず eth0 に CBQ qdisc をアタッチします。
# tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit cell 8 avpkt 1000 \ mpu 64 |
続いて各顧客のクラスを作ります。
# tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate \ 2MBit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21 # tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 10Mbit rate \ 5Mbit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21 |
ここで 2 つのクラスそれぞれにフィルタを追加します。
##FIXME: この行の意味と動作は? divisor とは? ##FIXME: divisor はハッシュテーブルとバケツの数に何か関係があるようだ -ahu # tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 1: u32 divisor 1 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.1 flowid 1:1 # tc filter add dev eth0 parent 1:0 prio 5 u32 match ip src 188.177.166.2 flowid 1:2 |
これで終了です。
FIXME: なぜトークンバケツフィルタが不要なのか? どこかでデフォルトの pfifo_fast に落ちているのか?