15.3. ICMP を帯域制限して dDoS を防ぐ

昨今のインターネットでは、分散利用不能攻撃 (distributed denaial of service attack: dDoS) が頭の痛い問題になっています。 ネットワークに正しくフィルタリングと帯域制限をかけると、 このような攻撃の対象 (および原因) となることをいずれも防げます。

ネットワークにフィルタをかけ、送信元アドレスがローカルでない IP パケットは、 ネットワークを出て行けないようにします。 こうすると、匿名でゴミをインターネットに送ることができなくなります。

帯域制限は、先に示したものと同様です。 読者のメモリをリフレッシュするために、再び ASCII 図を示しましょう。

[The Internet] ---<E3, T3, whatever>--- [Linux router] --- [Office+ISP]
                                      eth1          eth0

まず、あらかじめ必要な部分の設定です。

# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
# tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
  10Mbit allot 1514 prio 5 maxburst 20 avpkt 1000

インターフェースが 100Mビット (あるいはそれ以上) だったら、 3 つの数値を調整してください。次に、ICMP トラフィックを どの程度許可するかを決めます。tcpdump で測定を行ってみて、 しばらく結果をファイルに記録し、 どの程度の ICMP がネットワークを流通しているか見てみましょう。 snapshot の長さを増やすのを忘れないように。

測定ができない場合は、利用できるバンド幅の 5% にしてみるといいでしょう。 ではクラスを設定しましょう。
# tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \
  100Kbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 250 \
  bounded

これで 100Kビット に制限しました。 ではフィルタを追加して、 ICMP トラフィックをこのクラスに割り当てるようにしましょう。
# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip
  protocol 1 0xFF flowid 10:100