12.3. 監視制限 (policing) フィルタ

さらに複雑な設定を可能にするため、 あるバンド幅を越えた場合にマッチするフィルタを導入することもできます。 ある速度を越えたら一切マッチをやめてしまうようなフィルタを宣言することも、 あるいはある速度を越えた分に対してのみマッチさせないようにもできます。

つまり監視制限を 4mbit/s としたときに 5mbit/s のトラフィックがあった場合、 5mbit/s 全部に対してマッチさせないこともできますし、 あるいは 1mbit/s にのみマッチさせず 4mbit/s 分は設定されたクラスに送るようにすることもできます。

バンド幅が設定速度を越えた場合の選択肢としては、 パケットを破棄する、再クラス選別する、 別のフィルタにマッチを試みさせる、などがあります。

12.3.1. 監視制限のやり方

監視制限のやり方は、基本的に 2 つあります。 カーネルに「評価器 (estimator)」を組み込むと、 そのカーネルは各フィルタの依頼を受け、 通過させたトラフィック量が多いか少ないかを測定できます。 これらの評価器は CPU では非常に容易で、一秒に 25 回ずつ、 通過したデータ量を測定してそれらのビットレートを計算します。

別の方法では、再びトークンバケツフィルタが登場します。 こんどはフィルタの内部に置くわけです。 TBF は、設定したバンド幅までのトラフィックにマッチします。 それ以上のパケットがくると、越えた分だけが、 制限越えに対して設定した動作の対象となります。

12.3.2. 制限を越えたときの動作

制限を越えたと判断すると、フィルタは指定された「動作」を行います。 現在 4 つの動作が利用できます。

12.3.3. 例

現在知られている唯一の実例は、 ホストを 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 バイトのパケットは理論的にはあり得ますが、 実際のネットワークではまず存在しないでしょう。