iptablesで各種DDoSから身を守る

本日幼稚園児以来の食あたりになりました。
コドラでもなんともないのに、お酒の飲み過ぎ以外でキラキラしたのはものすごい久しぶりです。

さて技術のなさを客に責任転嫁して某ホスティング会社が話題になっていますね。

これ一番の問題は自分のホストがDDoSによって直接ダウンやフラッピングしてしまうことでしょう。
共用サーバなら打つ手なしですが、VPSや専用サーバの場合はiptablesである程度自衛することができます。

各社フィルタリングをしていると発表していますが、内容を明かせないのはセキュリティ的しかたないですよね。
自社ではDDoS対策にiptablesを使っているということもあり、可能な範囲で手法を公開しようと思います。

方法としてはiptablesのhashtablesを使います。
iptablesはフラグやステータス、srcIPやdstIPなど条件を細かくしてハッシュテーブルを作ることができます。
これに対してバーストや最大値などの条件を上回った場合に、例えばDROPなどの動作が指定できます。

つまり特定のIPからSYNのステータスが一定数以上増えた場合、または1秒で指定した回数以上リクエストが来た場合はDROPするという処理ができます。
通常であればSYNをDROPした場合再送までアタック元は待つはずなので、素直にSYN,ACKを返すより相手の手が止まるという効果も期待できるかもしれません。

というように実に簡単なロジックなのですが、こんなこともできないんですかね。

さて具体的な内容です。
なお俺の考えた最強のを参考にさせてもらっています。

iptables -N SYN_FLOOD
iptables -i $IF_EXT -A SYN_FLOOD -p tcp --syn \ # 対象はExternalのIF
         -m hashlimit \
         --hashlimit 100/s \
         --hashlimit-burst 25 \
         --hashlimit-htable-expire 30000 \
         --hashlimit-mode srcip \
         --hashlimit-name t_SYN_FLOOD \
         --hashlimit-htable-max 32768 \
         -j RETURN

# 制限を超えたらSYNはDROP
iptables -i $IF_EXT -A SYN_FLOOD -j LOG --log-prefix "[ATTACK]SYN_FLOOD:" --log-level=debug
iptables -i $IF_EXT -A SYN_FLOOD -j DROP

# SYNフラグはSYN_FLOODチェーンを通す
iptables -i $IF_EXT -A INPUT -p tcp --syn -j SYN_FLOOD

・バーストの上限を制限すること
・合計値の上限を制限すること
・さらにこれらの情報をタイムアウトまで蓄積すること、タイムアウトをもってリセットすること

一般的なウェブサービスではアプライアンスのFWで十分でしょうが、広告配信となるとDDoSと区別がつかないので、手で調整できるiptablesのほうが融通がきくかもしれません。

またフラグやプロトコルを変えれば、例えばHTTP DoSとかにも有効です。

一つ注意しなければいけないのはhtable-maxです。
いずれかに定義した上限値を超えたら問答無用でDROPという条件なので、htable-maxも超えたらDROPされてしまいます。
かといって上限がなければ不測の事態にメモリを食いつぶしてしまいます。
接続元クライアントが多い場合はかなり多めに定義しておくといいでしょう。

ここまで書いておいてiptablesでゴリゴリ処理するのはメモリがすくないVPSだと荷が重いなと思いました。
エンドユーザが頑張るところっじゃなですね。

コメントを残す

メールアドレスが公開されることはありません。


*