X-Forwarded-For:プロキシ越しに本当のクライアントIPを得る
通信がリバースプロキシ・ロードバランサ・CDNを経由すると、アプリのTCP接続には訪問者ではなくプロキシのIPが見えます。X-Forwarded-For(XFF)ヘッダは元のクライアントIPを運びますが、安全に読んだ場合に限ります。
ヘッダが伸びる仕組み
各プロキシは、受け取った相手のアドレスを追記します:
X-Forwarded-For: <client>, <proxy1>, <proxy2>
最も左が「自称」の元クライアント、右側は通過したプロキシです。
盲目的に信頼してはいけない理由
クライアントは自分で偽の X-Forwarded-For を送れます。アプリが確認せず最左の値を読むと、攻撃者は任意のIPを詐称でき、IP許可リストの回避・ログ汚染・レート制限の回避が可能になります。これは現実的で一般的な脆弱性です。
正しい読み方
XFFは自分のインフラからのものだけを信頼します:
- 自分の前段にプロキシが何台あるか把握する(CDN+ロードバランサ=2)。
- 最右から、信頼するホップ数だけ厳密に剥がす。
- 信頼プロキシでない最初のアドレスが本当のクライアント。
当サイトもこの規則を適用し、信頼プロキシのホップ分だけXFFからクライアントIPを導き、それ以外は接続元アドレスにフォールバックします。世界からアドレスがどう見えるかは トップページ、何が分かるかは IPから分かること を参照。
メモ: 新しい
Forwarded:ヘッダ(RFC 7239)はfor=/proto=で標準化します。プロキシが設定する方を使い、同じ信頼の規律を適用してください。