質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

リバースプロキシ後のmod_dosdetectorのIPについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,317

kedama

score 15

前提・実現したいこと

現在、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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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 を参照しているようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/27 15:14

    ご回答ありがとうございます。
    教えていただいた修正にて、Apacheのerror_logに出力されるmod_dosdetectorでBANされたときのログのIPが正しいIPになりました。
    (別拠点から同様の手順でBANさせたときは、別拠点のIPを記録するようになりました)

    Apacheのaccess_logについては、LogFormatへ %{X-Forwarded-For}i を追加して解決しました。
    大変助かりました。ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる