X-Forwarded-For:プロキシ越しに本当のクライアントIPを得る

最終更新: 2026-05-31

通信がリバースプロキシ・ロードバランサ・CDNを経由すると、アプリのTCP接続には訪問者ではなくプロキシのIPが見えます。X-Forwarded-For(XFF)ヘッダは元のクライアントIPを運びますが、安全に読んだ場合に限ります。

ヘッダが伸びる仕組み

各プロキシは、受け取った相手のアドレスを追記します:

X-Forwarded-For: <client>, <proxy1>, <proxy2>

最も左が「自称」の元クライアント、右側は通過したプロキシです。

盲目的に信頼してはいけない理由

クライアントは自分で偽の X-Forwarded-For を送れます。アプリが確認せず最左の値を読むと、攻撃者は任意のIPを詐称でき、IP許可リストの回避・ログ汚染・レート制限の回避が可能になります。これは現実的で一般的な脆弱性です。

正しい読み方

XFFは自分のインフラからのものだけを信頼します:

  1. 自分の前段にプロキシが何台あるか把握する(CDN+ロードバランサ=2)。
  2. 最右から、信頼するホップ数だけ厳密に剥がす。
  3. 信頼プロキシでない最初のアドレスが本当のクライアント。

当サイトもこの規則を適用し、信頼プロキシのホップ分だけXFFからクライアントIPを導き、それ以外は接続元アドレスにフォールバックします。世界からアドレスがどう見えるかは トップページ、何が分かるかは IPから分かること を参照。

メモ: 新しい Forwarded: ヘッダ(RFC 7239)は for= / proto= で標準化します。プロキシが設定する方を使い、同じ信頼の規律を適用してください。

参考資料