原始源

在 Envoy 的上游侧,原始源监听器过滤器复制连接的下游远程地址。例如,如果下游连接以IP地址 10.1.2.3 连接到 Envoy,则 Envoy 将以源 IP 10.1.2.3 连接到上游。

与代理协议的交互

如果连接尚未转换或代理其源地址,则 Envoy 可以简单地使用现有的连接信息来构建正确的下游远程地址。 但是,如果不正确,则可以使用 代理协议过滤器 提取下游远程地址。

IP 版本支持

该过滤器同时支持 IPv4 和 IPv6 作为地址。 注意上游连接必须支持所使用的版本。

额外设置

使用的下游远程地址很可能是全局可路由的。 默认情况下,从上游主机返回到该地址的数据包将不会通过 Envoy 路由。必须将网络配置为通过 Envoy 主机强制路由回所有 IP 被 Envoy 复制的流量。

如果 Envoy 和上游在同一主机上 – 例如在 Sidecar 部署中,则可以使用 iptables 和路由规则来确保正确的行为。过滤器具有无符号整数配置,即 mark 。将此设置为 X 会导致 Envoy 用 X标记 来自此监听器的所有上游数据包。 注意如果将 mark 的值设置为 0,Envoy 将不会标记上游数据包。

We can use the following set of commands to ensure that all ipv4 and ipv6 traffic marked with X (assumed to be 123 in the example) routes correctly. Note that this example assumes that eth0 is the default outbound interface. 我们可以使用以下命令集来确保所有标有 X*(在示例中假定为 123)的 ipv4 和 ipv6 流量正确路由。 注意此示例假定 *eth0 为 默认出站接口。

iptables  -t mangle -I PREROUTING -m mark     --mark 123 -j CONNMARK --save-mark
iptables  -t mangle -I OUTPUT     -m connmark --mark 123 -j CONNMARK --restore-mark
ip6tables -t mangle -I PREROUTING -m mark     --mark 123 -j CONNMARK --save-mark
ip6tables -t mangle -I OUTPUT     -m connmark --mark 123 -j CONNMARK --restore-mark
ip rule add fwmark 123 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
ip -6 rule add fwmark 123 lookup 100
ip -6 route add local ::/0 dev lo table 100
echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet

监听器配置示例

下面的示例将 Envoy 配置为对端口 8888 上的所有连接使用原始源。它使用代理协议来确定下游远程地址。所有上游数据包被标记为 123。

listeners:
- address:
    socket_address:
      address: 0.0.0.0
      port_value: 8888
  listener_filters:
    - name: envoy.filters.listener.proxy_protocol
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.listener.proxy_protocol.v3.ProxyProtocol
    - name: envoy.filters.listener.original_src
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.listener.original_src.v3.OriginalSrc
        mark: 123