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 上不受支持。