こんにちは、インフラエンジニアの綿引です。
Webサーバー側で接続元 IP を取得したかったけどよく見ると ELB やプロキシサーバの IP だった、、
という経験をされた方もいらっしゃるのではないでしょうか。
そこで今回は Apache と Nginx で接続元 IP を取得する方法を記載したいと思います。
対象の方は以下のような方でしょうか。
- ELB などを使用して運用している
- 前段にプロキシサーバを配置している
Apache の設定方法
環境
環境は以下で検証しております。
- CentOS 7
- Apache 2.4
実装方法
Apache では mod_remoteip というモジュールを使用します。
Apache 2.4 からは標準で導入されていますが、それ以前のバージョンだと入っていないため Github などからクローンする必要があるようです。
まずは mod_remoteip が組み込まれているか確認しましょう。
以下のコマンドで remoteip_module (shared) と表示されていれば大丈夫です。
$ httpd -M | grep "remoteip" remoteip_module (shared)
次に httpd.conf に以下を記載します。
RemoteIPHeader x-forwarded-for
後はログフォーマットを変更します。
デフォルトの combined や common などを使用している場合 「%h」 のリモートホスト名が記載されているため、「%a」 のアクセス元のIPアドレスに変更、または追加します。
以下は combined を例として記載しております。
変更前
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
変更後
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
最後に Apache の再起動をして完了です。
# systemctl status httpd # systemctl reload httpd # systemctl status httpd
これでアクセスログに接続元 IP が出力されるようになります。
次に Nginx です。
Nginx の設定方法
環境
環境は以下で検証しております。
- CentOS 7
- Nginx 1.16.1
実装方法
Nginx では ngx_http_realip_module というモジュールを使用します。
ngx_http_realip_module は現在 Nginx を使用されていればデフォルトで使用できるかと思います。
今回は Nginx 1.16.1 で検証しましたが、1.10 系のものでも使用できました。
設定方法は nginx.conf に以下を追加します。
set_real_ip_from XXX.XXX.XXX.XXX/XX; real_ip_header X-Forwarded-For;
set_real_ip_from の XXX 部分には信頼できる IP アドレスのレンジを記載します。
例えば ALB などを使用している場合は VPC のセグメントで良いと思いますし、プロキシサーバがある場合はそのサーバの IP で良いかと思います。
ログフォーマットに関しては、$remote_addr が接続元 IP になります。
こちらに関しては使用されている方が大半だと思いますので、特に変更はいらないかと思います。
最後に Nginx の再起動をして完了です。
# systemctl status nginx # systemctl reload nginx # systemctl status nginx
最後に
今回は Apache と Nginx で接続元 IP を取得する方法を記載しました。
地味に必要となるケースが多いかと思いますので、是非参考にしていただければと思います。