場景描述
業務流程
用戶端使用企業微信小程序開發的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