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 :クライアントがアクセスしてきたポート番号