
后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载导读本文聚焦 BFE百度开源的现代 L7 负载均衡器条件原语Condition Primitive体系中与 TLS 会话直接相关的三个原语ses_tls_sni_in()、ses_tls_client_auth()与ses_tls_client_ca_in()。它们用于在路由、模块处理等环节根据 TLS 握手阶段的信息客户端 SNI、是否启用双向认证、客户端证书签发 CA做出判断。读完本文你将掌握这三个原语的完整语法、参数规则、大小写匹配语义以及它们在 BFE 配置文件中的真实用法与底层实现原理。会话原语与 TLS 数据从哪来命名约定ses_前缀代表会话级原语BFE 的条件原语按数据来源分为四类命名前缀一目了然见 docs/en_us/condition/condition_naming_convention.md前缀类别示例req_请求原语req_host_in()res_响应原语res_code_in()ses_会话原语ses_vip_range()、ses_tls_sni_in()bfe_系统原语bfe_time_range()本文的ses_tls_*系列即属于会话原语取值的对象是「一次入站 TCP 连接Session」而非单条 HTTP 请求。Session 与 TlsState 的结构在 bfe_basic/session.go 中Session结构体记录了连接级信息IsSecure连接是否为 TLS 加密连接TlsState *bfe_tls.ConnectionStateTLS 握手完成后保存的完整连接状态。ConnectionState定义于 bfe_tls/common.go其中与本文相关的字段包括ServerName客户端在 ClientHello 中携带的 SNI服务器名称指示ClientAuth是否启用了 TLS 双向认证mTLSClientCAName客户端证书签发根 CA 的标识名。这些字段由 BFE 自研的 TLS 库bfe_tls在握手阶段填充。关键链路如下服务端握手时根据 TLS 规则为连接选择客户端认证策略与 CA见 bfe_tls/handshake_server.go当规则ClientAuth为真时将c.clientAuth设为RequireAndVerifyClientCert并记录c.clientCAName握手完成后ConnectionState()方法把内部状态导出到公开结构见 bfe_tls/conn.go其中ClientAuth仅当认证类型为RequireAndVerifyClientCert时才置真BFE 服务端在 bfe_server/http_conn.go 中执行tlsConn.Handshake()后将tlsConn.ConnectionState()保存到session.TlsState供条件原语读取。ses_tls_sni_in(host_list)按 SNI 域名匹配语义与参数ses_tls_sni_in()判断「TLS 握手中客户端 SNI 字段是否命中 host_list 中的某个域名」忽略大小写。参数描述host_listString域名列表多个域名之间使用\|分隔示例ses_tls_sni_in(example.com|example.org)适用场景SNI 是客户端在 TLS ClientHello 中明示的服务器域名常用于在建立连接后、路由决策前按目标域名分流例如多个站点共享同一组 VIP 与证书时用 SNI 区分流量基于 SNI 触发仅针对特定域名的限速、封禁、日志、重写等模块动作与 IP 范围等条件组合实现「来自指定网段且访问指定域名」的精细化策略。配置文件中的真实组合示例可见 conf/mod_key_log/key_log.data{ Version: init version, Config: { global: [ { Cond: ses_sip_range(\10.0.0.1\, \10.0.0.10\) ses_tls_sni_in(\example.com|example.org\) } ] } }该配置把「源 IP 位于 10.0.0.110.0.0.10 且 SNI 命中 example.com 或 example.org」作为 key_log 模块的记录条件。底层实现Fetcher Matcher 模式BFE 的条件原语统一采用「取值器Fetcher 匹配器Matcher」两层结构接口定义见 bfe_basic/condition/primitive.go。ses_tls_sni_in在构建时被组装为FetcherSniFetcher见 bfe_basic/condition/primitive.go从req.Session.TlsState.ServerName取值若会话为空、非 TLS 连接、TlsState 为空或 SNI 为空则返回错误条件最终判为不匹配MatcherNewInMatcher(host_list, true)第二个参数true表示忽略大小写见 bfe_basic/condition/build.go。InMatcher的实现见 bfe_basic/condition/primitive.go会把取值与列表项统一转为大写后做集合成员判断并在构建时对列表排序因此域名匹配不区分大小写。测试验证单元测试 bfe_basic/condition/build_test.go 验证了两个要点Session{TlsState: ConnectionState{ServerName: test.com}, IsSecure: true}时ses_tls_sni_in(test.com)匹配成功同一 Session 若IsSecure为 false非 TLS 连接即使 TlsState 中存在 SNI条件也不匹配。这再次印证ses_tls_*系列原语严格限定在 TLS 加密连接上生效。ses_tls_client_auth()判断是否启用双向认证语义ses_tls_client_auth()无参数返回布尔值当前连接是否启用了 TLS 双向认证mTLS即服务端要求并校验了客户端证书。ses_tls_client_auth()底层实现该原语不采用 FetcherMatcher 组合而是直接实现为独立的ClientAuthMatcher见 bfe_basic/condition/primitive.go要求请求、Session、IsSecure与TlsState均有效然后返回TlsState.ClientAuth。根据 bfe_tls/conn.goClientAuth只有在握手采用的客户端认证策略为RequireAndVerifyClientCert要求并校验客户端证书时才会被置为 true因此该原语能精确表达「mTLS 已生效」这一状态。测试验证测试用例 bfe_basic/condition/build_test.go 覆盖ClientAuth: true且IsSecure: true时匹配ClientAuth: false时即使连接为 TLS不匹配。典型用法双向认证开启后BFE 可获得客户端证书链中的 CA 信息此时通常与ses_tls_client_ca_in()组合使用以区分「不同 CA 签发的客户端」——例如仅对特定 CA 签发的内部客户端放行高级功能其余客户端走基础策略ses_tls_client_auth() ses_tls_client_ca_in(internal-ca|partner-ca)ses_tls_client_ca_in(ca_list)按客户端签发 CA 匹配语义与参数ses_tls_client_ca_in()判断「是否启用 TLS 双向认证且客户端证书的签发根 CA 命中 ca_list 中的某个标识」区分大小写。参数描述ca_listStringCA 标识列表多个 CA 标识之间使用\|分隔示例ses_tls_client_ca_in(ca1|ca2)注意与ses_tls_sni_in的语义差异CA 匹配是严格区分大小写的配置时必须与握手阶段实际记录的ClientCAName完全一致。底层实现ses_tls_client_ca_in的构建见 bfe_basic/condition/build.go为FetcherClientCANameFetcher见 bfe_basic/condition/primitive.go从req.Session.TlsState.ClientCAName取值只有连接为 TLS、已启用双向认证ClientAuth为 true且ClientCAName非空时才返回成功否则返回错误并判为不匹配MatcherNewInMatcher(ca_list, false)第二个参数false表示不忽略大小写。CA 名称从何而来ClientCAName并非客户端证书里的 CN 或签发者 DN 字符串而是BFE TLS 规则中为该客户端认证策略配置的 CA 标识名。当 TLS 服务端规则启用ClientAuth时握手代码会把规则的ClientCAName写入连接状态见 bfe_tls/handshake_server.go。规则的ClientCAName字段定义于 bfe_tls/common.go 的Rule结构体并在 bfe_server/tls_server_rule.go 中从 TLS 规则配置装载。因此使用ses_tls_client_ca_in()前需要先在 BFE 的 TLS 规则配置tls_rule_conf中为相关 VIP/SNI 配置启用ClientAuth并指定ClientCAName使握手阶段能够记录该标识。测试验证测试用例 bfe_basic/condition/build_test.go 验证ClientAuth: true, ClientCAName: clientCa时ses_tls_client_ca_in(clientCa)匹配若ClientAuth为 false即使ClientCAName非空也不匹配——与「双向认证未启用」的语义一致。语法要点条件表达式中的组合使用三个原语返回值均为 bool符合 BFE 条件表达式的 CE 文法见 docs/en_us/condition/condition_grammar.mdCE CE CE | CE || CE | ( CE ) | ! CE | ConditionPrimitive运算符优先级与 C 语言一致()!||。例如仅对「TLS 且 SNI 命中」的连接生效可写ses_tls_sni_in(example.com) !ses_tls_client_auth()即访问 example.com 的 TLS 连接中未启用 mTLS 的连接命中该条件。此外这些原语在使用前需通过解析器的语义检查ses_tls_sni_in与ses_tls_client_ca_in要求恰好一个字符串参数ses_tls_client_auth不允许参数参数数量或类型不符会在构建阶段报错函数原型表见 bfe_basic/condition/parser/semant.go。条件原语索引与配套文档全部条件原语的索引见 docs/en_us/condition/condition_primitive_index.md其中ses_tls_client_auth、ses_tls_client_ca_in、ses_tls_sni_in分别归类于 tls client 与 tls sni 小节条件表达式概念与运算符文法见 docs/en_us/condition/condition_grammar.md条件原语命名约定见 docs/en_us/condition/condition_naming_convention.md中文版说明见 docs/zh_cn/condition/session/tls.md。小结原语判断内容参数大小写敏感生效前提ses_tls_sni_in(host_list)SNI 是否命中域名列表1 个字符串\|分隔不敏感TLS 连接且 SNI 非空ses_tls_client_auth()是否启用双向认证无—TLS 连接认证策略为 RequireAndVerifyClientCertses_tls_client_ca_in(ca_list)双向认证且签发 CA 是否命中1 个字符串\|分隔敏感TLS 连接、启用双向认证且 ClientCAName 非空这三个会话级 TLS 原语构成了 BFE 在「连接维度」上做 TLS 精细化调度的基础工具配合请求级req_与系统级bfe_原语可以编排从握手到响应全链路的访问控制与路由策略。实际配置前建议结合 conf/bfe.conf 及各模块的配置模板如 conf/mod_key_log/key_log.data验证条件表达式的可解析性与实际匹配效果。赞分享后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载相关推荐BFE 条件原语详解用 ses_sip_range / ses_vip_range 实现会话源 IP 与 VIP 区间匹配BFE 条件原语详解用 ses_sip_range / ses_vip_range 实现会话源 IP 与 VIP 区间匹配 导读 本文围绕 BFEBaidu后端网络/通信云原生BFE 客户端 IP 与 VIP 条件原语req_cip_* / req_vip_*实战指南BFE 客户端 IP 与 VIP 条件原语req_cip_ / req_vip_ 实战指南 本文以 BFE 条件表达式框架中的 IP 相关条件原语为线索系后端网络/通信云原生curl 客户端证书认证完全指南--cert/-E 参数与 TLS 双向认证实战curl 客户端证书认证完全指南 cert / E 参数与 TLS 双向认证实战 本文以 curl 仓库中 docs/cmdline opts/cert.mdCLI网络通信上一篇GeoLibre 网页版故障排查指南陈旧缓存自动恢复、插件激活与 Web/桌面能力边界下一篇如何免费下载Steam创意工坊模组WorkshopDL一站式上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考