X-Forwarded-Forヘッダーから接続元クライアントのIPアドレスを特定し、アクセス制御する方法


X-Forwarded-For(XFF)ヘッダーとは

  • HTTP プロキシ又はロードバランサーを通過してウェブサーバーへ接続したクライアントの、送信元 IP アドレスを特定するための(事実上の)標準ヘッダー。

形式

X-Forwarded-For: <client>, <proxy1>, <proxy2>
  • <client>
    クライアントの IP アドレス

  • <proxy1>, <proxy2>

    • リクエストが複数のプロキシを経由して行われる場合、それぞれのプロキシの IP アドレスが追加される。
    • 右端の IP アドレスが最も後段のプロキシであり、左端の IP アドレスが元のクライアントの IP アドレスを指す。

接続元クライアントのIPアドレス特定方法

通常の場合

  • 上図のような構成で、EC2インスタンス(Apacheなど)で接続元クライアントのIPアドレスを特定したい場合は、X-Forwarded-Forヘッダーの右から2つ目の値を確認する。 ※ELBへの直接アクセスなどを許容しないことが前提

XFFヘッダーを偽装された場合

  • クライアントが意図的にヘッダーに値を設定(偽装)した場合も、X-Forwarded-Forヘッダーの右から2つ目の値を確認する。

Apacheでの接続元IPアドレスに基づくアクセス制御

  • 接続元クライアント(上記の例で右から2番目)のIPアドレスがXXX.XXX.XXX.XXXの場合に/testへのアクセスを許可したい場合、httpd.confに以下を記述する。
SetEnvIf X-Forwarded-For "(:?^| )XXX\.XXX\.XXX\.XXX, [\d.]+$" allowed

<Location /test>
Order deny,allow        # 拒否してから許可
Deny from all           # 全アクセスを拒否
Allow from env=allowed  # envからのアクセスを許可
</Location>

参考情報