4. 入口边界设计:流量接入点、API网关策略、协议过滤与白名单
入口边界是Agent服务的第一道防线,负责在流量进入内部集群之前进行识别、清洗和准入控制。本章聚焦于如何定义流量接入点、配置API网关策略、实施协议过滤与白名单机制,从而构建拒绝服务场景下的可信入口。
4.1 边界定义与系统分层
入口边界位于用户端/外部Agent与内部Agent服务之间,其作用可分解为四个层次:
- 物理/网络层:确定流量接入点(如弹性公网IP、CDN、Anycast),配置DDoS基础防护。
- API网关层:统一处理认证、限流、路由、协议转换。
- 协议过滤层:基于协议规范(HTTP/gRPC/WebSocket)进行报文格式校验,拒绝畸形请求。
- 白名单层:基于调用方身份、请求来源IP、请求路径、Agent版本等属性建立动态/静态白名单。
设计原则:每一层都应具备独立失效能力。即使API网关被压垮,协议过滤层仍可丢弃非合规流量;白名单机制可作为最后一道准入屏障,确保只有已注册的调用方才能进入核心逻辑。
4.2 组件职责与信任链路
| 组件 | 核心职责 | 信任假设 |
|---|---|---|
| CDN / 高性能负载均衡 | 吸收四层DDoS攻击,隐藏真实源IP,提供SSL卸载 | 不可信,仅做流量分发 |
| API Gateway (如Kong / Envoy / APISIX) | 认证、限流、协议转换、请求路由;执行全局策略 | 半可信,策略下发需签名校验 |
| 协议过滤器(Sidecar / 独立Filter) | 检查HTTP header大小、gRPC message长度、WebSocket帧结构 | 可信,运行在受控环境 |
| 白名单服务(Redis + 策略引擎) | 维护动态白名单、身份指纹、版本白名单 | 强可信,需高可用部署 |
信任链路:流量从互联网进入后,在每一层都经过一次信任提升。CDN判定为“基本可信流量”;API网关判定为“已认证流量”;协议过滤器判定为“合规流量”;白名单服务判定为“授权流量”。拒绝服务攻击的目标就是绕过或耗尽这些信任检查点。
4.3 数据流与控制流
数据流(正常请求)
- 外部Agent → CDN / ELB → API Gateway → 协议过滤器 → 白名单决策 → 后端Agent服务。
- API Gateway在路由时注入原始请求指纹(X-Request-ID, X-Forwarded-For)。
- 协议过滤器对请求体进行格式校验,拒绝不合规报文。
- 白名单服务检查调用方身份是否在允许列表内。
控制流(策略下发)
- 管理平面(Control Plane)将网关策略、协议规则、白名单列表发布到配置中心(如etcd / Nacos)。
- API Gateway监听配置变更,热加载限流和路由规则。
- 协议过滤器通过Kubernetes ConfigMap或XDS协议接收校验Schema。
- 白名单服务通过订阅分布式缓存更新动态加入/移出白名单。
4.4 API网关策略配置要点
以下是一个简化但高可用的YAML配置片段,展示了限流、协议校验和白名单的结合。
# gateway-policy.yaml
apiVersion: gateway.konghq.com/v1
kind: KongIngress
metadata:
name: agent-entry-policy
spec:
route:
methods: ["POST", "GET"]
protocols: ["http", "https"]
strip_path: false
plugins:
- name: rate-limiting
config:
minute: 1000 # 每分钟最多1000请求
policy: local # 单节点限流(配合集群使用Redis模式)
- name: request-validator
config:
allowed_content_types: # 协议过滤白名单
- "application/json"
- "application/grpc"
max_body_size: 4194304 # 4MB 请求体上限
- name: ip-restriction
config:
allow:
- "10.0.0.0/8"
- "172.16.0.0/12"
deny: []
注意:以上配置仅为单网关实例示例。在生产环境中,务必启用分布式限流(如Redis限流计数器),防止因局部限流不均导致入口对冲。同时,IP白名单不可被用来替代认证,仅作为辅助手段。
4.5 协议过滤与白名单设计
协议过滤规则
| 协议 | 过滤维度 | 推荐阈值 |
|---|---|---|
| HTTP/1.1 | Header数量、URI长度、HTTP方法白名单 | Header ≤ 64个, URI ≤ 8KB, 仅允许 GET/POST/PUT |
| gRPC | Protobuf message大小、序列化格式、gRPC-status校验 | 单message ≤ 4MB, 仅支持UTF-8与JSON自定义options |
| WebSocket | 帧类型白名单、Payload大小、连接周期 | 仅文本/二进制帧, Payload ≤ 64KB, 连接≤30分钟 |
白名单分类
- 静态白名单:预配置的Agent服务调用方API Key、可信IP段。
- 动态白名单:基于健康探测结果自动加入(如gRPC health check通过的服务端IP)。
- 版本白名单:只允许特定Agent SDK版本(v1.1.0及以上)的请求进入。
最佳实践:将白名单策略拆分为两部分——部署时生效的静态规则(写入ConfigMap)和运行时调整的动态规则(写入Redis)。动态白名单必须设置TTL(默认300秒),防止僵尸节点长期留在白名单内。
4.6 选型权衡
| 选型方面 | 优势 | 劣势 |
|---|---|---|
| Envoy Proxy | 高性能L4/L7代理,原生支持gRPC和WebSocket | 配置复杂度高,依赖XDS控制面 |
| Kong Gateway | 插件生态丰富,易于扩展协议过滤和白名单插件 | 自带限流插件在高并发下性能损耗约5-10% |
| 云原生网关(如ALB+API GW) | 免运维,无缝集成WAF和DDoS防护 | 灵活的协议过滤能力受限,白名单策略需配合HTTPS自定义头 |
4.7 入口边界安全控制链(SVG结构图)
4.8 风险点
- 集中式网关单点过载:网关层成为瓶颈,一旦被压垮,所有流量都会中断。解决方案:多活部署 + 客户端侧限流。
- 白名单过期与僵尸节点:动态白名单未设置TTL或TTL过长,导致已下线的Agent仍在白名单内,被攻击者利用。建议TTL不超过5分钟,并引入周期性的身份重验证。
- 协议过滤绕过:攻击者通过HTTP分块传输、gRPC metadata溢出等方式绕过过滤器。必须同时检查多个协议层的边界值。
- 策略配置割裂:API网关、协议过滤器、白名单服务各自的策略不一致,导致流量被错误放行或拒绝。建议将所有策略存储在统一配置中心进行原子化发布。
4.9 落地步骤
- 确定流量接入点:根据部署环境选择公网IP、CDN或云原生接入点,启用基础DDoS清洗。
- 部署API网关:选择Envoy或Kong,配置路由、限流与认证插件;启用Prometheus指标暴露。
- 嵌入协议过滤器:在网关注入点后或Sidecar中配置请求大小、格式、方法白名单;编写压测脚本验证过滤效果。
- 搭建白名单服务:使用Redis + 策略引擎存储白名单;对接Agent注册中心动态同步。
- 端到端验证:构造正常、畸形、超限、伪造身份请求,确认每一层均正确拦截。
- 灰度上线与告警:先启用1%流量的完整入口策略,观察5分钟,设置异常告警后全量切换。
4.10 验收标准
| 验收项 | 预期结果 | 验证方式 |
|---|---|---|
| 限流失效保护 | 突发达到2000 req/s时,超过阈值的请求返回429 | 使用wrk / Locust进行阶梯压测 |
| 畸形报文过滤 | 恶意请求(超大Header、非法字符)在协议过滤器层被拒绝 | 发送定制化畸形请求包,检查日志 |
| 白名单准入 | 未注册API Key请求返回403,已注册请求正常通过 | 使用两种凭证分别发送请求 |
| 高可用故障切换 | 单网关或白名单Redis节点宕机不影响整体1分钟内的服务可用性 | Chaos Engineering注入故障,观察SLO |
总结:本章将入口边界设计从抽象概念落地为可执行策略——流量接入点确定攻击面,API网关执行第一道限流与认证,协议过滤器排除畸形请求,白名单决策完成最终准入。四层机制协同工作,任何一个环节失效都不会导致整体防线崩溃。这是Agent拒绝服务场景下“防御纵深”理念的具体体现。