こんにちは、インフラエンジニアの綿引です。

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 を取得する方法を記載しました。
地味に必要となるケースが多いかと思いますので、是非参考にしていただければと思います。

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る