来訪者のブラウザーが Web サイトにアクセスする際、通常は CDN、WAF、または Anti-DDoS Pro を経由するため、直接配信元サーバーに接続されることはありません。 一般的には、たとえば、「来訪者 > CDN/WAF/Anti-DDoS Pro > 配信元サーバー」のようなアーキテクチャになっています。 では、さまざまな段階を経て到達した来訪者からのリクエストについて、配信元サーバーはどのような方法で来訪者の送信元 IP アドレスを取得するのでしょうか。
オープンで透過的なプロキシサーバーは、経路上の次のサーバーにユーザーのリクエストを転送する際、 X-Forwarded-For レコードを HTTP ヘッダーに追加します。 このレコードは、ユーザーの送信元 IP アドレスを記録するために使用され、 X-Forwarded-For: user IP
の形式を取ります。 複数のプロキシサーバーがリクエストプロセスに関与している場合、 X-Forwarded-For レコードは X-Forwarded-For: user's IP address, Proxy 1-IP address, Proxy 2-IP address, Proxy
3-IP address...
の形式で表示されます。
Nginx
1. http_realip_module のインストール
負荷分散のため、Nginx では http_realip_module を使用して送信元の IP アドレスを取得します。
# nginx -V | grep http_realip_module
コマンドを実行して、http_realip_module がインストールされているかどうかを確認します。 インストールされていない場合は、Nginx を再コンパイルして
http_realip_module をロードします。
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
make
make install
kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid`
kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin`
2. Nginx の設定に WAF IP アドレスを追加
default.conf
を開き、location / {}
に次の内容を追加します。
set_real_ip_from ip_range1;
set_real_ip_from ip_range2;
...
set_real_ip_from ip_rangex;
real_ip_header X-Forwarded-For;
ip_range1,2,...,x
は、WAF の back-to-source IP アドレスを示し、それぞれに複数のエントリを追加する必要があります。
3. log_format の変更
nginx.conf
の HTTP 設定の部分にあります。 log_format に x-forwarded-for を追加して、元の remote-address を置き換えます。 編集後の log_format の内容は以下のとおりです。
log_format main '$ http_x_forwarded_for-$ remote_user [$ time_local] "$ request"' '$ status $ body_bytes_sent "$ http_referer"' '"$ http_user_agent"';
上記の操作が完了したら、 nginx -s reload
を実行して Nginx を再起動し、設定を検証します。 設定が有効になると、Nginx サーバーは X-Forwarded-For フィールドに来訪者の IP アドレスを記録します。
IIS 6
F5XForwardedFor.dll プラグインがインストールされていれば、 IIS 6 のログから来訪者の送信元 IPアドレスを取得できます。
- F5XForwardedFor.dll をサーバーの OS バージョンに応じて x86\Release または x64\Release ディレクトリから既定のディレクトリ (C:\ISAPIFilters) にコピーし、IIS プロセスにこのディレクトリの読み取り権限が付与されていることを確認します。
- IIS マネージャーを開き、現在開いている Web サイトを右クリックしてプロパティを選択し、プロパティページを開きます。
- [ プロパティ] ページの [ISAPI フィルター] タブを選択し、[追加] をクリックします。
- [追加] ウィンドウで次のパラメータを設定し、[OK] をクリックします。
- フィルター名: F5XForwardedFor
- 実行可能ファイル: F5XForwardedFor.dll の完全パスを入力します。 今回の例では、C:\ISAPIFilters\F5XForwardedFor.dll です。
- IIS サーバーを再起動し、設定が有効になるのを待ちます。
IIS 7
F5XForwardedFor モジュールを使用すると、来訪者の送信元 IP アドレスを取得できます。
- F5XFFHttpModule.dll および F5XFFHttpModule.ini をサーバーの OS バージョンに応じて x86\Release または x64\Release ディレクトリから既定のディレクトリ (C:\x_forwarded_for\x86 および C:\x_forwarded_for\x64) にコピーし、 IIS プロセスに各ディレクトリの読み取り権限が付与されていることを確認します。
- IIS マネージャーで、[モジュール] をダブルクリックして開きます。
- [ローカルモジュールの構成] をクリックします。
- [ローカルモジュールの構成] ダイアログボックスの [登録] をクリックして、ダウンロードした DLL ファイルを登録します。
- x_forwarded_for_x86 モジュールの登録
- 名前: x_forwarded_for_x86
- パス: C:\x_forwarded_for\x86\F5XFFHttpModule.dll
- x_forwarded_for_x64 モジュールの登録
- 名前: x_forwarded_for_x64
- パス: C:\x_forwarded_for\x64\F5XFFHttpModule.dll
- x_forwarded_for_x86 モジュールの登録
- 登録後、新しく登録されたモジュール (x_forwarded_for_x86 および x_forwarded_for_x64) を選択し、[OK] をクリックして有効にします。
- 登録されたDLLをそれぞれ [ISAPIおよびCGIの制限] に追加し、設定を[許可しない] から [許可] に変更します。
- IIS サーバーを再起動し、設定が有効になるまで待ちます。
Apache
- 次のコードを実行して、Apache 用のサードパーティモジュール mod_rpaf をインストールします。
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz tar zxvf mod_rpaf-0.6.tar.gz cd mod_rpaf-0.6 /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
- Apache の設定ファイル
/alidata/server/httpd/conf/httpd.conf
を編集し、末尾に次の情報を追加します。LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips IP address RPAFheader X-Forwarded-For
RPAFproxy_ips ip address
は、Server Load Balancer が提供するパブリック IP アドレスではありません。 Apache のログから特定の IP アドレスを取得できます。 通常、2 つの IP アドレスが含まれます。 - IP アドレスの追加後、次のコマンドを実行して Apache を再起動します。
/alidata/server/httpd/bin/apachectl restart
Tomcat
次の手順に従って、Tomcat サーバーの X-Forwarded-For 機能を有効にできます。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>