来訪者のブラウザーが 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... の形式で表示されます。

つまり、一般的なアプリケーションサーバーは、X-Forwarded-For レコードを使用して来訪者の送信元 IP アドレスを取得することができます。 以下のセクションでは、Nginx、IIS 6、IIS 7、Apache、および Tomcat サーバーでの X-Forwarded-For の設定方法を説明します。
重要 設定作業を行う前に、ECS スナップショットや Web サーバー構成ファイルなど、現在の環境をバックアップしてください。

Nginx

1. http_realip_module のインストール

負荷分散のため、Nginx では http_realip_module を使用して送信元の IP アドレスを取得します。

# nginx -V | grep http_realip_module コマンドを実行して、http_realip_module がインストールされているかどうかを確認します。 インストールされていない場合は、Nginx を再コンパイルして http_realip_module をロードします。
Nginx がデフォルトの手順でインストールされている場合、http_realip_module はインストールされていません。
次のコードを使用して、 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 の変更

log_format は、通常 nginx.conf の HTTP 設定の部分にあります。 log_formatx-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アドレスを取得できます。

  1. F5XForwardedFor.dll をサーバーの OS バージョンに応じて x86\Release または x64\Release ディレクトリから既定のディレクトリ (C:\ISAPIFilters) にコピーし、IIS プロセスにこのディレクトリの読み取り権限が付与されていることを確認します。
  2. IIS マネージャーを開き、現在開いている Web サイトを右クリックしてプロパティを選択し、プロパティページを開きます。
  3. [ プロパティ] ページの [ISAPI フィルター] タブを選択し、[追加] をクリックします。
  4. [追加] ウィンドウで次のパラメータを設定し、[OK] をクリックします。
    • フィルター名: F5XForwardedFor
    • 実行可能ファイル: F5XForwardedFor.dll の完全パスを入力します。 今回の例では、C:\ISAPIFilters\F5XForwardedFor.dll です。
  5. IIS サーバーを再起動し、設定が有効になるのを待ちます。

IIS 7

F5XForwardedFor モジュールを使用すると、来訪者の送信元 IP アドレスを取得できます。

  1. F5XFFHttpModule.dll および F5XFFHttpModule.ini をサーバーの OS バージョンに応じて x86\Release または x64\Release ディレクトリから既定のディレクトリ (C:\x_forwarded_for\x86 および C:\x_forwarded_for\x64) にコピーし、 IIS プロセスに各ディレクトリの読み取り権限が付与されていることを確認します。
  2. IIS マネージャーで、[モジュール] をダブルクリックして開きます。
  3. [ローカルモジュールの構成] をクリックします。
  4. [ローカルモジュールの構成] ダイアログボックスの [登録] をクリックして、ダウンロードした 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
  5. 登録後、新しく登録されたモジュール (x_forwarded_for_x86 および x_forwarded_for_x64) を選択し、[OK] をクリックして有効にします。
  6. 登録されたDLLをそれぞれ [ISAPIおよびCGIの制限] に追加し、設定を[許可しない] から [許可] に変更します。
  7. IIS サーバーを再起動し、設定が有効になるまで待ちます。

Apache

Apache で来訪者の送信元 IP アドレスを取得するには、次の手順に従います。
  1. 次のコードを実行して、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
  2. 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 アドレスが含まれます。

  3. IP アドレスの追加後、次のコマンドを実行して Apache を再起動します。
    /alidata/server/httpd/bin/apachectl restart

Tomcat

次の手順に従って、Tomcat サーバーの X-Forwarded-For 機能を有効にできます。

tomcat/conf/server.xml を開き、AccessLogValve を次の内容に変更します。
<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"/>