
F5のような連続アクセスによる負荷をかけるDoSに対してWEBサーバにはRate Limitingのモジュールが用意されています。このモジュールは悪戯目的の単純なものであれば、同一IPのアクセス数からバーストさせることにより十分凌ぐことが出来ます。
予め何も対策しておかなかった場合は、DoS攻撃中はSSH等のリモート接続も出来なくなるのでどうしようもなくなります。そんなわけで今回はNginxで出来るDoS対策のご紹介。
DoSの小規模レベル対策
- サーバ側の対策
FW, IPS/IDS, DoS対策モジュールの導入, カーネルチューニング(SYN flood….etc), Rate Limiting - クラウド側のFWでの遮断
遮断後にログからサーバ側でのフィルタリング - 物理のスイッチでの遮断
遮断後にログからサーバ側でのフィルタリング - CDN導入
- クラウド型WAF
- DDoS対応のクラウドを使う
AWS・・・UDP関連のDNSはALBを導入することで対応可能。HTTPのDDoSははサーバを並べることで解決できる。またはAWS WAFやShieldの有料プランを利用する。
IBM Bluemixなど・・・DDoS検知でPublicIPでの公開が遮断されるものの、プライベートネットワークで設定操作可能 - 海外IPからのアクセスを弾く
GeoIP, ipsetなどで海外IPを弾き、国内IPのみ許可する。
国内IPで犯罪行為する人は少ないので、認証系など特定ポートにこのフィルターをかけておくと固定IPでなくてもだいぶセキュアになりますよ!
WEBサーバ NginxでのRate Limiting対応

今回はサーバ側の対策としてNginxのRate Limitingである、ngx_http_limit_req_moduleを使ってみます。
公式サンプル
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
@see Module ngx_http_limit_req_module
上記のサンプルでは同一IPからの秒間1回のリクエスト対して503エラーを返します。但し、locationディレクティブのほうを見ると5回までのバーストを許す設定です。
設定サンプル
http {
(略)
limit_req_zone $binary_remote_addr zone=limit_zone:10m rate=50r/s;
limit_req zone=limit_zone burst=30 nodelay;
(略)
}
クライアント側環境の何かの不具合で誤検知による不具合が発生してもいけないので、そこまで敏感でもなく、でも念の為といったゆったりした設定にすると良いかもしれません。
また、nodelayオプションをかけることでburstまでそのまま通過させてくれます。
実際のところ、ブログ系でキャッシュを効かせていい環境ならF5程度は大丈夫…(۶•̀ᴗ•́)۶セイッ
お疲れ様です。
