【Envoy 数据面】Listener 与 FilterChainMatch:accept、listener filters 与选链失败

💡 原文中文,约6600字,阅读约需16分钟。
📝

内容提要

本文介绍Envoy中Listener filters与FilterChainMatch如何协同选链:先由listener filters(如TLS Inspector)丰富连接元数据,再按FilterChainMatch规则匹配最具体的链,无匹配则走默认链或关闭连接。选错链会导致TLS握手失败或协议错误,而非典型upstream故障。排障应先检查连接是否被accept、Inspector是否识别TLS/SNI/ALPN,再确认命中链名,最后才查network filters。

🔎

延伸解读

选链失败与上游故障的区分

选错链的典型表现是TLS握手失败、明文撞上TLS链或HTTP编解码错误,而非典型的upstream故障(如503)。排障时应先检查连接是否被accept、Inspector是否识别TLS/SNI/ALPN,再确认命中链名,最后才查network filters。跳过前三步直接查upstream,是本层最常见的排障浪费。

TLS Inspector的边界与失败语义

TLS Inspector是选链的关键,无它则依赖SNI/ALPN的匹配无法生效。注意ClientHello过大或解析失败时,默认可能被当成明文路径;close_connection_on_client_hello_parse_error等开关会改变失败语义。不要把探测失败静默当成明文业务,应关注tls_found、tls_not_found等计数。

FilterChainMatch的特异性与配置表面

FilterChainMatch要求全部条件满足,且选用最具体的匹配(如www.example.com优于*.example.com)。较新的Filter chain matcher API用命名链+matcher tree替代或补充传统filter_chain_match。排障时先确认用的是哪套配置表面,因为两者可并存,且匹配失败会关连接或掉进错误的默认链。

Proxy Protocol与original_dst的地址语义

Proxy Protocol与original_dst常一起出现在前面有LB或TPROXY的拓扑:前者恢复真实客户端,后者恢复被DNAT改写前的目的地址。缺一则FilterChainMatch或访问日志里的地址语义会与运维假设错位,表现为策略按错IP生效,而不是codec报错。

Q&A

Envoy中Listener filters和FilterChainMatch是如何协同工作的?

Envoy中,连接被accept后,先运行listener filters(如TLS Inspector)来丰富连接元数据(如SNI、ALPN),然后根据这些元数据,FilterChainMatch会匹配最具体的filter chain;如果没有匹配,则使用default_filter_chain或关闭连接。

为什么TLS Inspector是选链的关键?没有它会怎样?

TLS Inspector是选链的关键,因为它能识别TLS并提取SNI和ALPN,这些信息是FilterChainMatch匹配的重要依据。如果没有TLS Inspector,依赖SNI/ALPN的匹配规则将无法生效,可能导致选链失败或错误。

Envoy中选错filter chain的典型表现有哪些?

选错filter chain的典型表现包括:TLS握手失败、明文HTTP被当作TLS处理(或相反)、HTTP编解码错误等,而不是常见的upstream故障(如503)。

Envoy中FilterChainMatch的匹配规则是什么?如何确定最具体的链?

FilterChainMatch要求一条链被选中当且仅当其所有条件都被满足,条件包括SNI、transport_protocol、ALPN、目的/源地址等。对于范围或通配,选择最具体的匹配,例如精确的server_names优于通配符。

Envoy中无匹配且无默认链时会发生什么?

如果连接没有匹配到任何filter chain,且没有配置default_filter_chain,连接将被关闭,这通常是连接被黑洞的第一嫌疑点。

Envoy排障时,为什么应该先检查连接是否被accept、Inspector是否识别TLS/SNI/ALPN,再检查命中链名?

因为选链过程是:accept → listener filters → FilterChainMatch。如果连接未被accept,后续无从谈起;如果Inspector未识别TLS/SNI/ALPN,匹配条件可能不满足;确认命中链名后才能进入network filters阶段。跳过前三步直接查upstream是常见的排障浪费。

Envoy中Proxy Protocol和original_dst的作用是什么?缺失会导致什么问题?

Proxy Protocol用于解析HAProxy PROXY头,恢复真实客户端地址;original_dst用于获取原始目的地址(透明代理/TPROXY场景)。缺失会导致FilterChainMatch或访问日志中的地址语义与运维假设错位,表现为策略按错IP生效,而不是codec报错。

🏷️

标签

➡️

继续阅读