前提・実現したいこと
現在、Apache + mod_dosdetector にて簡単なDos対策を行っているのですが、BAN時に503エラーで返していてもApacheのMaxClientsに達してしまいます。
そのため、nginxをリバースプロキシとして使用し、静的コンテンツはnginxで処理し、残りをApacheへパスするようにしようかと考えています。(1ページあたり画像が10~20は使用するため)
nginx標準モジュールでのDos対策m(ngx_http_limit_req_moduleなど)も検討しましたが、今回初めてnginxを導入しており、また数か月後にサーバ機器の切替を行う予定しておりますので、現行・新サーバどちらでも大丈夫となるように、nginx導入時はなるべく最小限の修正で済ませ、サーバ切替後に改めて検討したいという思惑があります。
そのため、nginx導入+mod_rpadによるX-Forwarded-ForからのIP書き戻しにて対処しDoS対策は現行どおりmod_dosdetectorにて行ってみたのですが、Apacheのログとmod_dosdetector でBANしたときに出力されるApacheのerror_logへはリバースプロキシのIPである127.0.0.1が出力されています。
(サイトへリモートIPを表示させる箇所があり、そちらはアクセス元のIPに書き換わっています)
ただ、mod_dosdetectorでBANされた状態で、別端末を用いて異なるリモートIPからアクセスしたところ、なぜかサイトは表示されています。
この現象について何かご存じの方いらっしゃいましたら解決方法をご教授いただけますでしょうか。
設定内容など
・nginxで静的コンテンツとマッチしないものはApacheへ
server {
listen 80 default_server;
server_name example.com www.example.com;
# log
access_log /var/log/nginx/www.example.com.log main;
error_log /var/log/nginx/www.example.com.error.log error;
# error page
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# static contents
location /css/ {
root /home/example.com/public_html;
}
location /images/ {
root /home/example.com/public_html;
}
location /js/ {
root /home/example.com/public_html;
}
location /favicon.ico {
root /home/example.com/public_html;
}
location /robots.txt {
root /home/example.com/public_html;
}
# dynamic contents
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
・Apacheへは、mod_rpaf.soをインストール
http.confは下記のようにしています
(略)
LoadModule dosdetector_module /usr/lib64/httpd/modules/mod_dosdetector.so
LoadModule rpaf_module /usr/lib64/httpd/modules/mod_rpaf.so
(略)
<IfModule dosdetector_module>
DoSDetection On
DoSPeriod XXX
DoSThreshold XXX
DoSHardThreshold XXX
DoSBanPeriod XXX
DoSTableSize XXX
DoSIgnoreContentType .(javascript|png|jpeg|gif|css|flash)
</IfModule>
<IfModule rpaf_module>
RPAF_Enable On
RPAF_ProxyIPs 127.0.0.1
RPAF_Header X-Forwarded-For
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
RPAF_ForbidIfNotProxy Off
</IfModule>
(略)
※dosdetector_moduleの設定値は現サーバで使用しているものとあわせているため、公開できない箇所は「XXX」にしています。
補足情報(言語/FW/ツール等のバージョンなど)
▽ nginx試験導入の環境(数か月後に切り替える新サーバと同環境)
・CentOS 7.2
・Apache 2.4.6 (prefork)
・nginx 1.12.1
・mod_rpad https://github.com/gnif/mod_rpaf.gitをcloneしてインストール
・mod_dosdetector https://github.com/stanaka/mod_dosdetector.gitをcloneしてインストール
▽ 現在のサーバの環境
・CentOS 6.7
・Apache 2.2.15 (prefork)
・mod_dosdetector http://sourceforge.net/projects/moddosdetector/files/moddosdetector/version-0.2/mod_dosdetector-0.2.tar.gzからwgetしてインストール
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
mod_rpaf と mod_dosdetector で、参照している変数が異なっているようです。
Apache httpd 2.2 の場合、mod_rpaf, mod_dosdetector ともに、同じ変数 connection->remote_ip
を参照しています。
一方、Apache httpd 2.4 の場合、mod_rpaf では変数 useragent_ip
を、mod_dosdetector では変数 connection->client_ip
を見ていて、異なっています。
mod_dosdetector.c の下記の箇所を修正するといいのではないでしょうか。
(修正前)
#if (AP_SERVER_MINORVERSION_NUMBER > 2)
address = r->connection->client_ip;
#else
address = r->connection->remote_ip;
#endif
(修正後)
#if (AP_SERVER_MINORVERSION_NUMBER > 2)
address = r->useragent_ip;
#else
address = r->connection->remote_ip;
#endif
ちなみに、mod_rpaf と同様の機能を持つ mod_remoteip
も、変数 useragent_ip
を参照しているようです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.99%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/07/27 15:14
教えていただいた修正にて、Apacheのerror_logに出力されるmod_dosdetectorでBANされたときのログのIPが正しいIPになりました。
(別拠点から同様の手順でBANさせたときは、別拠点のIPを記録するようになりました)
Apacheのaccess_logについては、LogFormatへ %{X-Forwarded-For}i を追加して解決しました。
大変助かりました。ありがとうございました!