IP 透明度
什麼是 IP 透明度
作為一個代理伺服器,Envoy 是一個 IP 端點:它有自己的 IP 位址,與任何下游請求的 IP 位址不同。因此,當 Envoy 建立與上游主機的連線時,該連線的 IP 位址會與任何被代理連線的 IP 位址不同。
有時,上游伺服器或網路可能需要知道連線的原始 IP 位址,稱為下游遠端位址,原因有很多。一些例子包括:
IP 位址被用來構成身分的一部分,
IP 位址被用來執行網路政策,或
IP 位址被包含在稽核中。
Envoy 支援多種方法,將下游遠端位址提供給上游主機。這些技術在複雜性和適用性上有所不同。
Envoy 也支援用於偵測原始 IP 位址的擴充功能。如果以下任何技術都不適用於您的設定,這可能會很有用。兩個可用的擴充功能是自訂標頭擴充功能和xff擴充功能。
HTTP 標頭
HTTP 標頭可以在x-forwarded-for標頭中攜帶請求的原始 IP 位址。上游伺服器可以使用此標頭來判斷下游遠端位址。Envoy 也可以使用此標頭來選擇 原始來源 HTTP 篩選器所使用的 IP 位址。
HTTP 標頭方法有一些缺點:
它僅適用於 HTTP。
上游主機可能不支援它。
它需要仔細的設定。
Proxy Protocol
HAProxy Proxy Protocol 定義了一種透過 TCP 傳輸連線相關中繼資料的協定,在主要的 TCP 資料流之前。此中繼資料包括來源 IP。Envoy 支援使用 Proxy Protocol 篩選器 來使用此資訊,該篩選器可用於還原下游遠端位址,以傳播到 x-forwarded-for 標頭中。它也可以與 原始來源監聽器篩選器 結合使用。最後,Envoy 支援使用 Proxy Protocol 傳輸 Socket產生此標頭。
以下是一個設定 Socket 的範例設定:
clusters:
- name: service1
connect_timeout: 0.25s
type: strict_dns
lb_policy: round_robin
transport_socket:
name: envoy.transport_sockets.upstream_proxy_protocol
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.proxy_protocol.v3.ProxyProtocolUpstreamTransport
config:
version: V1
transport_socket:
name: envoy.transport_sockets.raw_buffer
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.raw_buffer.v3.RawBuffer
...
如果您計劃將此 Socket 與 HTTP 連線管理器一起使用,則需要考慮幾件事。由於下游客戶端之間不會重複使用上游連線,因此會對效能產生影響。每個連線到 Envoy 的客戶端都會建立一個到上游伺服器的新連線。這是因為 Proxy Protocol 本質上是一種基於連線的協定。下游客戶端資訊僅在連線開始時,且在傳送任何其他資料之前,才會轉發到上游(注意:這包括在發生 TLS 握手之前)。如果可能,應優先使用 x-forwarded-for 標頭,因為 Envoy 可以透過此方法重複使用上游連線。由於 Envoy 處理下游和上游連線之間存在脫節,因此最好在上游連線上強制執行較短的 閒置逾時,因為當下游連線關閉時,Envoy 本身不會關閉相應的上游連線。
Proxy Protocol 的一些缺點:
它僅支援 TCP 協定。
它需要上游主機支援。
原始來源監聽器篩選器
在受控部署中,可以使用原始來源監聽器篩選器在上游連線上複製下游遠端位址。沒有中繼資料會新增到上游請求或資料流中。相反地,上游連線本身將會使用下游遠端位址作為其來源位址來建立。此篩選器適用於任何上游協定或主機。然而,它需要相當複雜的設定,而且由於路由限制,可能並非在所有部署中都支援。
原始來源篩選器的一些缺點:
它要求 Envoy 能夠存取下游遠端位址。
其設定相對複雜。
由於連線集區限制,它可能會產生輕微的效能影響。
在 Windows 上不支援。
原始來源 HTTP 篩選器
在受控部署中,可以使用原始來源 HTTP 篩選器在上游連線上複製下游遠端位址。此篩選器的運作方式與原始來源監聽器篩選器非常相似。主要區別在於它可以從 HTTP 標頭中推斷原始來源位址,這對於單一下游連線攜帶來自不同原始來源位址的多個 HTTP 請求的情況很重要。具有轉發到 Sidecar 代理的前端代理的部署是適用此情況的範例。
此篩選器適用於任何上游 HTTP 主機。然而,它需要相當複雜的設定,而且由於路由限制,可能並非在所有部署中都支援。
原始來源篩選器的一些缺點:
它要求 Envoy 經過正確設定,以從 x-forwarded-for 標頭中提取下游遠端位址。
其設定相對複雜。
由於連線集區限制,它可能會產生輕微的效能影響。
注意
Windows 不支援此功能。