DNS反向解析失敗導致的網絡連接超時問題


場景描述

業務流程

用戶端使用企業微信小程序開發的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM