nginx で proxy 経由のアクセスの リアル IP を取得する
reverse proxy が置いてある環境では、放っておいたらバックエンドの nginx のログではアクセス元の IP が全部 reverse proxy の IP になってしまいますよね。これをなんとかしましょう、というおはなしです。
フロント(reverse proxy)もバックエンドも nginx を使用する前提です。
フロント(reverse proxy)の設定
nginx.conf に、こんな設定を入れます。
location / { proxy_pass http://backend/ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; : :
proxy_set_header
バックエンドに投げるリクエストのヘッダに X-Forwarded-For
を追加して、そこにアクセス元のリアル IP を詰めるようにする設定です。
バックエンドの設定
フロントが X-Forwarded-For
に詰めてくれたリアル IP を、ログの表示に使っている $remote_addr
に使用するような設定を入れます。
この設定は nginx が http_realip_module 付きで make されている必要があります。gentoo ならこんな感じです。
# USE=realip emerge -av nginx
さてバックエンド側の nginx.conf にこんな設定を入れます。
http { set_real_ip_from rev.proxy.ip.addr/32; real_ip_header X-Forwarded-For; : :
この項目は http
server
location
のどこにでも置けるようです。Module ngx_http_realip_module
set_real_ip_from
英語の説明もイマイチよくわからない1)のですが、ここにはフロントの IP アドレスを設定します。要は、いままでバックエンド側のログに表示されていたアクセス元の IP ですね。
real_ip_header
これは、先にフロント側で設定しておいた X-Forwarded-For
ですね。リアル IP が入っているリクエストヘッダの名前を指定します。
反映させる
フロントとバックエンドの両方で、nginx の設定を反映させます。
# nginx -t # systemctl restart nginx