场景描述
业务流程
用户端使用企业微信小程序开发的H5应用,请求过程大致为:
- 用户终端---DMZ区域nginx服务器
- 后端Server服务---请求企业微信API获取token
- 企业微信API获取token数据----返回后端Server服务
- 后端Server服务返回数据到-DMZ区域nginx服务器
- 后续其他业务请求
其中,内网环境如下:
- 从公网到DMZ区域nginx服务器为联通和移动的双联路接入。
- 后端Server服务与DMZ区域nginx服务器均部署在公司内网,且DNS请求地址为内网的DNS服务器。
- 内网DNS转发的上级DNS地址为运营商提供,其中联通、移动各2个DNS地址。
- 内网DNS为2台windows server,为主、辅域的方式。
- 后端Server服务在访问公网时,防火墙上采用的是白名单方式,放行域名"qyapi.weixin.qq.com"与"*.qyapi.weixin.qq.com"
- DMZ区域nginx服务器与后端Server服务器操作系统问Centos7.5
问题描述
在用户通过企业微信打开应用时,页面进入有时快有时慢,慢的时候会出现超时情况。经过排查DMZ区域nginx服务日志,发现其在连接后端服务时,会有超时情况,同时http有499状态码。同时,用户的终端出现iOS终端快,安卓终端慢。以上情况均与下面的两个情况类似:
排查过程
根据上面的两种情况描述,也尝试了修改nginx配置,虽然用户访问有所改善,但相比内网使用还是慢很多。仔细分析过程,发现除了在调用企业微信api时服务器访问了公网,其余均是内网,怀疑时当问企业微信api存在问题。于是做了以下尝试:
- 在DNS服务器上ping 域名qyapi.weixin.qq.com,并用nslookup命令查询qyapi.weixin.qq.com.返回正常,未见异常
ping qyapi.weixin.qq.com
nslookup qyapi.weixin.qq.com
- 在nginx服务器与后端Server服务器上ping 域名qyapi.weixin.qq.com 发现从建立握手到发送第一个ping包之间大约为10s左右
ping qyapi.weixin.qq.com
- 怀疑时DNS解析问题,但尝试ping其他域名,返回正常。比如map.qq.com。于是使用dig和host命令排查解析问题,但返回结果均未发现异常
host -v qyapi.weixin.qq.com
dig -x qyapi.weixin.qq.com
- 于是抓包看DNS的流程使用。因为map.qq.com解析速度正常,所以分别抓两个域名的包,对比结果
先抓qyapi.weixin.qq.com的解析,一个窗口抓包,一个窗口使用ping命令测试。map.qq.com的域名同理
tcpdump -i ens192 port 53 -w /tmp/dns.qyapi.weixin.qq.com.144.2.0.cap
ping qyapi.weixin.qq.com
tcpdump -i ens192 port 53 -w /tmp/dns.map.qq.com.144.2.1.cap
ping map.qq.com
- 对比两个抓包结果,发现了问题。在CentOS上DNS解析时,会查询DNS服务器的反向解析区域的PTR记录,但通过DNS轮训,并到上级DNS中,没有找到qyapi.weixin.qq.com的PTR记录,但确有map.qq.com的PTR记录。如下图:
- 根据上面情况,在企业微信的开发者社区中发现了类似问题
- 因为是内网DNS服务器的上级是运营商DNS,于是找了台CentOS7.5服务器单独测试,将DNS服务器地址改为腾讯云的119.29.29.29,发现解析正常,能够找到PTR记录。到这里就不确定是我们上级运营商解析问题还是其他服务商问题。
解决办法
临时方法
既然是查询PTR记录超时,那么就在本地DNS中建立PTR记录。在本地DNS中,手工增加PTR记录,于是访问速度正常了。但同时有一个问题,企业微信官方API域名解析地址最近在调整,并且API文档中有这样的描述
后续解决方式
既然是IP是动态更新的,那么就要根据动态更新的IP,自动增加新的PTR记录,同时删除掉不存在的PTR记录及不存在反向解析区域Zone。
于是使用go编写一个动态更新程序,按时段定时获取最新的IP断,之后与当前DNS中的解析记录进行对比,删除已经不存在的Zone及PTR记录,同时增加新的Zone和PTR记录。在编写的时候使用了go-powershell组件,调用windows server中的Dnscmd命令,当然最新的方式是使用PowerShell Cmdlet来操作。
这样就可以保持本地DNS服务器中存在PTR记录,防止超时。
其他说明
在DNS解析时发现,windows服务器上不存在此问题,在CentOS上就有这个问题,可能是CentOS在做DNS解析时会进行反向解析,而Windows上不会
DNSCMD命令备注
- 添加PTR记录
>dnscmd [<servername>] /recordadd <zonename> <nodename> <rrtype> <rrdata>
Dnscmd /recordadd 164.128.116.in-addr.arpa 46 PTR qyapi.weixin.qq.com
- 添加Zone记录
> dnscmd [<servername>] /zoneadd <zonename> <zonetype> [/dp <FQDN> | {/domain | enterprise | legacy}]
Dnscmd /zoneadd 164.128.116.in-addr.arpa /dsprimary /dp /domain
- 删除zone
>dnscmd [<servername>] /zonedelete <zonename> [/dsdel] [/f]
dnscmd /ZoneDelete 183.3.224.in-addr.arpa /Dsdel /f
- 删除记录
dnscmd [<servername>] /recorddelete <zonename> <nodename> <rrtype> <rrdata> [/f]
dnscmd /recorddelete 117.97.180.in-addr.arpa 96 PTR 2234dx.sdf /f