nginx リバースプロキシ側からアクセス元のIPアドレスを渡すをサンプル付きで紹介

  • 作成日 2021.07.05
  • 更新日 2026.06.10
  • nginx
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となるため、アプリケーション側で解析する場合は先頭の値を利用してください。