Envoy不终止TLS时基于SNI替换域名前缀路由配置排错
问题结论
该需求完全可实现,你现有配置存在4个核心问题,修正后即可正常运行:
- YAML层级缩进错误:你错误将HTTP Lua过滤器配置嵌套到了
sni_dynamic_forward_proxy的dns_cache_config字段下,属于语法错误,配置无法被Envoy正常加载。 - 过滤器类型选错:你使用的
envoy.filters.http.lua是HTTP层过滤器,仅在Envoy终止TLS、解密得到HTTP流量后才会触发。你当前是TCP透传(不终止TLS)场景,HTTP过滤器链根本不会执行,你设置的REQUESTED_SERVER_NAME变量永远不会生效,TCP代理无法读取到该值。 - 多余配置无效:
tcp_proxy中的tunneling_config是用于HTTP CONNECT隧道场景的配置,纯TCP透传原始TLS流量不需要该配置,保留反而会导致转发逻辑异常。 - 逻辑实现冗余:
sni_dynamic_forward_proxy本身就支持基于正则重写从TLS握手明文提取的SNI值,不需要额外写Lua脚本读取根本拿不到的HTTP Host头(不终止TLS时HTTP头是加密的,无法读取)。
修正后的可运行配置
static_resources: listeners: - name: listener_0 address: socket_address: protocol: TCP address: 0.0.0.0 port_value: 9002 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 # 自动将转发给上游的TLS握手中的SNI修改为重写后的域名,若上游不校验SNI可设为false rewrite_sni_to_upstream_address: true # 正则匹配替换SNI:把dd-前缀替换为wd- regex_rewrite: pattern: regex: "^dd-(.*)$" substitution: "wd-\\1" dns_cache_config: name: dynamic_forward_proxy_cache_config dns_lookup_family: V4_ONLY - name: envoy.filters.network.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
配置说明
- 全程不做TLS终止:TLS握手后的加密流量会被原样透传到上游,仅修改ClientHello明文中的SNI字段,符合你的透传要求。
- 配置自动完成SNI提取、前缀替换、DNS解析、转发全流程,不需要额外脚本。
- 支持所有动态
server_name场景匹配,不需要预先配置域名规则。
内容的提问来源于stack exchange,提问作者kane.zorfy
相关产品推荐
相关产品推荐

