DoS アタックからの LVS の防御戦略

IPVS のバージョンが 0.9.10 以降では、お互いの新しいコネクション の状態(新しいコネクションがリダイレクトされたサーバーのようなもの)を保つためにエントリーが作られ、128バイトの効率的なメモリーには互いのエントリーが必要なのでエントリーのサイズは124バイトになっている。3つの防御戦略は現在 Dos 攻撃の種類のものに対して実装されている。それらはドロップエントリーディフェンスとドロップパケットディフェンスとセキュアTCPディフェンスです。これらの方法はカーネル内で有効か無効かどうかの変数を sysctl によってコントロールできます。

1. ドロップエントリーディフェンス

ドロップエントリーディフェンスは新しいコネクションのメモリを回収するために、コネクションハッシュテーブルからランダムにエントリーをドロップします。現在のコードではドロップエントリーの手順は刻々と行われ、ランダムに全体の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ページになっている。

2. ドロップパケットディフェンス

もし 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である。

3. セキュアTCPディフェンス

セキュアTCPディフェンスはもっと複雑な状態遷移テーブルを使い、互いの状態の短いタイムアウトを使う。NAT を経由したバーチャルサーバーではリアルサーバーがデータとACK パケットを送り始めるまで(3ウェイハンドシェークの後)ESTABLISHED 状態に入るのを遅らせる。

この方法は /proc/sys/net/ipv4/vs/secure_tcp の変数を sysctl を使うことによってコントロールできる。変数の定義は上にあるものと同じです。

セキュアTCP状態のタイムアウトは次の sysctl コマンドでチューニングできる。

/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
セキュアTCPディフェンスでは SYN_RECV 状態の10秒やそれ以下のほとんどないタイムアウトを薦めています。この状態はセキュア TCP の変数が2か3に設定されている時だけ NAT を経由したバーチャルサーバーに使われます。ダイレクトルーティング、トンネリング、ローカルのフォワーディングメソッドでは最初の状態は SYN_ACK です。

$Id: defense.html,v 1.2 2000/04/10 13:11:32 wensong Exp $
Created on: 2000/4/9