记一次dcdn加apisix的sni报错。

使用了阿里云的dcdn后,对接源站的apisix出现了http_ssl_phase error。通过分析后得出相关结论, 算是一个踩坑记录

post thumb
Kubernetes
作者 Louis 发表于 2021年6月9日

[TOC]

背景

由于生产环境需要添加dcdn和waf等相关加速和防护措施, 因此在对接apisix的出现了这个问题。

apisix具体是啥,这里不赘述了, 可以查看apisix官网

一般网站的架构。

-> slb -> 网关

升级后的架构。

## 场景1
-> dcdn -> slb -> 网关

## 场景2
-> dcdn -> waf -> slb -> 网关

复现问题

场景1, 如果没有添加sni回源, 这个时候apisix会直接在tls握手报错。

场景2, 即使dcnd添加了sni回源, apisix也会直接在tls握手报错.

抓包分析。

我们这边使用tcpdump进行抓包。因为是在k8s集群中运行的, 需要到相应的节点运行

首先, 查找对应pod的节点。

$ kubectl get pods  -n infras-tx -o wide | grep apisix
apisix-79d5b785f6-frbvk                           1/1     Running   0          145m   172.16.104.174   cn-hangzhou.i-bp1j5jrkodvty73nb57d   <none>           <none>kubectl get pods  -n infras-tx -o wide | grep apisix

其次, 找到对应的节点, 找到对应的容器的id, 根据id来找pid。

$  docker inspect -f {{.State.Pid}}  `docker ps|grep apisix| awk '{print $1}'`
2691530

然后使用 nsenter 进入网络抓包, 如果没有,需要安装nsenter工具. 在使用tcmdump抓包即可。抓包的时候, 需要配置访问一下, 然后分析一下抓包文件即可。

$ yum -y install util-linux.x86_64 
$ nsenter --target 2691530
$ tcpdump -i eth0 -s 0 -w /var/tmp/1.cap 

因为我们这边很明确, 就是tls握手有问题, 我们只需要对抓包文件的tls握手分析即可。

tcp stream 图, 从steam图中可以清晰看到

tls.handshake 图

在握手阶段出现失败. 添加完sni后, 握手成功。

很奇怪的是, 阿里云自己的slb对接的dcdn就不需要使用sni校验。

上一篇
记一次kubernetes使用hostnetwork网络相关问题及解决。