X-Forwarded-For 頭

HTTP X-Forwarded-For (XFF) 請求頭是一個事實標準頭,用於識別客戶端透過代理伺服器連線到 Web 伺服器時的原始 IP 地址。

此頭的一個標準化版本是 HTTP Forwarded 頭,儘管其使用頻率要低得多。

警告:不當使用此頭可能會帶來安全風險。有關詳細資訊,請參閱安全和隱私問題部分。

頭型別 請求頭
禁止請求頭

語法

http
X-Forwarded-For: <client>, <proxy>
X-Forwarded-For: <client>, <proxy>, …, <proxyN>

例如,第一個頭中的 IPv6 客戶端 IP,第二個頭中的 IPv4 客戶端 IP,以及第三個示例中的 IPv4 客戶端 IP 和 IPv6 代理 IP。

http
X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348
X-Forwarded-For: 203.0.113.195
X-Forwarded-For: 203.0.113.195, 2001:db8:85a3:8d3:1319:8a2e:370:7348

指令

<client>

客戶端 IP 地址。

<proxy>

代理 IP 地址。如果請求透過多個代理,則會列出每個連續代理的 IP 地址。這意味著最右側的 IP 地址是最新的代理的 IP 地址,最左側的 IP 地址是原始客戶端的地址(假設客戶端和代理行為良好)。

描述

當客戶端直接連線到伺服器時,客戶端的 IP 地址會發送到伺服器,並通常寫入伺服器訪問日誌。如果客戶端連線透過任何正向或反向代理,伺服器只會看到最終代理的 IP 地址,這通常用處不大。如果最終代理是與伺服器屬於同一部署的負載均衡器,則更是如此。為了向伺服器提供更有用的客戶端 IP 地址,使用了 X-Forwarded-For 請求頭。

有關使用 X-Forwarded-For 的詳細指南,請參閱解析選擇 IP 地址部分。

安全和隱私問題

此頭按設計會暴露隱私敏感資訊,例如客戶端的 IP 地址。因此,在使用此頭時必須牢記使用者的隱私。

如果您知道請求鏈中的所有代理都是可信的(即您控制它們)並且配置正確,則您的代理新增的頭部分可以被信任。如果任何代理是惡意的或配置錯誤,則非可信代理新增的頭中任何部分都可能被欺騙,或者可能具有意外的格式或內容。如果伺服器可以直接從網際網路連線——即使它也位於可信的反向代理之後——則 X-Forwarded-For IP 列表的任何部分都不能被視為可信或安全用於安全相關用途。

任何將 X-Forwarded-For 用於安全相關用途(例如用於速率限制或基於 IP 的訪問控制)必須僅使用可信代理新增的 IP 地址。使用不可信的值可能導致繞過速率限制器、繞過訪問控制、記憶體耗盡或其他負面的安全或可用性後果。

最左側(不可信)的值只能用於使用欺騙值不會產生負面影響的情況。

解析

不當解析 X-Forwarded-For 頭可能會產生負面安全影響,其後果如上一節所述。因此,在解析頭值時應考慮以下幾點。

請求中可能存在多個 X-Forwarded-For 頭。這些頭中的 IP 地址必須被視為一個列表,從第一個頭的第一個 IP 地址開始,一直到最後一個頭的最後一個 IP 地址。有兩種方法可以建立這個單一列表:

  • 用逗號連線 X-Forwarded-For 的完整頭值,然後按逗號分割成一個列表,或者
  • 將每個 X-Forwarded-For 頭按逗號分割成列表,然後連線這些列表。

僅使用多個 X-Forwarded-For 頭中的一個是不夠的。

一些反向代理會自動將多個 X-Forwarded-For 頭合併為一個,但更安全的是不要假設總是如此。

選擇 IP 地址

選擇地址時,必須使用完整的 IP 列表(來自所有 X-Forwarded-For 頭)。

選擇最接近客戶端的 X-Forwarded-For IP 地址(不可信且用於安全相關目的)時,應選擇從最左側開始的第一個有效地址非私有/內部的 IP。

注意:我們上面說“有效地址”,因為欺騙值可能不是實際的 IP 地址。此外,我們說“非內部/私有”,因為客戶端可能在其內部網路上使用了代理,這可能添加了來自私有 IP 空間的地址。

選擇第一個可信的 X-Forwarded-For 客戶端 IP 地址需要額外的配置。有兩種常見方法:

可信代理計數

配置網際網路和伺服器之間的反向代理數量。X-Forwarded-For IP 列表從最右側開始,按該計數減一進行搜尋。例如,如果只有一個反向代理,該代理將新增客戶端的 IP 地址,因此應使用最右側的地址。如果有三個反向代理,則最後兩個 IP 地址將是內部地址。

可信代理列表

配置可信反向代理的 IP 或 IP 範圍。X-Forwarded-For IP 列表從最右側開始搜尋,跳過所有位於可信代理列表中的地址。第一個不匹配的地址是目標地址。

第一個可信的 X-Forwarded-For IP 地址可能屬於不可信的中間代理而不是實際客戶端,但它是唯一適合用於安全目的來識別客戶端的 IP。

示例

客戶端和代理 IP

從以下 X-Forwarded-For 請求頭中,我們可以推斷客戶端 IP 地址是 203.0.113.195,並且請求已透過兩個代理。第一個代理的 IPv6 地址是 2001:db8:85a3:8d3:1319:8a2e:370:7348,請求鏈中最後一個代理的 IPv4 地址是 198.51.100.178

http
X-Forwarded-For: 203.0.113.195,2001:db8:85a3:8d3:1319:8a2e:370:7348,198.51.100.178

規範

不屬於任何當前規範。此頭的標準化版本是Forwarded

另見