攻撃されていまふ
@MINOもお仕事でちょっとしたサーバを運営したり、サイトを運営したりしています。@MINOが扱うような小さいサーバでもいろんな攻撃に晒されるんですよね。
そこで防御の一環としてiptables
を使っています。
iptables
のモジュールでハッシュを使ってアクセスを制御するhashlimit
というものがあります。
DDos攻撃などの大量なアクセス攻撃などの防御に効果を発する機能です。この機能ものすごくありがたいのですが、設定が複雑でいまいち理解できていません。
というのも設定値がどのように働いているかイメージが難しいのです。
hashlimitのオプション
hashlimit
の主な設定値は以下になるかと思います。
オプション | 意味? |
---|---|
hashlimit | 制限する値 |
hashlimit-burst | 上限を越す許容数 |
hashlimit-mode | 何を元に制限をするか |
hashlimit-htable-expire | ハッシュテーブルの有効期限 |
間違った理解その1
最初hashlimit
を知った時以下のような理解で居ました。
いやこれだとhashlimit-burst
どこ行ったんだよ?
間違った理解その2
そこで勉強しなおし。次にイメージしたのは以下のような感じ。
hashlimit-burst
ってのは上限突破の許容回数みたいなので、例えばhashlimit-burst
を5にしたらhashlimit
を5回までは突き抜けていいってことなのかしら?
間違った理解その3
どうもその2も違うようですよ。
理解の仕方が悪かったようで、扱いはアクセスという捉え方をしていたのですが、hashlimit
やhashlimit-burst
はパケットの個数として捉えたほうが理解しやすそうです。
hashlimit-burst
はリミットの許容範囲だということがわかりました。hashlimit
で10/m
(分間10パケット)としている場合、hashlimit-burst
を5
とすると、50
パケットまで許容するということのようなのです。なるほど。わかりにくい。
hashlimit-modeについて
そういえばhashlimit-mode
を忘れていたのですが、 これは何を元に制限をかけるかを設定できるようです。
hashlimit-mode | 意味 |
---|---|
srcip | 送信元IP |
srcport | 送信元Port |
dstip | 宛先IP |
dstport | 宛先Port |
今回は話を単純にするためhashlimit-mode
はsrcip
で(つまり攻撃者のipで制限をする)にしたいと思います。
じゃあこの場合1分間で50
パケットが同一IPから来たら制限ということで良いのかな?こういう感じ?
間違った理解その4
そろそろいい加減に理解したいものですが、どうもその3も違うようです。リミットを越した後に全く制限が掛かるのではなく、hashlimit
分は通してやるよということのようなのです。
なるほどなんか変だと思ったんだ。
つまりこういうイメージかな?
もしかしたらあっているかもしれない理解
hashlimit-htable-expireはリミットの有効期限ではなさそう
しかしいろいろ勉強しているとhashlimit-htable-expire
のイメージがどうも違っているような感じです。
いままでhashlimit-htable-expire
はリミットの有効期限だと思っていたのですが、よくよく考えるとhtable-expire
となっていますから、リミット有効期限では無いわけです。
htable
はおそらくハッシュテーブルの略で、つまりアクセスしてきた(もしくはされた)ipやportのデータベースのことのようです。expire
は期限切れを意味します。
つまり直訳すると「ハッシュデータ有効切れ」ですから、データベースの有効期限がhashlimit-htable-expire
となるようなのです。
たとえばhashlimit-htable-expire 120,000
(2分)とした場合、これはリミットの制限時間が120,000ms
ということではなく、データベースの有効期限が120,000ms
だということになります。
このことをいろいろ調べていくうちに以下のような理解に至りました。
回復する概念の存在
実はhashlimit-burst
には回復の概念があるようなのです。
チケットという言い方をしている方も見かけました。
いままではリミットされるとまた最初から…的な感覚で捉えていたのですが、そもそもリミットにはそれ専用の有効期限が無いようなのですよ。
データベースが有効になっている限り、hashlimit-burst
はhashlimit
の期間につき、1つずつ回復していくということのようなのです。
例えばhashlimit 1/m
でhashlimit-burst 5
とした場合、1分間に5
パケットでリミット発動します。
この状態では次の1分までパケットは制限されます。
そして次に1分にはhashlimit-burst
が1つ回復して、hashlimit-burst 1
の状態になります。ですので1パケットが許容されます。1個だけパケットが通ります
でもこれでhashlimit-burst 0
になるのでまた次の1分までパケットは制限されます。
もしパケットの量がセーブされて次の1分もその次の1分もパケットがこない場合はhashlimit-burst
が順次回復していくことになります。
この挙動をhashlimit-htable-expire
まで、つまりデータベースがリセットされるまで続けます。
hashlimit-htable-expire
で設定した期限がくるとhashlimit-burst
は全回復します。(はず)
つまりリミットには制限時間というのはなく、データベースがリセットされた時にまたパケットのカウントが最初からはじまるということのようなのデス。
一応イメージを図にまとめてみました。今のところの@MINOの理解はこんな感じです。ちょっと図がわかりにくいですが…。
多分この理解であってそうなのですが、どうなんでしょうか?
まとめ
- hashlimitの理解は難しい
- あっているか自信は無い…。