CrystalSnowman.com

あなたの時間節約につながる情報を提供します

nginx リバースプロキシ時にアクセス元のIPアドレスを取得する方法

logwatch attack

nginxでリバースプロキシ設定時に外部からアクセスしたIPアドレスが全て「127.0.0.1」となって困っていました。正しく表示されるように設定を修正したので紹介します。

経緯

127.0.0.1とは

ローカル・ループバック・アドレスと呼ばれ、自分自身を表す特別なIPアドレスの1つです。

atmark itによると以下のように解説されています。

ローカル・ループバック・アドレスとは、自分自身を表す特別なIPアドレスの1つであり、TCP/IPが有効なコンピュータでは常に利用可能なIPアドレスである。 一般的には「127.0.0.1」というIPアドレス(IPv4の場合)が利用されるが、実際にはIPアドレスの最上位のバイト(最上位の8bit)の内容が「127」でありさえすればよいので、「127.0.0.1~127.255.255.254」の範囲内ならばどのIPアドレスでも利用できる(127.0.0.0と127.255.255.255の2つはブロードキャスト・アドレスのため除外される)

ローカル・ループバック・アドレス(127.0.0.1) – IT

外部からのアクセスのIPアドレス

以前nginxでリバースプロキシを設定する方法は以下の記事で紹介しました。

nginx リバースプロキシのconfファイル設定方法 その1
nginx リバースプロキシのconfファイル設定方法 その2

それに基づいて設定していましたが、IPアドレスが127.0.0.1と表示されてしまいます。
リバースプロキシのIPアドレスが記録され、それがバックエンドサーバに通知されるためです。

以下はWordPressのスパムコメントですが、IPアドレスが127.0.0.1と表示されています。
spam comment

次はlogwatchの攻撃者のIPアドレスです。
「ディレクトリトラバーサル」攻撃をやろうとしています。これも127.0.0.1と表示されています。
logwatch attack

これではマズイので、正しく外部からのIPアドレスを表示するようにnginxを設定し直しました。

方法

ngx_http_realip_moduleというモジュールを使用します。
Module ngx_http_realip_module

導入済みかは「nginx -V」コマンドで確認します。
–with-http_realip_module」の記述があれば使用できます。

nginx.confの修正

「ngx_http_realip_module」の追記とヘッダー部を修正しました。

18行目でリバースプロキシのIPアドレスを指定します。サーバを分けているわけではないのでこのサイトのIPアドレスを指定しました。指定するのはローカル・ループバック・アドレス(127.0.0.1)ではありません。

19行目で「real_ip_header」に「X-Forwarded-For」を指定します。これはお約束のようです。

20行目以降はヘッダー記述をコメントアウトしてバーチャルドメイン側で設定するようにしました。

33行目でバックエンドサーバ (上流、Webサーバ)のサーバー名を「crystalsnowman.com:8080」に指定しています。
実はこの設定を「127.0.0.1:8080」していました。そのためリバースプロキシのIPアドレスが「127.0.0.1」となっていました。

「crystalsnowman.com:8080」にするとリバースプロキシのIPアドレスは「1xx.xx.xx.xxx」となります。
しかし「ngx_http_realip_module」の設定を行わない限り、外部アクセスIPアドレスは全てこの「1xx.xx.xx.xxx」となってしまいます。

リバースプロキシサーバ部の修正

5行目以降にヘッダーを追加しました。

設定確認

「nginx -s reload」で修正した設定を反映させます。

IPアドレスが正しく表示されているか確認します。スマホからブログのコメント欄にコメントします。Wi-Fiではなく、モバイル通信でブログにアクセスします。

WordPressで確認しました。
test comment

正しくアクセス元のIPアドレスが表示されるようになりました。
スマホはsimフリーなのでdocomoのIPが表示されています。

参考資料

以下を参考にさせていただきました。
nginx でリバースプロキシするときの Tips : あかぎメモ

こちらのサイトでは「ngx_http_realip_module」関連の記述を別のconfファイルにする方法で設定しています。

まとめ

nginxでリバースプロキシ設定時は「ngx_http_realip_module」を設定し、アクセス元のIPアドレスを正しく表示することが必要です。正しく表示出来ればスパムコメント対策も簡単にできます。nginxを使用しているあなたの参考になれば幸いです。

「nginx リバースプロキシのconfファイル設定方法」の記事も一部追記しました。


Top