さらに複雑な設定を可能にするため、 あるバンド幅を越えた場合にマッチするフィルタを導入することもできます。 ある速度を越えたら一切マッチをやめてしまうようなフィルタを宣言することも、 あるいはある速度を越えた分に対してのみマッチさせないようにもできます。
つまり監視制限を 4mbit/s としたときに 5mbit/s のトラフィックがあった場合、 5mbit/s 全部に対してマッチさせないこともできますし、 あるいは 1mbit/s にのみマッチさせず 4mbit/s 分は設定されたクラスに送るようにすることもできます。
バンド幅が設定速度を越えた場合の選択肢としては、 パケットを破棄する、再クラス選別する、 別のフィルタにマッチを試みさせる、などがあります。
監視制限のやり方は、基本的に 2 つあります。 カーネルに「評価器 (estimator)」を組み込むと、 そのカーネルは各フィルタの依頼を受け、 通過させたトラフィック量が多いか少ないかを測定できます。 これらの評価器は CPU では非常に容易で、一秒に 25 回ずつ、 通過したデータ量を測定してそれらのビットレートを計算します。
別の方法では、再びトークンバケツフィルタが登場します。 こんどはフィルタの内部に置くわけです。 TBF は、設定したバンド幅までのトラフィックにマッチします。 それ以上のパケットがくると、越えた分だけが、 制限越えに対して設定した動作の対象となります。
これはとてもシンプルで、パラメータは avrate のひとつだけです。 流量が avrate 以内に留まっていると、フィルタはこのトラフィックを 設定された classid にクラス選別します。 流量がこれを越えると、指定された動作 (このデフォルトは「再クラス選別 (reclassify)」) を行います。
カーネルはバンド幅に指数重み付け移動平均を用います。 これは短期間のバーストにはあまり敏感ではありません。
次のパラメータを用います:
burst/buffer/maxburst
mtu/minburst
mpu
rate
これらの動作は、トークンバケツフィルタの節で説明したものとほぼ同じです。 しかし注意してほしいのですが、TBF 制限器の mtu を小さくしすぎると、 まったくパケットが通りません。これに対し、出口 (egress) での TBF qdisc では、 パケットの通過を遅くするだけです。
別の違いは、制限器ではパケットを通すか破棄するかしかできないことです。 パケットを保持して遅延させることはできません。
制限を越えたと判断すると、フィルタは指定された「動作」を行います。 現在 4 つの動作が利用できます。
このフィルタはマッチしませんが、他のフィルタにマッチを試みさせます。
これは極めて厳しい選択肢で、ある速度を越えたトラフィックを単に破棄します。 これは入口の監視制限で良く用いられ、利用を制限します。 例えば、5mbit/s を越えるパケットを送ると落ちてしまうような ネームサーバがある場合、入口フィルタを用いれば、 これ以上のパケットを送らないようにできます。
トラフィックを問題なく通します。複雑なフィルタを無効にしたいけれども、 そのまま配置はしておきたい場合に使います。
ほとんどの場合はベストエフォートの再クラス選別になります。 これがデフォルトの動作です。
現在知られている唯一の実例は、 ホストを SYN フラッドから守る の節で説明しています。
到着する icmp トラフィックを 2kbit に制限し、 これを越えたパケットを置とします。
tc filter add dev $DEV parent ffff: \ protocol ip prio 20 \ u32 match ip protocol 1 0xff \ police rate 2kbit buffer 10k drop \ flowid :1 |
パケットのサイズを適当な値に制限します (ここでは 84 バイトより大きなパケットはすべて落とします)。
tc filter add dev $DEV parent ffff: \ protocol ip prio 20 \ u32 match tos 0 0 \ police mtu 84 drop \ flowid :1 |
この方法を用いると、すべてのパケットを落とせます。
tc filter add dev $DEV parent ffff: \ protocol ip prio 20 \ u32 match ip protocol 1 0xff \ police mtu 1 drop \ flowid :1 |
これは実際には 1 バイトより大きな icmp パケットを落とします。 サイズ 1 バイトのパケットは理論的にはあり得ますが、 実際のネットワークではまず存在しないでしょう。