0%

阿里云WAF + Kubernetes Ingress 架构下无法拿到客户端真实IP的问题处理

运维经验分享

背景:

2019年04月19日晚21:10分进行网络维护,内容如下:

​ 将域名CNAME到阿里云的Web防火墙(以下简称为WAF),业务请求经防火墙解析到Kubernetes 的 Ingress 的负载均衡(SLB)地址

故障现象:

​ 后端应用通过获取请求中的X-Forwarded-For字段,拿到的IP地址为WAF回源地址,非客户端真实IP。

排查记录:
  1. 21:15 查看Ingress日志,发现Ingress拿到的IP就是WAF回源地址,为错误IP,确定非前端nodejs代码bug。

  2. 21:33 联系阿里云技术团队一起排查问题。

  3. 22:20 确认Ingress的模板文件中 the_real_ip 变量是拿的 remote_addr 字段,等待阿里技术联系Ingree研发同学,给出回复。

  4. 23:23 Ingree研发同学联系上后确认Ingress没问题,可能是WAF没传真实IP到Ingress。

  5. 23:50 在Ingress容器和前端nodejs所在宿主机tcpdump工具抓包后分析得出:

    (1)、WAF已经将真实客户端地址放到了 x-Forwarded-For 的字段中传给了ECS
    (2)、ECS(容器的ingress)将真实的客户端IP,放到了x-Original-Forwarded-For;而将WAF的回源地址放到了 x-Forwarded-For

  6. 4月20日 00:29 将compute-full-forwarded-for配置到Ingress的ConfigMap中,问题解决。

操作:
1
kubectl -n kube-system edit cm nginx-configuration
1
2
3
4
在data标签下添加如下:
compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"
结论:

阿里云容器服务Kubernetes集群的Ingress默认ConfigMap中未配置 compute-full-forwarded-for参数,导致将ingress拿到的WAF回源IP替换为XFF,而非附加到XFF中。

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#compute-full-forwarded-for

反思:
  1. 预览环境和线上环境架构不一致:

    此次故障中,预览环境未使用WAF防护,直接解析到K8S集群,未提前发现此次问题,已修正,以后尽量维持环境统一,避免此类问题出现。

  2. 故障点定位速度慢:

    网络请求问题优先抓包分析,提升故障定位速度,后续夯实基础知识,提升问题排查能力。

  3. Kubernetes专业知识掌握程度较低

    目前仅仅在使用层面上能力ok,但是其实现原理、组件实现方式等知识点薄弱,后续还需在K8S学习中多总结,多学习,争取减少故障,提升运维能力。