nginx で proxy 経由のアクセスの リアル IP を取得する

reverse proxy が置いてある環境では、放っておいたらバックエンドの nginx のログではアクセス元の IP が全部 reverse proxy の IP になってしまいますよね。これをなんとかしましょう、というおはなしです。

フロント(reverse proxy)もバックエンドも nginx を使用する前提です。

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
1)
置き換え用のリアル IP を送ってくると信用できる IP を設定する???
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:linux:proxied_backend_nginx_get_realip