何か決めなきゃ駄目ですか。


記事の内容

前へ | 次へ

Linuxのbacklogについて
2009/06/19 22:08

少しだけ突っ込んだ話。
(曖昧さは人間の脳内補完に委ねるとして・・・。)

LinuxにはTCPの3Wayハンドシェイク(即ち、SYN,SYN/SCK,ACK)状態保持に関連して、
次のようなパラメータを持っている。

net.ipv4.tcp_max_syn_backlog=1024


何それ?って人は

# sysctl -a | grep tcp


等のコマンドで探します。
# sysctl -a | grep backlog?それじゃノイズが無さすぎて面白くn(ry

これは、「LinuxがSYNを受信し、SYN/ACKで応答した状態をいくつ保持するか」というもの。
閾値を超えると、Linuxは新規に接続しようとするホストのリクエスト(SYN)を無視する。

最近のLinuxを、最近のハードウェアにとりあえずインストールすると、
初期値は上記のような1024とか言う数値になっていると思う。
利用者が多い場合、ほぼ同時にSYNが送信されてくることもままあるため、
一般的に、多くのアクセスが見込まれるサーバにおいては少し多め(4096とか)に設定される。

で、更にLinuxにはsyn cookieという機能がある。
簡単に言うと、ハッシュ値をISNに利用することでSYN Flood攻撃を防ぐものだ。
(最近は最初からONになっているらしいね。RFC違反と言うのは解決したのだろうか。)
動作のトリガーは、先に述べたbacklogの設定値によって決定する。
即ち、1024と設定されていれば、SYN_RECV状態が1024を超えた時にsyn cookie機能が働く。
(※SYN_RECV状態は、LinuxがSYNを受信してSYN/ACKで応答している状態を指す。
  必要であれば、# netstat --inet -an等で確認する)

ただ、syn cookieはRFCに違反しているのかどうか知らないが、
TCPのオプションをことごとく無視するらしい。(wiki情報。未確認)
そんなわけで、俺はSYN Floodなんて怖くないし、window scallingオプション使いたいんだ!
って言い張って、syn cookieをオフにしたとする。

# sysctl -w net.ipv4.tcp_syncookie=0




で、そういう時に限ってSYN Flood攻撃とか受けたりするわけです。
そして、サーバのSYN_RECV領域に空きが無いので、新規セッション張れませーん。
と、こうなる。

で、どれ位攻撃を受けてるんだい?と、下記コマンドを叩く。

# netstat --tcp -an | grep SYN_RECV | wc -l
769


おや?
・・・少ない。

backlogの設定値は1024なんだから、1024じゃねーのかこのやろう?
で、血迷ったようにLinuxのsourceを読むことに。

# apt-cache search source | grep linux
# apt-get install linux-source-2.6.28
# cd /usr/src
# tar -jxvf linux-source-2.6.28.tar.bz
# cd /usr/src/linux-source-2.6.28/net/ipv4
# vi tcp_ipv4.c
1288 else if (!sysctl_tcp_syncookies &&
1289 (sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) <
1290 (sysctl_max_syn_backlog >> 2)) &&
1291 (!peer || !peer->tcp_ts_stamp) &&
1292 (!dst || !dst_metric(dst, RTAX_RTT))) {
1293 /* Without syncookies last quarter of
1294 * backlog is filled with destinations,
1295 * proven to be alive.
1296 * It means that we continue to communicate
1297 * to destinations, already remembered
1298 * to the moment of synflood.
1299 */


あぁ・・・これか。
設定値が1024だとすると、2bit右シフトで256。
比較演算子が"<"だから、同値は除外されて・・・。
1289 , 1290行目の計算を、"(1024 - X)<256"として見れば、
queueの使用量が769になると引っかかるってことか・・・。
何のための設定値なんだか分からんな・・・。

ようするに、Linuxのbacklogの設定は、そのまま実効値になるわけではなく、
実効値 = ( 設定値*0.75 ) + 1 になるというわけだ。
512に設定すると385・・・うん。それっぽい。


なんだかなぁ。
BSDのsyn cache使えよ!

カテゴリ:Server

前へ | 次へ

コメントを見る(0)
コメントを書く
トラックバック(0)
BlogTOP
このユーザーのホーム

ログイン

i-mobile


Powered By FC2ブログ