SNI 动态转发代理

注意

SNI 动态转发代理支持应被视为 alpha 版本,尚未准备好用于生产环境。

通过结合 TLS 检查器 监听器过滤器,此网络过滤器以及 动态转发代理集群,Envoy 支持基于 服务器名称指示 (SNI) 的动态转发代理。实现方式与 HTTP 动态转发代理 相同,但使用 SNI 中的值作为目标主机。

以下是配置此过滤器以及 动态转发代理集群 的完整配置。过滤器和集群必须一起配置,并指向相同的 DNS 缓存参数,才能使 Envoy 作为 SNI 动态转发代理运行。

注意

以下配置不会在监听器中终止 TLS,因此无需在集群中配置 TLS 上下文。TLS 握手由 Envoy 传递。

admin:
  address:
    socket_address:
      protocol: TCP
      address: 127.0.0.1
      port_value: 9901
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    listener_filters:
    - name: envoy.filters.listener.tls_inspector
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector
    filter_chains:
    - filters:
      - name: envoy.filters.network.sni_dynamic_forward_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.sni_dynamic_forward_proxy.v3.FilterConfig
          port_value: 443
          dns_cache_config:
            name: dynamic_forward_proxy_cache_config
            dns_lookup_family: V4_ONLY
      - name: envoy.tcp_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
          stat_prefix: tcp
          cluster: dynamic_forward_proxy_cluster
  clusters:
  - name: dynamic_forward_proxy_cluster
    lb_policy: CLUSTER_PROVIDED
    cluster_type:
      name: envoy.clusters.dynamic_forward_proxy
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.clusters.dynamic_forward_proxy.v3.ClusterConfig
        dns_cache_config:
          name: dynamic_forward_proxy_cache_config
          dns_lookup_family: V4_ONLY

动态主机和端口选择

默认情况下,SNI 动态转发代理使用 SNI 作为目标主机,但它可以通过其他网络过滤器在每个连接的基础上动态设置,方法是在键 envoy.upstream.dynamic_host 下设置每个连接状态对象。此外,SNI 动态转发代理使用默认端口过滤器配置作为目标端口,但它可以通过在键 envoy.upstream.dynamic_port 下设置每个连接状态对象来动态设置。如果设置了这些对象,它们将优先于 SNI 值和默认端口。如果覆盖的端口超出有效端口范围,则覆盖值将被忽略,并将使用配置的默认端口。有关详细信息,请参阅实现。