场景描述

业务流程

用户端使用企业微信小程序开发的H5应用,请求过程大致为:

  1. 用户终端---DMZ区域nginx服务器
  2. 后端Server服务---请求企业微信API获取token
  3. 企业微信API获取token数据----返回后端Server服务
  4. 后端Server服务返回数据到-DMZ区域nginx服务器
  5. 后续其他业务请求

其中,内网环境如下:

  1. 从公网到DMZ区域nginx服务器为联通和移动的双联路接入。
  2. 后端Server服务与DMZ区域nginx服务器均部署在公司内网,且DNS请求地址为内网的DNS服务器。
  3. 内网DNS转发的上级DNS地址为运营商提供,其中联通、移动各2个DNS地址。
  4. 内网DNS为2台windows server,为主、辅域的方式。
  5. 后端Server服务在访问公网时,防火墙上采用的是白名单方式,放行域名"qyapi.weixin.qq.com"与"*.qyapi.weixin.qq.com"
  6. DMZ区域nginx服务器与后端Server服务器操作系统问Centos7.5

问题描述

在用户通过企业微信打开应用时,页面进入有时快有时慢,慢的时候会出现超时情况。经过排查DMZ区域nginx服务日志,发现其在连接后端服务时,会有超时情况,同时http有499状态码。同时,用户的终端出现iOS终端快,安卓终端慢。以上情况均与下面的两个情况类似:

  1. https://www.meiwen.com.cn/subject/kskuvttx.html

    2.https://www.cnblogs.com/Anker/p/7078497.html

排查过程

根据上面的两种情况描述,也尝试了修改nginx配置,虽然用户访问有所改善,但相比内网使用还是慢很多。仔细分析过程,发现除了在调用企业微信api时服务器访问了公网,其余均是内网,怀疑时当问企业微信api存在问题。于是做了以下尝试:

  1. 在DNS服务器上ping 域名qyapi.weixin.qq.com,并用nslookup命令查询qyapi.weixin.qq.com.返回正常,未见异常
ping qyapi.weixin.qq.com
nslookup qyapi.weixin.qq.com
  1. 在nginx服务器与后端Server服务器上ping 域名qyapi.weixin.qq.com 发现从建立握手到发送第一个ping包之间大约为10s左右
ping qyapi.weixin.qq.com
  1. 怀疑时DNS解析问题,但尝试ping其他域名,返回正常。比如map.qq.com。于是使用dig和host命令排查解析问题,但返回结果均未发现异常
host -v qyapi.weixin.qq.com
dig -x qyapi.weixin.qq.com
  1. 于是抓包看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
  1. 对比两个抓包结果,发现了问题。在CentOS上DNS解析时,会查询DNS服务器的反向解析区域的PTR记录,但通过DNS轮训,并到上级DNS中,没有找到qyapi.weixin.qq.com的PTR记录,但确有map.qq.com的PTR记录。如下图:

  2. 根据上面情况,在企业微信的开发者社区中发现了类似问题
  3. 因为是内网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命令备注

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
posted on 2022-03-30 14:31  学业未成  阅读(1176)  评论(0编辑  收藏  举报