EN JA
SYNCACHE(4)
SYNCACHE(4) FreeBSD Kernel Interfaces Manual SYNCACHE(4)

名称

syncache, syncookiesTCP 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 だけを実行します。

syncachesysctl(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 コードとマニュアルページは Jonathan Lemon <jlemon@FreeBSD.org>によって書かれました。
January 22, 2008 FreeBSD