LoginSignup
4
3

More than 5 years have passed since last update.

AWS上で実行しているELB(ロードバランサ)経由のEC2上でクライアントIPアドレスをExpressで取得する

Posted at

Node.js(express)でのクライアントIPアドレスの取得

基本的にはreq.connection.remoteAddressでクライアントのIPアドレスが取れるが、
ロードバランサを通すと当然ロードバランサのIPになるので、ロードバランサが送信してくださるX-forwarded-forヘッダーから取得する。

nodejs
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

ひとつ問題が。

req.connection.remoteAddressはIPv6形式になっている。
192.168.1.10::ffff:192.168.1.10にマップされる。
X-forwarded-forは通常IPv4。

開発環境はELBナシ、本番環境はELB通すとかになってると本番環境でバグが発覚する可能性ありなので気をつけましょう。

Stackoverflowに良い回答があったので紹介

request.connection.remoteAddress Now Prefixed in ::ffff in node.js

  • 取得できる値は、IPv4をIPv6にマッピングしたIPv6の値。
  • 通常はNodeサーバーは同一のソケットでIPv6とIPv4のコネクションを処理している
  • ::ffff:192.168.1.10 はIPv4であり、IPv6でもある。
  • IPv6かどうかを確認するには、単純にコロンが含まれているかどうかでOK

とのことです。

備考

他にもアクセス元のプロトコル(http/https),ポートを取得できる。

以下ELBが送信してくれるX-Forwarded-*系のヘッダー

  • X-Forwarded-For :クライアントのIPアドレス
  • X-Forwarded-Proto :クライアントがアクセスしてきたプロトコル(HTTP または HTTPS)
  • X-Forwarded-Port :クライアントがアクセスしてきたポート番号

※参考 HTTP ヘッダーおよび Elastic Load Balancing

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3