IPVS のバージョンが 0.9.10 以降では、お互いの新しいコネクション の状態(新しいコネクションがリダイレクトされたサーバーのようなもの)を保つためにエントリーが作られ、128バイトの効率的なメモリーには互いのエントリーが必要なのでエントリーのサイズは124バイトになっている。3つの防御戦略は現在 Dos 攻撃の種類のものに対して実装されている。それらはドロップエントリーディフェンスとドロップパケットディフェンスとセキュアTCPディフェンスです。これらの方法はカーネル内で有効か無効かどうかの変数を sysctl によってコントロールできます。
ドロップエントリーディフェンスは新しいコネクションのメモリを回収するために、コネクションハッシュテーブルからランダムにエントリーをドロップします。現在のコードではドロップエントリーの手順は刻々と行われ、ランダムに全体の32分の1をスキャンし、SYN-RECV/SYNACK 状態にあるエントリーを捨てる。それは syn-flooding 攻撃に対して有効だ。LVS の TCP 状態遷移が IP パケットのフラグによって決められるようになって以来、TCP のシーケンス番号が確認されず本当の TCP 状態遷移ではなかった。そして悪意のある攻撃は SYN パケットを作成し ACK パケットを流すことができる。そうすると ESTABLISHED 状態にあるエントリーを put するように LVS をだますことができる。 ESTABLISHED/UDP 状態にあるエントリーでは、私たちは少し複雑なドロップメカニズムを使う。もし最後に受け取った時間が60秒以内ならばエントリーを捨てない。もし60秒以上ならばやってくるパケットのエントリーカウンタをよく調べてみる。 もしやってくるいくつかのパケットが8よりも大きかったらエントリーはドロップされないで、やってくるパケットが2から8のエントリーをめざして、その数より少ない場合はエントリーをドロップします。
この方法は /proc/sys/net/ipv4/vs/drop_entry の変数を sysctl することでコントロールします。値は0から3までの値を取り、0の場合は disable で1と2の場合は、自動モード(利用可能なメモリが十分でない時、enabled にする場合は2 、disable にする場合は1 )で3の場合はいつでも enabled となる。
もしシステムが有効なメモリーを持っていたら、私たちは有効なメモリーの閾値を使うことができる。この閾値は /proc/sys/net/ipv4/vs/amemthresh の値によって変わり、それはメモリーページユニットの値だ。デフォルトでは1024ページになっている。
もし LVS が分散した DoS 攻撃を受けると、ドロップエントリーディフェンスは分散 DoS 攻撃のせいでコネクション生成のスピードのペースをキープできないかもしれない。ドロップパケットディフェンスはリアルサーバーにパケットをフォワーディングする前にパケットを 1/rate ドロップするよう計画されている。もし rate が1ならやってくる全てのパケットをドロップし、rate が10なら 10分の1のパケットをドロップする。
この方法は /proc/sys/net/ipv4/vs/drop_packet の変数を sysctl を使うことによってコントロールする。値の定義はドロップエントリーの値と同じである。自動モードでは割合は次の公式によって決まっている。
rate = amemthresh / (amemthresh - available_memory) 割合 = 閾値 /(閾値 - 有効メモリー)
有効なメモリーが有効メモリー閾値より少ない場合
3 のモードが設定されている場合、モードがいつもドロップする割合は /proc/sys/net/ipv4/vs/am_droprate の値によってコントロールできる。デフォルトは10である。
セキュアTCPディフェンスはもっと複雑な状態遷移テーブルを使い、互いの状態の短いタイムアウトを使う。NAT を経由したバーチャルサーバーではリアルサーバーがデータとACK パケットを送り始めるまで(3ウェイハンドシェークの後)ESTABLISHED 状態に入るのを遅らせる。
この方法は /proc/sys/net/ipv4/vs/secure_tcp の変数を sysctl を使うことによってコントロールできる。変数の定義は上にあるものと同じです。
セキュアTCP状態のタイムアウトは次の sysctl コマンドでチューニングできる。
セキュアTCPディフェンスでは SYN_RECV 状態の10秒やそれ以下のほとんどないタイムアウトを薦めています。この状態はセキュア TCP の変数が2か3に設定されている時だけ NAT を経由したバーチャルサーバーに使われます。ダイレクトルーティング、トンネリング、ローカルのフォワーディングメソッドでは最初の状態は SYN_ACK です。/proc/sys/net/ipv4/vs/timeout_close /proc/sys/net/ipv4/vs/timeout_closewait /proc/sys/net/ipv4/vs/timeout_established /proc/sys/net/ipv4/vs/timeout_finwait /proc/sys/net/ipv4/vs/timeout_icmp /proc/sys/net/ipv4/vs/timeout_lastack /proc/sys/net/ipv4/vs/timeout_listen /proc/sys/net/ipv4/vs/timeout_synack /proc/sys/net/ipv4/vs/timeout_synrecv /proc/sys/net/ipv4/vs/timeout_synsent /proc/sys/net/ipv4/vs/timeout_timewait /proc/sys/net/ipv4/vs/timeout_udp
$Id: defense.html,v 1.2 2000/04/10 13:11:32 wensong Exp $
Created on: 2000/4/9