IP 透明性

什么是 IP 透明性

作为代理,Envoy 是一个 IP 端点:它拥有自己的 IP 地址,与任何下游请求的 IP 地址不同。因此,当 Envoy 建立到上游主机的连接时,该连接的 IP 地址将与任何代理连接的 IP 地址不同。

有时,上游服务器或网络可能需要出于多种原因了解连接的原始 IP 地址,称为下游远程地址。一些示例包括

  • IP 地址用于构成身份的一部分,

  • IP 地址用于执行网络策略,或

  • IP 地址包含在审核中。

Envoy 支持多种方法将下游远程地址提供给上游主机。这些技术在复杂性和适用性方面有所不同。

Envoy 还支持 扩展 用于检测原始 IP 地址。如果您无法使用以下任何技术,这可能会有所帮助。两个可用的扩展是 自定义标头 扩展和 xff 扩展。

HTTP 标头

HTTP 标头可能会在 x-forwarded-for 标头中携带请求的原始 IP 地址。上游服务器可以使用此标头来确定下游远程地址。Envoy 也可能使用此标头来选择 原始 Src HTTP 过滤器 使用的 IP 地址。

HTTP 标头方法有一些缺点

  • 它只适用于 HTTP。

  • 它可能不受上游主机支持。

  • 它需要仔细配置。

代理协议

HAProxy 代理协议 定义了一种协议,用于在 TCP 主 TCP 流之前通过 TCP 传输有关连接的元数据。此元数据包括源 IP。Envoy 支持使用 代理协议过滤器 消费此信息,该过滤器可用于恢复下游远程地址以传播到 x-forwarded-for 标头中。它还可以与 原始 Src 监听器过滤器 结合使用。最后,Envoy 支持使用 代理协议传输套接字 生成此标头。

以下是如何设置套接字的示例配置

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
  ...

如果您计划将此套接字与 HTTP 连接管理器 结合使用,则需要考虑以下几点。由于代理协议是一种基于连接的协议,因此将存在性能损失,因为下游客户端之间不会重用上游连接。连接到 Envoy 的每个客户端都将获得一个到上游服务器的新连接。由于代理协议是一种基于连接的协议,因此存在这种性质。下游客户端信息仅在连接开始之前(在任何其他数据发送之前)转发到上游(注意:这包括在 TLS 握手发生之前)。如果可能,使用 x-forwarded-for 标头应优先考虑,因为 Envoy 将能够使用此方法重用上游连接。由于 Envoy 处理下游连接和上游连接之间的断开连接,因此在实践中对上游连接强制执行较短的 空闲超时 是一个好主意,因为 Envoy 本身不会在下游连接关闭时关闭相应的上游连接。

代理协议的一些缺点

  • 它只支持 TCP 协议。

  • 它需要上游主机支持。

原始源监听器过滤器

在受控部署中,可以通过使用 原始源监听器过滤器 在上游连接上复制下游远程地址。不会将元数据添加到上游请求或流中。相反,上游连接本身将使用下游远程地址作为其源地址建立。此过滤器将适用于任何上游协议或主机。但是,它需要相当复杂的配置,并且由于路由限制,可能不会在所有部署中都受支持。

原始源过滤器的某些缺点

  • 它要求 Envoy 能够访问下游远程地址。

  • 它的配置相对复杂。

  • 由于连接池的限制,它可能会导致轻微的性能损失。

  • 在 Windows 上不受支持。

原始源 HTTP 过滤器

在受控部署中,可以通过使用 原始源 HTTP 过滤器 在上游连接上复制下游远程地址。此过滤器的操作方式与 原始 Src 监听器过滤器 非常相似。主要区别在于它可以从 HTTP 标头推断出原始源地址,这对于单个下游连接携带来自不同原始源地址的多个 HTTP 请求的情况很重要。具有将流量转发到 sidecar 代理的前端代理的部署是此用例适用的示例。

此过滤器将适用于任何上游 HTTP 主机。但是,它需要相当复杂的配置,并且由于路由限制,可能不会在所有部署中都受支持。

原始源过滤器的某些缺点

  • 它要求 Envoy 正确配置以从 x-forwarded-for 标头中提取下游远程地址。

  • 它的配置相对复杂。

  • 由于连接池的限制,它可能会导致轻微的性能损失。

注意

此功能在 Windows 上不受支持。