SYNCACHE(4) | FreeBSD Kernel Interfaces Manual | SYNCACHE(4) |
名称
syncache, syncookies — TCP SYN キャッシュを制御するための sysctl(8) MIB書式
-
sysctl net.inet.tcp.syncookies -
sysctl net.inet.tcp.syncookies_only
-
sysctl net.inet.tcp.syncache.hashsize -
sysctl net.inet.tcp.syncache.bucketlimit -
sysctl net.inet.tcp.syncache.cachelimit -
sysctl net.inet.tcp.syncache.rexmtlimit -
sysctl net.inet.tcp.syncache.count
解説
syncache sysctl(8) MIB は、SYN フラッドサービス拒絶攻撃を扱うのことを目的としているシステムの TCP SYN キャッシュを制御するために使用されます。TCP SYN セグメントが listen (接続を受け付け) ソケットに対応するポートで受信されるとき、エントリは syncache で作られ、SYN,ACK セグメントはピア (相手側) に返されます。 syncache エントリは、初期の SYN、SYN,ACK 再送信を実行することための十分な状態、から TCP オプションを保持し、 TCP 制御ブロック終点より少ないスペースを取ります。システムは SYN,ACK のための ACK を含み、 syncache エントリに一致する着信セグメントによって syncache エントリに格納されているオプションと共に TCP 制御ブロックを作成します。 syncache エントリは次に開放されます。
syncache は、サーバに保存された状態の量を最小にして、 syncache の全体的なサイズを制限することによって、 SYN フラッド DoS 攻撃からシステムを保護します。
syncookies はネットワークで初期の SYN に関する状態を維持することによって syncache のサイズを実質的に拡張する方法を提供します。 syncookies を有効にすると、クライアントマシンへの SYN,ACK 応答で暗号の値を送信し、次に、それは、クライアントの ACK で返されます。対応するエントリが syncache で見つからないが、値が特定のセキュリティチェックを通過するなら、接続を受け付けられます。これは syncache が着信接続のボリュームを扱うことができない場合にだけ使用され、前のエントリはキャッシュから取り除かれます。
syncookies には、パラノイアの (こだわり過ぎる) 管理者が注意したい特定の数の不利な点があります。初期の SYN からの TCP オプションが保存されないので、ウィンドウのスケール、タイムスタンプ、または正確な MSS サイズ処理のような機能の使用を除外して、それらは接続に適用されません。返ってくる ACK が接続を確立するとき、攻撃者が接続を作成する試みでマシンを ACK フラッド (あふれさせる) することが可能であるかもしれません。この危険を軽減するための方法が取られているとはいえ、これは SYN ビットセットで着信セグメントがフィルタするファイアウォールを迂回させる方法を提供するかもしれません。
syncache を無効にするためには、 net.inet.tcp.syncookies_only を 1 に設定して、 syncookies だけを実行します。
syncache は sysctl(3) MIB の net.inet.tcp.syncache ブランチにおける多くの変数を実装しています。これらのいくつかは loader(8) で対応する変数を設定することによって、調整することができます。
- hashsize
- syncache ハッシュテーブルのサイズは 2 の冪乗でなければなりません。 loader(8) を通して調整可能な読み込み専用変数です。
- bucketlimit
- ハッシュテーブルの各バケットで許可されるエントリの数の制限です。これは最小の検索時間にするの低い値とされるべきです。 loader(8) を通して調整可能な読み込み専用変数です。
- cachelimit
- syncache のエントリの総数を制限します。デフォルト ( hashsize × bucketlimit) はメモリ消費を最小にするように低く設定されます。 loader(8) を通して調整可能な読み込み専用変数です。
- rexmtlimit
- 破棄される前に再送信される SYN,ACK の最大の回数です。デフォルトの 3 回の再送信は 45 秒のタイムアウトに対応し、この値はクライアントマシンへの RTT によって増加されるかもしれません。 sysctl(3) を通して、調整可能な変数です。
- count
- syncache (読み込み専用) に存在するエントリの数です。
syncache の性能における統計値は、次のカウントを提供する、 netstat(1) を通して取得されるかもしれません:
-
syncache entries added
- syncache に成功して挿入されたエントリ。
-
retransmitted
- タイムアウトの期限切れが原因で SYN,ACK 再送信。
-
dupsyn
- 既存のエントリに一致する着信 SYN セグメント。
-
dropped
- SYN,ACK が送信できなかったので、落とされた SYN。
-
completed
- 接続は成功して完了。
-
bucket overflow
- エントリはバケットのサイズを越えるために落とされました。
-
cache overflow
- エントリは全体的なキャッシュサイズを越えるために落とされました。
-
reset
- RST セグメントは受信されました。
-
stale
- エントリは、最大の再送信または listen (接続を受け付け) ソケット消失のために落とされました。
-
aborted
- 新しいソケット割り付けに失敗。
-
badack
- エントリは悪い ACK 返答のために落とされます。
-
unreach
- エントリは ICMP 到達不可能メッセージのために落とされます。
-
zone failures
- 新しい syncache エントリの割り付けに失敗。
-
cookies received
- ACK を含むセグメントから作成された接続。
歴史
既存の syncache 実装は FreeBSD 4.5 ではじめて登場しました。 syncache のオリジナルの概念は、 BSD/OS で元々登場し、後で NetBSD によって変更され、次にここでさらに拡張されました。作者
syncache コードとマニュアルページは <jlemon@FreeBSD.org>によって書かれました。January 22, 2008 | FreeBSD |