1. 出口での帯域制限しかできない (入口 qdisc もありますが、 クラスフルな qdisc に比べると非常に機能が限られています)。
2. ある qdisc はひとつのインターフェースにおけるトラフィックしか見ないので、 グローバルな制限を置くことはできません。
最初に思い浮かぶのは、入口での帯域制限を用いて 確実に保証されたバンド幅を使えるようにすることでしょう ;) 設定は他のインターフェースでのものと似ています。
tc qdisc add dev imq0 root handle 1: htb default 20 tc class add dev imq0 parent 1: classid 1:1 htb rate 2mbit burst 15k tc class add dev imq0 parent 1:1 classid 1:10 htb rate 1mbit tc class add dev imq0 parent 1:1 classid 1:20 htb rate 1mbit tc qdisc add dev imq0 parent 1:10 handle 10: pfifo tc qdisc add dev imq0 parent 1:20 handle 20: sfq tc filter add dev imq0 parent 10:0 protocol ip prio 1 u32 match \ ip dst 10.0.0.230/32 flowid 1:10 |
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0 ip link set imq0 up |
iptables の IMQ ターゲットは、mangle テーブルの PREROUTING チェインと POSTROUTING チェインで使えます。 文法は以下の通り:
IMQ [ --todev n ] n : imq デバイスの番号 |
enum nf_ip_hook_priorities { NF_IP_PRI_FIRST = INT_MIN, NF_IP_PRI_CONNTRACK = -200, NF_IP_PRI_MANGLE = -150, NF_IP_PRI_NAT_DST = -100, NF_IP_PRI_FILTER = 0, NF_IP_PRI_NAT_SRC = 100, NF_IP_PRI_LAST = INT_MAX, }; |
出口の imq では、NF_IP_PRI_LAST を用います。 つまり、filter テーブルが破棄したパケットはバンド幅を占有すべきでない、 という事情を尊重しています。
パッチとやや詳しい情報が、 imq のサイト にあります。