2016/10/18 20:13:31

iptablesのhashlimitの設定が難しすぎて理解しようと頑張った話

目次(クリックするとジャンプします)
  • 1:攻撃されていまふ
  • 2:hashlimitのオプション
  • 3:間違った理解その1
  • 4:間違った理解その2
  • 5:間違った理解その3
  • 5.1:hashlimit-modeについて
  • 6:間違った理解その4
  • 7:もしかしたらあっているかもしれない理解
  • 7.1:hashlimit-htable-expireはリミットの有効期限ではなさそう
  • 7.2:回復する概念の存在
  • 8:まとめ

攻撃されていまふ

@MINOもお仕事でちょっとしたサーバを運営したり、サイトを運営したりしています。@MINOが扱うような小さいサーバでもいろんな攻撃に晒されるんですよね

そこで防御の一環としてiptablesを使っています。

iptablesのモジュールでハッシュを使ってアクセスを制御するhashlimitというものがあります。

DDos攻撃などの大量なアクセス攻撃などの防御に効果を発する機能です。この機能ものすごくありがたいのですが、設定が複雑でいまいち理解できていません。

というのも設定値がどのように働いているかイメージが難しいのです。

hashlimitのオプション

hashlimitの主な設定値は以下になるかと思います。

オプション 意味?
hashlimit 制限する値
hashlimit-burst 上限を越す許容数
hashlimit-mode 何を元に制限をするか
hashlimit-htable-expire ハッシュテーブルの有効期限

間違った理解その1

最初hashlimitを知った時以下のような理解で居ました。

hashlimit-1

いやこれだとhashlimit-burstどこ行ったんだよ?

間違った理解その2

そこで勉強しなおし。次にイメージしたのは以下のような感じ。

hashlimit-2

hashlimit-burstってのは上限突破の許容回数みたいなので、例えばhashlimit-burstを5にしたらhashlimitを5回までは突き抜けていいってことなのかしら?

間違った理解その3

どうもその2も違うようですよ。

理解の仕方が悪かったようで、扱いはアクセスという捉え方をしていたのですが、hashlimithashlimit-burstはパケットの個数として捉えたほうが理解しやすそうです。

hashlimit-burstはリミットの許容範囲だということがわかりました。hashlimit10/m(分間10パケット)としている場合、hashlimit-burst5とすると、50パケットまで許容するということのようなのです。なるほど。わかりにくい。

hashlimit-modeについて

そういえばhashlimit-modeを忘れていたのですが、 これは何を元に制限をかけるかを設定できるようです。

hashlimit-mode 意味
srcip 送信元IP
srcport 送信元Port
dstip 宛先IP
dstport 宛先Port

今回は話を単純にするためhashlimit-modesrcipで(つまり攻撃者のipで制限をする)にしたいと思います。

じゃあこの場合1分間で50パケットが同一IPから来たら制限ということで良いのかな?こういう感じ?

hashlimit-3

間違った理解その4

そろそろいい加減に理解したいものですが、どうもその3も違うようです。リミットを越した後に全く制限が掛かるのではなく、hashlimit分は通してやるよということのようなのです。

なるほどなんか変だと思ったんだ。

つまりこういうイメージかな?

hashlimit-4

もしかしたらあっているかもしれない理解

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-bursthashlimitの期間につき、1つずつ回復していくということのようなのです。

例えばhashlimit 1/mhashlimit-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-ap

多分この理解であってそうなのですが、どうなんでしょうか?

まとめ

  • hashlimitの理解は難しい
  • あっているか自信は無い…。