web-dev-qa-db-ja.com

nginxはヘッダーのIPをApacheに転送しません(rpafが有効になっています)

サーバーでnginxをフロントエンドとして、Apacheをバックエンドとして設定しようとしています。すべていつものように、libapache2-mod-rpafをインストールしました。ただし、Apacheは実際のクライアントIPを認識せず、IPに基づく一部の.htaccess制限はまったく機能しないため、ApacheはローカルIPのみを認識します。

これがnginx仮想ホストの構成です^

server {
    listen 80;
    server_name domain;
    location ~* ^/(admin/|dump/|) {
        proxy_set_header Host $Host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect http://domain:8080/ /;
    }
    location / {
        proxy_set_header Host $Host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect http://domain:8080/ /;
    }
    location ~* ^.+\.(jpg|swf|flv|ico|txt|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|Zip|gz|bz2?|rar)$ {
        access_log /var/www/logs/domain.nginx.access.log;
        error_page 404 = @fallback;
        if ( $Host ~* ^((.*).domain)$ ) {
            set $proot /var/www/$1;
            break;
        }
        if ( $Host = "domain" ) {
            break;
        }

        root /var/www/domain;
    }
    location @fallback {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $Host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

そして、これがApache仮想ホストの設定です:

<VirtualHost *:8080>
    ServerName domain
    DocumentRoot /var/www/domain
    DirectoryIndex index.php
    CustomLog /var/www/logs/domain.access.log combined
    ErrorLog /var/www/logs/domain.error.log
    ServerAdmin info@domain
    AddDefaultCharset utf8
    php_admin_value open_basedir "/var/www/mod-tmp:.:/var/www/domain"
    php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@domain"
    php_admin_value upload_tmp_dir "/var/www/mod-tmp"
    php_admin_value session.save_path "/var/www/mod-tmp"
    AddType application/x-hwikipd-php .php .php3 .php4 .php5 .phtml
    AddType application/x-hwikipd-php-source .phps
<Directory /var/www/domain>
    Options All
    AllowOverride All
</Directory>
</VirtualHost>

私がnginxログで見ることができるように:

xxx.yyy.98.14 - - [28/Jan/2012:02:08:29 +0400] "GET / HTTP/1.0" 403 179 "-" "w3m/0.5.3"

それは私の本当のIPを見ます。

しかし、Apacheログでは、ローカルIPのみが表示されます。

127.0.0.1 - - [28/Jan/2012:02:08:29 +0400] "GET / HTTP/1.0" 403 390 "-" "w3m/0.5.3"

rpafが有効になっています。

$ cat /etc/Apache2/mods-enabled/rpaf.conf 
<IfModule mod_rpaf.c>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1 ::1
</IfModule>
$ cat /etc/Apache2/mods-enabled/rpaf.load 
LoadModule rpaf_module /usr/lib/Apache2/modules/mod_rpaf.so
$ ls -l /usr/lib/Apache2/modules/mod_rpaf.so
-rw-r--r-- 1 root root 8488 Oct 17 20:47 /usr/lib/Apache2/modules/mod_rpaf.so

それで、何が問題なのですか?

ps。この設定を保存した後、nginxとApacheを数回再起動しましたが、変更はありません。

3
rush

それは正しい振る舞いです。アプリケーション(Apacheで実行)のみが実際のIPを参照するためです。たとえば、WordPressなどのサンプルアプリケーションをインストールし、Piwikなどのリアルタイム分析をインストールします。 WordPressフッターにPiwikコードを挿入し、WordPressサイトにアクセスします(ログアウト後)。これで、Piwikは、RPAFproxy_ipsで設定されているものではなく、実際のIPを表示します。

ところで、/ etc/Apache2/mods-enabled /rpaf.confファイルには重要なディレクティブが1つありません。 RPAFheaderが必要です。たとえば、私の構成ファイルは次のようになります...

<IfModule mod_rpaf.c>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1
    RPAFheader X-Forwarded-For
</IfModule>

X-Forwarded-Forの代わりにX-Real-IPを使用することもできます。いずれの場合も、nginxがヘッダーで実際のIPを送信するように構成されていることを確認してください。たとえば、X-Forwarded-Forを使用する場合、nginx構成には次のものが含まれている必要があります...

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr;
2
Pothi Kalimuthu

変更 <IfModule "">からの参照mod_rpaf.cからrpaf_module

これにより、DebianSqueezeとUbuntu12.04での問題が修正されました。

12
David Dean

mod_rpafはDebianJessieで減価償却されたようで、それ以上の開発は中止されました。 DebianJessieのデフォルトモジュールであるmod_remoteipに切り替えます。

0
Kirrus