nginx リバースプロキシ側からアクセス元のIPアドレスを渡すをサンプル付きで紹介
nginxのリバースプロキシ環境でX-Forwarded-Forを利用してアクセス元IPアドレスを取得する方法を解説します。proxy_set_header、real_ip_header、set_real_ip_fromの設定例や動作の仕組みをサンプル付きで紹介します。
環境
- OS CentOS Linux release 7.9.2009 (Core)
- nginx 1.18.0
リバースプロキシ側設定
まずは、リバースプロキシ側のヘッダー情報「X-Forwarded-For」を追加します。
upstream app {
server バックエンドのIP;
}
server {
listen 80;
server_name リバースプロキシ側のIP;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
}X-Forwarded-Forは、以下の流れで値を保持していくため、一番初めの値を取得すれば送信元のIPを取得することができます。
【Client】
X-Forwarded-For: ""
↓
【Proxy1】
X-Forwarded-For: "Client"
↓
【Proxy2】
X-Forwarded-For: "Client, Proxy1"
↓
【last】
X-Forwarded-For: "Client, Proxy1, Proxy2"
設定を反映させるため再起動します。
sudo systemctl restart nginxバックエンド側
バックエンド側には、「set_real_ip_from」にリバースプロキシ側のIPと、「real_ip_header」にX-Forwarded-Forを指定してあげれば、送信元のIPアドレスをバックエンド側でも取得することが可能です。
server {
listen 80;
server_name バックエンド側のIP;
set_real_ip_from リバースプロキシ側のIP;
real_ip_header X-Forwarded-For;
~
}「set_real_ip_from」でバックエンド側のIPのみ書き換え可能となります。
set_real_ip_from バックエンド側のIP;
real_ip_header X-Forwarded-For;設定を反映させるため再起動します。
sudo systemctl restart nginx
X-Forwarded-Forとは?
X-Forwarded-Forは、リバースプロキシやロードバランサーを経由した際に、元のクライアントIPアドレスをバックエンドサーバーへ引き継ぐためのHTTPヘッダーです。
通常、リバースプロキシを経由するとバックエンド側ではプロキシサーバーのIPアドレスしか取得できません。そのため、実際のアクセス元IPを取得したい場合はX-Forwarded-Forの設定が必要になります。
nginxでアクセス元IPを取得する仕組み
リバースプロキシ側でX-Forwarded-Forヘッダーを付与し、バックエンド側でそのヘッダーを信頼する設定を行います。
Client
↓
Reverse Proxy(X-Forwarded-For追加)
↓
Backend Serverバックエンド側ではreal_ip_headerとset_real_ip_fromを設定することで、クライアントの実IPアドレスとして扱うことができます。
設定後にIPアドレスを確認する方法
設定後はアクセスログを確認し、実際のクライアントIPが記録されているか確認しましょう。
tail -f /var/log/nginx/access.logプロキシサーバーのIPではなく、アクセス元のIPアドレスが表示されていれば正常に設定されています。
複数プロキシを経由する場合の注意点
X-Forwarded-Forには経由したIPアドレスがカンマ区切りで追加されていきます。
ClientIP, Proxy1, Proxy2最初のIPアドレスが実際のクライアントIPとなるため、アプリケーション側で解析する場合は先頭の値を利用してください。
-
前の記事
javascript dirnameの値が取得できない 2021.07.05
-
次の記事
javascript lodashを使って指定したインデックス番号以降の配列を取得する 2021.07.05
コメントを書く