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をHTTPリクエストヘッダーとして追加します。 ヘッダーはX-Forwarded-For:Client IP address形式です。 アクセスリクエストがWAF、Anti-DDoS proxy、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 --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`
NGINX設定ファイルを変更します。
nginx.conf設定ファイルを開きます。次のコンテンツを
http {}に追加します。http { # Specify the IP addresses from which you can receive the originating IP addresses of clients set_real_ip_from <ip_range1>; set_real_ip_from <ip_range2>; ... set_real_ip_from <ip_rangex>; # Specify the HTTP header for the IP addresses of clients real_ip_header X-Forwarded-For; }構成の
<ip_range1>、<ip_range2>、および<ip_rangex>は、WAFのback-to-origin CIDRブロックを指定します。 WAFのすべてのback-To-origin CIDRブロックを取得するには、次の手順を実行します。WAFコンソールにログインし、WAFインスタンスがデプロイされているリソースグループとリージョンを選択します。 [中国本土] または [中国本土以外] を選択します。 左側のナビゲーションウィンドウで、 をクリックします。 [CNAMEレコード] タブで、[Back-to-origin CIDR Blocks] をクリックします。複数のback-to-origin CIDRブロックが含まれている場合は、すべてを追加する必要があります。 たとえば、WAFのback-to-origin CIDRブロックに10.10.10.0/24、11.11.X X.X/25、および2.13.XX.XX/27が含まれる場合、http {}に次の内容を追加します。
set_real_ip_from 10.10.10.0/24; set_real_ip_from 11.11.XX.X/25; set_real_ip_from 2.13.XX.XX/27; real_ip_header X-Forwarded-For;次のスクリプトを使用して、コピーされたback-to-origin IPv4 CIDRブロックを
set_real_ip_from <ip_rangeX>形式に変換できます。import re def format_ip_ranges(ip_ranges_str): # Use a regular expression to match all CIDR blocks ip_pattern = re.compile(r'\d+\.\d+\.\d+\.\d+/\d\d') ip_list = ip_pattern.findall(ip_ranges_str) formatted_ips = [f" set_real_ip_from {ip};" for ip in ip_list] output = "\n".join(formatted_ips) return output ip_ranges_str = "Back-to-origin CIDR blocks of WAF in string format" formatted_output = format_ip_ranges(ip_ranges_str) print(formatted_output)
ログの形式を変更します。
nginx.conf設定ファイルを開き、HTTP設定でlog_formatを見つけます。log_formatで、remote-addressフィールドをx-forwarded-forフィールドに置き換えます。次の内容は、変更後のログ形式を示しています。
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を再起動します。設定が有効かどうかを確認します。
次のcurlコマンドを実行して、リクエストをシミュレートします。
curl -H "X-Forwarded-For: 1.2.3.4" http://example.com次のコマンドを実行して、NGINXアクセスログを確認し、クライアントIPアドレスが取得されているかどうかを確認します。
tail -f access.log
IIS 6サーバーの構成
インターネットインフォメーションサービス (IIS) 6サーバーは、F5XForwardedForモジュールを使用して、クライアントの発信IPアドレスを取得します。 F5XForwardedForモジュールをインストールするには、次の手順を実行します。
をコピーします。Copy the
F5XForwardedFor.dllファイルからx86 \リリースまたはx64 \リリースのようなカスタムディレクトリに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モジュールをインストールするには、次の手順を実行します。
をコピーします。Copy the
F5XFFHttpModule.dllとF5XFFHttpModule.iniからのファイルx86 \リリースまたはx64 \リリースディレクトリをカスタムディレクトリにC:\x_forwarded_for\x86またはC:\x_forwarded_for\x64.説明IISプロセスにカスタムディレクトリに対する読み取りおよび書き込み権限があることを確認します。
x86\Releaseディレクトリまたはx64\Releaseディレクトリに
F5XForwardedFor.dllおよびF5XFFHttpModule.iniファイルが存在しない場合は、F5XForwardedForをクリックしてファイルをダウンロードします。
IISマネージャーを開き、ダブルクリックしますモジュールで、IISサーバーセクションにアクセスします。
On theモジュールページをクリックします。ローカルモジュールの設定右側の [アクション] セクションにあります。
[ローカルモジュールの設定] ダイアログボックスで、[登録] をクリックします。 次のパラメーターを設定し、[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設定ファイルに追加します。# Load the mod_remoteip.so module LoadModule remoteip_module modules/mod_remoteip.so # Configure the RemoteIPHeader header RemoteIPHeader X-Forwarded-For # Specify the back-to-origin CIDR blocks RemoteIPInternalProxy <ip_range1> <ip_range2> ... <ip_rangex>構成の
<ip_range1>、<ip_range2>、および<ip_rangex>は、WAFのback-to-origin CIDRブロックを指定します。 WAFのすべてのback-To-origin CIDRブロックを取得するには、次の手順を実行します。WAFコンソールにログインし、WAFインスタンスがデプロイされているリソースグループとリージョンを選択します。 [中国本土] または [中国本土以外] を選択します。 左側のナビゲーションウィンドウで、 をクリックします。 [CNAMEレコード] タブで、[Back-to-origin CIDR Blocks] をクリックします。複数のback-to-origin CIDRブロックをスペースで区切ります。 たとえば、プロキシサーバーのback-to-origin CIDRブロックに10.0.0.1、10.0.0.2、および10.0.0.3が含まれる場合、CIDRブロックを次の形式で指定します。
RemoteIPInternalProxy 10.0.0.1 10.0.0.2 10.0.0.3次の内容をconf/httpd.conf設定ファイルに追加します。
Include conf/extra/httpd-remoteip.conf上記の設定では、
httpd-remoteip.conf設定ファイルの内容をconf/httpd.confに挿入することを指定しています。httpd.conf設定ファイルのログ形式を変更します。LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 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 modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips <rpaf IP address> RPAFheader X-Forwarded-For設定内の
<rpaf IP address>は、mod_rpafモジュールのIPアドレスです。 ApacheログでIPアドレスを照会できます。 プロキシサーバーのパブリックIPアドレスは使用しないでください。 ほとんどの場合、2つのIPアドレスが含まれます。 例:LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips 10.XX.XX.65 10.XX.XX.131 RPAFheader X-Forwarded-For設定を有効にするには、Apacheを再起動します。
/alidata/server/httpd/bin/apachectl restart
Apacheモジュールの詳細については、「Apacheヘルプドキュメント」をご参照ください。
Tomcatサーバーの設定
Tomcatサーバーは、X-Forwarded-Forヘッダーを使用して、クライアントの発信IPアドレスを取得します。
を開きます。Open the
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"/>
Kubernetesコンテナーの設定
サービスがKubernetesコンテナにデプロイされている場合、Kubernetesはクライアントの発信元IPアドレスをX-Original-Forwarded-Forフィールドに記録し、WAFのback-to-origin CIDRブロックをX-Forwarded-Forフィールドに記録します。 クライアントの送信元IPアドレスを取得するには、コンテナー構成ファイルを変更し、Ingressコントローラーを有効にしてIPアドレスを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フィールドに置き換えます。