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 不支援此功能。