2. Envoy 架构解析:监听器、集群、路由、过滤器链、热重启机制

Envoy 的架构设计围绕四个核心抽象展开:Listener(监听器)、Cluster(集群)、Route(路由)和Filter Chain(过滤器链)。理解这些组件及其交互关系,是配置安全策略和进行运行基线核验的基础。此外,热重启(Hot Restart)机制保证了配置更新与进程升级过程中的零流量中断。

2.1 核心架构总览

Envoy 采用主从线程模型:一个主线程负责配置管理与统计刷新,多个工作线程(Worker)各自持有独立的 Event Loop 处理网络 I/O。每个工作线程内部,Listener 接收连接,Filter Chain 处理数据,Router 决定目标 Cluster,最终通过连接池转发请求。

Envoy 核心架构总览(单工作线程视角) 外部流量 Listener (L3/L4 绑定) Filter Chain (L4 读/写 + L7 HTTP) TLS 终止 · RBAC · 限流 Router (虚拟主机匹配) Cluster (端点发现 · 负载均衡 · 健康检查) 主动 HC / 被动 HC 上游服务端点 说明: 每个工作线程独立运行上述链路;Listener 可配置多个,Filter Chain 按匹配顺序执行,Router 根据虚拟主机和路由表选择 Cluster。 安全策略主要注入在 Filter Chain(TLS/RBAC/限流)和 Cluster(端点认证/健康检查)中。

2.2 监听器(Listener)

Listener 是 Envoy 的网络入口,负责绑定 IP:Port 并接受下游连接。每个 Listener 可以配置多个过滤器链(Filter Chain),根据 TLS 握手信息(SNI、ALPN)或连接元数据选择不同的链。

配置项安全相关说明
address绑定地址,建议使用 0.0.0.0 仅限内部网络,避免暴露到公网
filter_chains按 SNI 匹配不同证书链,实现多租户 TLS 隔离
listener_filters在 L3/L4 层做原始连接过滤(如 IP 白名单、TLS 检测)
per_connection_buffer_limit_bytes限制连接缓冲区大小,防止内存耗尽攻击
socket_options设置 TCP_FASTOPEN、SO_KEEPALIVE 等内核参数
安全基线建议:每个 Listener 应显式配置 bind_to_port: true 和 reuse_port: true,并设置 listener_filters 中的 tls_inspector 以识别 TLS 流量,避免明文协议混入。

2.3 集群(Cluster)

Cluster 定义了 Envoy 将请求转发到的上游服务端点集合,以及连接管理、负载均衡和健康检查策略。从安全角度看,Cluster 是服务间认证与流量加密的关键配置点。

  • 端点发现:支持静态配置、DNS、EDS(Endpoint Discovery Service)等方式。生产环境推荐使用 EDS 配合控制面动态下发。
  • 负载均衡:支持 Round Robin、Least Request、Ring Hash 等算法。Ring Hash 可在端点变更时最小化重新哈希。
  • 健康检查:主动健康检查(Active HC)定期探测端点;被动健康检查(Outlier Detection)根据连续错误或延迟驱逐异常端点。
  • 传输层安全:通过 transport_socket 配置上游 TLS,支持双向 mTLS 和证书固定。
安全配置要点:
  • 启用 upstream_tls 并设置 trusted_ca 验证上游证书。
  • 配置 circuit_breakers 限制最大连接数、请求数,防止级联故障。
  • 设置 outlier_detection 的 consecutive_5xx 和 interval_ms,快速隔离异常端点。

2.4 路由(Router)

Router 过滤器(envoy.filters.http.router)负责将 HTTP 请求匹配到虚拟主机(Virtual Host)和路由条目(Route Entry),最终决定目标 Cluster。路由匹配基于 prefix、path、regex、headers、query_parameters 等条件。

路由动作说明安全场景
route转发到指定 Cluster正常业务路由
redirect返回 301/302 重定向HTTP → HTTPS 强制跳转
direct_response直接返回固定响应返回 403/404 拒绝未授权路径
filter_action执行自定义过滤器动作触发审计日志或额外验证
注意:路由顺序敏感,精确路径应放在前缀匹配之前。避免使用过于宽泛的正则表达式,防止 ReDoS(正则拒绝服务)攻击。

2.5 过滤器链(Filter Chain)

过滤器链是 Envoy 安全策略的核心执行点。Envoy 支持L4 网络过滤器和L7 HTTP 过滤器,两者可以混合使用。过滤器按配置顺序依次执行,形成管道(Pipeline)。

过滤器链执行流程(L4 + L7 混合) 连接 L4 过滤器 TLS 终止 原始 IP 检测 HTTP CM 协议解析 流管理 L7 过滤器链 ① RBAC 授权 ② 限流 (Rate Limit) ③ CORS / 请求头修改 ④ Router 转发 上游 过滤器链执行顺序与安全策略注入点: 1. L4 过滤器:TLS 终止(envoy.filters.listener.tls_inspector)、原始连接限速。 2. HTTP 连接管理器:解析 HTTP/1.1、HTTP/2、gRPC 协议,生成请求/响应头。 3. L7 过滤器链:按序执行 RBAC、限流、CORS、故障注入、Router 等过滤器。 4. Router 过滤器:根据路由表选择目标 Cluster,执行重试、超时、流量镜像。

2.6 热重启机制(Hot Restart)

Envoy 通过热重启实现配置更新和二进制升级时的零流量中断。其核心原理是:新进程启动后,通过共享内存(Shared Memory)和 Unix Domain Socket 从旧进程继承监听套接字,然后旧进程优雅关闭。

阶段动作安全关注点
1. 新进程启动读取共享内存中的监听套接字,开始接受新连接确保新进程使用相同的证书和密钥文件
2. 旧进程停止接受旧进程关闭监听套接字,不再接受新连接旧进程继续处理存量请求,直到超时或完成
3. 存量连接迁移旧进程等待存量请求完成,或达到 drain_time 后强制关闭设置合理的 drain_time(默认 5 秒),避免连接突然中断
4. 旧进程退出旧进程释放共享内存,发送 SIGTERM 退出监控旧进程退出状态,确保无泄漏
热重启安全配置清单:
  • 设置 --hot-restart-version 参数确保新旧进程版本兼容。
  • 配置 --parent-shutdown-time-s 控制父进程最大存活时间(默认 900 秒)。
  • 使用 --drain-strategy immediate 或 gradual 控制连接排空行为。
  • 在 Kubernetes 环境中,结合 preStop 钩子调用 /healthcheck/fail 端点,避免流量在重启期间进入。

2.7 架构组件关系总结

下表总结了四个核心组件在安全策略配置中的角色与关键配置项:

组件安全角色关键配置项
Listener入口控制、TLS 终止、连接限速filter_chains、listener_filters、per_connection_buffer_limit_bytes
Filter Chain认证、授权、限流、日志审计envoy.filters.http.rbac、envoy.filters.http.ratelimit、envoy.filters.http.ext_authz
Router请求路由、重定向、直接响应route、redirect、direct_response、cors
Cluster上游认证、连接池管理、健康检查transport_socket、circuit_breakers、outlier_detection、health_checks
实践建议:在编写 Envoy 配置时,始终从 Listener 开始,依次定义 Filter Chain、Router 和 Cluster。使用 config_dump 端点(/config_dump)验证运行时配置是否与预期一致,这是 CIS 基准核验的重要步骤。