ちょっと、API用のサーバを設計していて、お行儀の悪い端末からのアクセスをどう処分するかについて、検討する必要があったのでその時の設定をまとめておく
Apacheを使っていてOSがRedhat系ならmod_evasiveをインストールするのが手っ取り早いと思う
★インストール
epelレポジトリが有効なら
yum install -y mod_evasive
とすればインストールできる
★mod_evasiveの設定
vim /etc/httpd/conf.d/mod_evasive.conf
デフォルトだとこんな感じなので
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
#DOSEmailNotify you@yourdomain.com
#DOSLogDir "/var/log/mod_evasive"
#DOSWhitelist 127.0.0.1
#DOSWhitelist 192.168.0.*
</IfModule>
以下の設定だと
・同一IPから同一ページに2秒間で10回のリクエストがあった場合
・同一IPから同一サイトに1秒間に30回アクセスがあった場合
条件を満たしたら、60秒アクセス禁止(403 Forbidden)にする設定です
検出した場合メールを出せる(DOSEmailNotify)ので設定しておくと過度なアクセスがあった時に役に立ちます
loインターフェース(127.0.0.1)やローカルネットワーク(192.168.*)からのアクセスはホワイトリストで許可しておくといいと思います
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageInterval 2
DOSPageCount 10
DOSSiteInterval 1
DOSSiteCount 30
DOSBlockingPeriod 60
DOSLogDir "/var/log/mod_evasive"
DOSEmailNotify xxxxx@xxxx.jp
DOSWhitelist 127.0.0.1
DOSWhitelist 192.168.*
</IfModule>
■設定の適用にはhttpdのrestartが必要です
性能の低いVPSや、RESTful APIの供給が予想されるサービスを運営するときは設定しておいた方がいいと思う