WebサイトがWebアプリケーションファイアウォール (WAF) に追加されると、WAFはWebサイトへのアクセスリクエストをフィルタリングし、通常のリクエストを配信元サーバーに転送します。 オリジンサーバーは、クライアントの発信IPアドレスを取得するために、back-to-originリクエストでX-Forwarded-Forヘッダーを使用できます。 このトピックでは、クライアントの送信元IPアドレスを取得するようにwebアプリケーションサーバーとKubernetesコンテナーを設定する方法について説明します。 Webアプリケーションサーバーには、NGINX、IIS 6、IIS 7、Apache、およびTomcatサーバーがあります。
背景
X-Forwarded-Forヘッダーは、クライアントの発信IPアドレスを記録するために使用されます。 WAFは、X-Forwarded-For:Client IP address
形式でアクセスリクエストをネクストホップサーバーに転送する前に、HTTPリクエストヘッダーにX-Forwarded-Forヘッダーを追加します。 アクセスリクエストがWAF、Anti-DDoS Pro、Anti-DDoS Premium、Alibaba Cloud CDNなどの複数の中間プロキシサーバーを通過する場合、X-Forwarded-Forヘッダーにはクライアントの送信元IPアドレスと中間プロキシサーバーのIPアドレスが記録されます。 ヘッダーには、コンマ (,) で区切られた複数のIPアドレスが記録されます。 例: X-Forwarded-For: クライアントIPアドレス、Proxy Server 1のIPアドレス、Proxy Server 2のIPアドレス、Proxy Server 3のIPアドレス、…
したがって、一般的なWebアプリケーションサーバーとKubernetesコンテナーは、X-Forwarded-Forヘッダーを使用して、クライアントの送信元IPアドレスを取得できます。
次のセクションでは、NGINX、IIS 6、IIS 7、Apache、およびTomcatサーバー、およびKubernetesコンテナーでX-Forwarded-Forヘッダーを構成する方法について説明します。
開始する前に、Elastic Compute Service (ECS) インスタンスのスナップショットやwebアプリケーションサーバーの設定ファイルなど、既存の環境をバックアップしていることを確認してください。
NGINXサーバーの設定
NGINXサーバーはhttp_realip_moduleモジュールを使用して、クライアントの発信IPアドレスを取得します。 次の方法を使用して、http_realip_moduleモジュールをインストールし、NGINXの設定ファイルを変更します。
http_realip_moduleモジュールをインストールします。
nginxサーバーで
# NGINX-V | grep http_realip_module
コマンドを実行し、モジュールがインストールされているかどうかを確認します。モジュールがインストールされている場合は、この手順をスキップします。
モジュールがインストールされていない場合は、NGINXを再コンパイルしてモジュールをインストールします。
説明クイックインストールパッケージを使用してNGINXをインストールする場合、このモジュールはインストールされません。
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-httpキャッシュなし-with-http_ssl_module-with-http_realip_module 作る インストールする kill -USR2 'cat /alidata/server/nginx/logs/nginx.pid' kill -QUIT 'cat /alidata/server/nginx/logs/ nginx.pid.oldbin'
NGINXの設定ファイルを変更します。
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>
、<ip_range2>
、および<ip_rangex>
は、WAFのback-to-origin CIDRブロックです。 WAFのback-to-origin CIDRブロックの詳細については、「WAFのback-to-origin CIDRブロックからのリクエストの許可」をご参照ください。各行にback-to-origin CIDRブロックを1つ入力します。 WAFのback-to-origin CIDRブロックに10.0.0.1、10.0.0.2、および10.0.0.3が含まれると仮定します。 location /{}に次のコンテンツを追加します。
set_real_ip_from 10.0.0.1; set_real_ip_from 10.0.0.2; set_real_ip_from 10.0.0.3; real_ip_header X-Forwarded-For;
ログ形式を変更します。
nginx.conf
設定ファイルを開き、HTTP
設定でlog_format
を見つけます。log_format
で、remote-address
フィールドをx-forwarded-for
フィールドに置き換えます。次の内容は、変更されたログ形式を示しています。
log_formatメイン '$http_x_forwarded_for - $remote_user [$time_local] "$request"'$status $body_bytes_sent "$http_referer" '"$http_user_agent"';
nginx -s reload
コマンドを実行し、NGINXを再起動します。
IIS 6サーバーの構成
IIS 6サーバーは、F5XForwardedForモジュールを使用して、クライアントの送信元IPアドレスを取得します。 F5XForwardedForモジュールをインストールするには、次の操作を実行します。
F5XForwardedFor.dll
ファイルをx86\Release
またはx64\Release
ディレクトリから、C:\ISAPIFilters\x86
やC:\ISAPIFilters\x64
などのカスタムディレクトリにコピーします。説明インターネットインフォメーションサービス (IIS) プロセスに、カスタムディレクトリに対する読み取りおよび書き込み権限があることを確認します。
x86\Releaseまたはx64\Releaseディレクトリに
F5XForwardedFor.dll
ファイルが存在しない場合は、F5XForwardedFor.dllをクリックしてダウンロードし、カスタムディレクトリにコピーします。
IISマネージャーを開き、Webサイトを見つけて、Webサイトを右クリックし、[プロパティ] を選択します。
[ISAPIフィルター] タブで、[追加] をクリックします。 次のパラメーターを設定し、[OK] をクリックします。
サーバーが32ビットオペレーティングシステムを実行しているとします。
フィルター名:
x_forwarded_for_x86
と入力します。実行可能:
F5XForwardedFor.dll
のフルパスを入力します。 例:C:\ISAPIFilters\x86\F5XForwardedFor.dll
IIS 6サーバーを再起動して、設定を有効にします。
IIS 7サーバーの構成
IIS 7サーバーは、F5XForwardedForモジュールを使用して、クライアントの送信元IPアドレスを取得します。 F5XForwardedForモジュールをインストールするには、次の操作を実行します。
F5XFFHttpModule.dll
およびF5XFFHttpModule.ini
ファイルをx86\Release
またはx64\Release
ディレクトリから、C:\x_forwarded_for\x86
やC:\x_forwarded_for\x64
などのカスタムディレクトリにコピーします。説明IISプロセスにカスタムディレクトリに対する読み取りおよび書き込み権限があることを確認します。
x86\Releaseまたはx64\Releaseディレクトリにファイルが存在しない場合は、[F5XForwardedFor] をクリックしてファイルをダウンロードします。
[IISサーバー] セクションで、[モジュール] をダブルクリックします。
[モジュール] ページで、右側の [操作] セクションの [ローカルモジュールの設定] をクリックします。
[ローカルモジュールの設定] ダイアログボックスで、[登録] をクリックします。 次のパラメーターを指定し、[OK] をクリックします。
サーバーが32ビットオペレーティングシステムを実行しているとします。
名前:
x_forwarded_for_x86
と入力します。パス:
F5XFFHttpModule.dll
モジュールのフルパスを入力します。 例:C:\x_forwarded_for\x86\F5XFFHttpModule.dll
[ローカルモジュールの設定] ダイアログボックスで、新しく登録したモジュールを選択し、[OK] をクリックします。
[ISAPIとCGIの制限] セクションで、登録済みのDLLファイルを追加し、[制限] を [許可] に設定します。
IIS 7サーバーを再起動して、設定を有効にします。
Apacheサーバーの設定
WindowsでのApacheサーバーの構成
Apache 2.4以降のバージョンのインストールパッケージは、mod_remoteip.so
という名前のremoteip_moduleモジュールファイルを提供します。 このモジュールを使用して、クライアントの送信元IPアドレスを取得できます。
Apacheの追加設定フォルダー (
conf/extra/
) にhttpd-remoteip.conf
という名前の設定ファイルを作成します。説明remoteip.conf
設定ファイルをインポートして、関連する設定を読み込むことができます。 これにより、httpd.conf
ファイルを変更する回数が減り、誤操作によるサービス例外が回避されます。次のコンテンツを
httpd-remoteip.conf
設定ファイルに追加します。# mod_remoteip.soモジュールを読み込みます。 LoadModule remoteip_moduleモジュール /mod_remoteip.so # RemoteIPHeaderヘッダーを設定します。 RemoteIPHeader X-Forwarded-For # back-to-origin CIDRブロックを指定します。 RemoteIPInternalProxy <ip_range1> <ip_range2> ... <ip_rangex>
コンテンツ内の
<ip_range1>
、<ip_range2>
、および<ip_rangex>
は、WAFのback-to-origin CIDRブロックです。 WAFのback-to-origin CIDRブロックの詳細については、「WAFのback-to-origin CIDRブロックからのリクエストの許可」をご参照ください。複数のback-to-origin CIDRブロックをスペースで区切ります。 プロキシサーバーのback-to-origin CIDRブロックに10.0.0.1、10.0.0.2、10.0.0.3が含まれているとします。 次のような形式を使用します。
RemoteIPInternalProxy 10.0.0.1 10.0.0.2 10.0.0.3
次の内容をconf/httpd.conf設定ファイルに追加します。
を含めるconf/extra/httpd-remoteip.conf
上記の内容は、
httpd-remoteip.conf
設定ファイルをconf/httpd.confに挿入します。httpd.conf
設定ファイルのログ形式を変更します。LogFormat "% a % l % u % t \" % r\"%>s % b \" % {リファラー} i\" \" % {ユーザーエージェント} i\"" 結合 LogFormat "% a % l % u % t \" % r\"%>s % b" common
設定を有効にするには、Apacheを再起動します。
LinuxでのApacheサーバーの構成
上記の手順を実行してremoteip_moduleモジュール (mod_remoteip.so
) を追加し、クライアントの送信元IPアドレスを取得するようにログ形式を設定します。 remoteip_moduleは、Apache 2.4以降のバージョンの組み込みモジュールです。
Apacheのバージョンが2.4より前の場合は、サードパーティモジュールmod_rpafをインストールして、クライアントの送信元IPアドレスを取得します。
mod_rpafモジュールをインストールします。
wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.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モジュール /mod_rpaf-2.0.so RPAFenableオン RPAFsethostnameオン RPAFproxy_ips <rpaf IPアドレス> RPAFheader X-Forwarded-For
コンテンツ内の
<rpaf IP address>
は、mod_rpafモジュールのIPアドレスです。 Apacheログで特定のIPアドレスを照会できます。 プロキシサーバーのIPアドレスは使用しないでください。 ほとんどの場合、次の例に示すように、2つのIPアドレスが含まれます。LoadModule rpaf_moduleモジュール /mod_rpaf-2.0.so RPAFenableオン RPAFsethostnameオン RPAFproxy_ips 10.XX. XX.65 10.XX. XX.131 RPAFheader X-Forwarded-For
設定を有効にするには、Apacheを再起動します。
/alidata/server/httpd/bin/apachectl再起動
Apacheモジュールの詳細については、「Apacheヘルプドキュメント」をご参照ください。
Tomcatサーバーの設定
Tomcatサーバーは、X-Forwarded-Forヘッダーを使用して、クライアントの発信IPアドレスを取得します。
tomcat/conf/server.xml
設定ファイルを開きます。次のコンテンツに基づいて、AccessLogValveログ機能を変更します。
<Valve className="org.apache.ca talina.valves.AccessLogValve" ディレクトリ="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"/>
Kubernetesコンテナーの設定
ECSインスタンスがKubernetesにデプロイされている場合、Kubernetesはクライアントの送信元IPアドレスをX-Original-Forwarded-Forフィールドに記録し、WAFのback-to-origin CIDRブロックをX-Forwarded-Forフィールドに記録します。 クライアントの送信元IPアドレスを取得するには、コンテナ構成ファイルを変更して、IngressコントローラーがそれらをX-Forwarded-Forフィールドに追加できるようにする必要があります。
次の操作を実行して、コンテナー構成ファイルを変更できます。
次のコマンドを実行して、
kube-system/nginx-configuration
設定ファイルを変更します。kubectl -n kube-system edit cm nginx-configuration
次の内容を設定ファイルに追加します。
compute-full-forwarded-for: "true" forwarded-for-header: "X-Forwarded-For" use-forwarded-headers: "true"
設定ファイルを保存します。
設定は、設定ファイルを保存した直後に有効になります。 次に、Ingressコントローラは、クライアントの発信IPアドレスをX-Forwarded-Forフィールドに追加します。
クライアントの送信元IPアドレスを取得するために使用するフィールドをX-Original-Forwarded-Forフィールドに変更します。