« スパムサイト作成講座47 - 楽ワード「モバイル版」のその後 | メイン | フレッシュリーダー 地味にマイナーバージョンアップのお知らせ »

2007年12月17日

iptables による Dos 対策の設定方法 あとで読む

秋口に調べた記録が出てきたので、認識確認も含めて公開しておきます。読者層も考えず、たまには技術系。なので興味の無い方はスルーの方向で。
#そして、間違いがあったら教えてください。。


iptables の --limit とか --limit-burst を使って Dos 対策っぽい設定をすることができるのですが、この数値の説明がまったくもって意味不明。何を読んでも結局「経験で値を決める」みたいなことになっていて、ぜんぜん役に立たない。

で、結局以下のような結論にたどり着きました。

--limit : パケットを通過させるのにこれだけ時間がかかるとして
--limit-burst : これだけの長さのバッファ、つまり待ち行列を用意する

待ち行列からあふれると、パケットロス、つまり呼損とするわけです。きっと。

たとえば、

/sbin/iptables -A INPUT -p tcp --syn -m limit --limit 250/s --limit-burst 500 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --syn -j DROP

なんて書けば SYN パケットを一秒あたり 250 個のペースで通過させて、待ち行列は 500 個用意。これを超えると Dos とみなしてパケットを落とす、と。

#対策といっても貝の口を閉じるだけなので、そもそもこの設定自体「気休め」だというのは置いといて・・・


さて、この数値の決定方法ですが、上記の解釈から

M/D/1/K 待ち行列モデル

と呼ばれているものに近いとわかります。これはランダム到着(M)をするパケットを、一定時間(D)で1つのサービス(1)によって処理し、最大並べるパケット数(K)が有限である、と。

平たくいえば、一人しか座れない吉野家があり、そこにランダムに客が到着する。客は必ず1分かけて牛丼を平らげて出て行く。そして物理的な制約から店には 20 人までしか並べない。20人並んでる状態で店に到着すると「お前は Dos だ」と言われて追い返される、と。

まぁ、そんなところでしょうか。


さて、難しい理論はさておき、じゃぁいったい数値をどうすればいいの?ということなのですが、こうなると結構簡単です。

まず、ログを見てサーバーのピークトラフィックを算出します。

で、そのピークの状態で「まだまだ余裕」なら、利用率を 0.5 程度、つまり半分くらいのパワーでトラフィックをさばけていると仮定します。
※実際には Load Average / CPU数 を利用率とみなしていただければ良いかと。

この場合 とある数式よりバッファ容量が 10 もあれば、呼損率は 0.001% 程度になります。
あとはバッファの容量を倍にすると呼損率が一桁下がるということを覚えておけば、たとえばシックスシグマっぽく、10億分の 2 程度まで呼損率を下げたいなら、バッファ容量を 100 程度にすれば良い、ということがわかります。

同様にとある数式より、利用率が 0.7 なら 16, 0.9 なら 45 程度のバッファが必要です(呼損率 0.001%程度の場合。なのでこの10倍程度の値を使うのが良いかと)。

ただ、利用率が高い状態で大きなバッファを取ると本末転倒になるので、バッファサイズはあくまでもサーバーの許容範囲でとめておくのが良いかと思います。


まとめると、ピーク時 100リクエスト/s , Load Average/ CPU が 0.5 以下のサーバーなら

/sbin/iptables -A INPUT -p tcp --syn -m limit --limit 200/s --limit-burst 100 -j ACCEPT

という設定をしておけば概ね問題なし、ということになります。たぶん。
※limit の 200 = 100 / 0.5 です。


ということでいいのかな。理論より私の生半可な知識の方がが危ういですが・・・。
何か間違っている気もしつつ、誰かの役に立つかもしれないので公開しておきます。

投稿者 aka : 2007年12月17日 23:58  / 2007年12月 / サーバー管理

トラックバック

人気ブログランキング - a++ My RSS 管理人ブログ

このエントリーのトラックバックURL:
http://133.242.136.64/mt-tb-sf.cgi/658

コメント

コメントしてください

あわせて読みたい




保存しますか?