You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置Envoy多下游节点时filter_chain_match.server_names匹配失败问题

Envoy多子域名filter_chain匹配失败问题解决

问题根源

你遇到的核心问题是**filter_chain_match.server_names匹配的是TLS握手阶段客户端发送的SNI(Server Name Indication)字段**,如果客户端请求未携带SNI,或者SNI值和配置的sub1.foo.com不匹配,Envoy就找不到对应的filter_chain处理请求,自然会无响应。移除该配置后,这个filter_chain会成为默认匹配项,所有请求都能被正常处理。

解决方案

要实现每个子域名使用独立证书的目标,按以下步骤调整配置即可:

1. 确认客户端SNI发送情况

现代浏览器、curl等主流客户端都会自动发送SNI,但如果是老旧客户端或自定义请求,需要确认SNI是否正确携带(比如用curl -v https://sub1.foo.com查看输出中的SNI信息)。

2. 为每个子域名配置独立filter_chain

给每个子域名单独配置带filter_chain_match.server_names的filter_chain,同时必须添加默认兜底filter_chain,用来处理SNI不匹配或未携带SNI的请求,避免请求直接被丢弃。

3. 调整后的完整配置示例

以下是包含两个子域名和默认兜底的Listeners配置:

---
static_resources:
  listeners:
    - name: main_listener
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 443
      filter_chains:
        # sub1.foo.com专属filter_chain
        - filter_chain_match:
            server_names: ["sub1.foo.com"]
          transport_socket:
            name: envoy.transport_sockets.tls
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
              common_tls_context:
                tls_certificates:
                  private_key:
                    filename: /etc/envoy/certs/serverkey_family.pem
                    watched_directory:
                      path: /etc/envoy/certs/
                  certificate_chain:
                    filename: /etc/envoy/certs/servercert_family.pem
                    watched_directory:
                      path: /etc/envoy/certs/
                alpn_protocols:
                  - h2,http/1.1
          filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                stat_prefix: ingress_http_family
                http_filters:
                  - name: envoy.filters.http.router
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                route_config:
                  name: route_family
                  virtual_hosts:
                    - name: vm_family
                      domains: ["sub1.foo.com"]
                      routes:
                        - match: { prefix: "/" }
                          route: { cluster: cluster_heritagearchive }
        # sub2.foo.com专属filter_chain
        - filter_chain_match:
            server_names: ["sub2.foo.com"]
          transport_socket:
            name: envoy.transport_sockets.tls
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
              common_tls_context:
                tls_certificates:
                  private_key:
                    filename: /etc/envoy/certs/serverkey_sub2.pem
                    watched_directory:
                      path: /etc/envoy/certs/
                  certificate_chain:
                    filename: /etc/envoy/certs/servercert_sub2.pem
                    watched_directory:
                      path: /etc/envoy/certs/
                alpn_protocols:
                  - h2,http/1.1
          filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                stat_prefix: ingress_http_sub2
                http_filters:
                  - name: envoy.filters.http.router
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                route_config:
                  name: route_sub2
                  virtual_hosts:
                    - name: vm_sub2
                      domains: ["sub2.foo.com"]
                      routes:
                        - match: { prefix: "/" }
                          route: { cluster: cluster_sub2 }
        # 默认兜底filter_chain(处理无SNI或不匹配的请求)
        - transport_socket:
            name: envoy.transport_sockets.tls
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
              common_tls_context:
                tls_certificates:
                  private_key:
                    filename: /etc/envoy/certs/serverkey_default.pem
                    watched_directory:
                      path: /etc/envoy/certs/
                  certificate_chain:
                    filename: /etc/envoy/certs/servercert_default.pem
                    watched_directory:
                      path: /etc/envoy/certs/
                alpn_protocols:
                  - h2,http/1.1
          filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                stat_prefix: ingress_http_default
                http_filters:
                  - name: envoy.filters.http.router
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                route_config:
                  name: route_default
                  virtual_hosts:
                    - name: vm_default
                      domains: ["*"]
                      routes:
                        - match: { prefix: "/" }
                          route: { cluster: cluster_default }

4. 关键注意事项

  • filter_chain顺序:Envoy按从上到下的顺序匹配filter_chain,需把匹配规则更具体的(比如单个子域名)放在前面,兜底项放在最后。
  • SNI通配符规则:server_names支持通配符(如*.foo.com),但仅允许最左侧使用通配符(sub*.foo.com这类写法不合法)。
  • 证书对应关系:每个filter_chain的证书必须匹配其server_names中的域名,否则会触发TLS握手失败。

内容的提问来源于stack exchange,提问作者MortalFool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:05:06