2. Envoy 架构解析:监听器、集群、路由、过滤器链、热重启机制
Envoy 的架构设计围绕四个核心抽象展开:Listener(监听器)、Cluster(集群)、Route(路由)和Filter Chain(过滤器链)。理解这些组件及其交互关系,是配置安全策略和进行运行基线核验的基础。此外,热重启(Hot Restart)机制保证了配置更新与进程升级过程中的零流量中断。
2.1 核心架构总览
Envoy 采用主从线程模型:一个主线程负责配置管理与统计刷新,多个工作线程(Worker)各自持有独立的 Event Loop 处理网络 I/O。每个工作线程内部,Listener 接收连接,Filter Chain 处理数据,Router 决定目标 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 等内核参数 |
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 | 执行自定义过滤器动作 | 触发审计日志或额外验证 |
2.5 过滤器链(Filter Chain)
过滤器链是 Envoy 安全策略的核心执行点。Envoy 支持L4 网络过滤器和L7 HTTP 过滤器,两者可以混合使用。过滤器按配置顺序依次执行,形成管道(Pipeline)。
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 |
config_dump 端点(/config_dump)验证运行时配置是否与预期一致,这是 CIS 基准核验的重要步骤。