nginx リバースプロキシ側からアクセス元のIPアドレスを渡す

nginx リバースプロキシ側からアクセス元のIPアドレスを渡す

nginxでリバースプロキシ側からバックエンド側にアクセス元のIPアドレスを渡す手順を記述してます。nginxのバージョンは1.18.0を使用してます。

環境

  • 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