如何解決跨境DNS解析失敗問題?
問題
公司使?的是阿?云基礎設施,DNS解析使?的是境外的Akamai作為域名的DNS解析服務商。
當前有部分應?需要被第三?應?調?,同時也有主動調?第三?應?的需求。最近突發了很多調?失敗問題。
應?調?失?。?/p>
Gitlab拉取失?。?/p>
故障排查
1. 在ECS上進?循環抓包并修改resolv.conf配置
抓包命令:tcpdump -i any -s 0 port 53 and host 【域名】 -C 100 -W 50 -w
/tmp/dns.pcap
參數說明:
-i:指定要過濾的?卡接?,如果要查看所有?卡,可以-i any
-s: tcpdump 默認只會截取前96字節的內容,要想截取所有的報?內容,可以使?-s
number,number就是你要截取的報?字節數,如果是 0 的話,表示截取報?全部內容
-C:file-size,tcpdump 在把原始數據包直接保存到?件中之前, 檢查此?件??是否超過file-size。如果超過了, 將關閉此?件,另創?個?件繼續?于原始數據包的記錄,新創建的?件名與-w 選項指定的?件名?致,但?件名后多了?個數字。該數字會從1開始隨著新創建?件的增多?增加。file-size的單位是百萬字節(nt: 這?指1,000,000個字節,并?1,048,576個字節,后者是以1024字節為1k,1024k字節為1M計算所得,即1M=1024 *1024 = 1,048,576)。這?是100M
-W參數:與-C參數?起使?時,可以達到循環寫??件的作?。這?是抓50個?件
-w ?件路徑和?件名 ?于指定保存?件的路徑和名稱,沒有指定路徑默認在系統默認路徑下;
標準默認resolv.conf標準配置:
options timeout:2 attempts:3 rotate single-request-reopen
#這條配置使得在解析域名時在所有的nameserver中進? 隨機 的選擇。
nameserver 100.100.x.xxx
nameserver 100.100.x.xxx
2. 頻繁執?git pull命令等待報錯出現
3. 確認DNS的出?IP地址
多次執?命令:dig whoami.ds.akahelp.net txt +short
"ns" "106.xx.xxx.8"
"ns" "106.xx.xxx.8"
"ns" "106.xx.xxx.7"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.7"
"ns" "106.xx.xxx.1"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.8"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.6"
"ns" "106.xx.xxx.7"
4.通過云?商服務端檢查發現問題原因
原因如下:
a. ?先阿?云的DNS服務沒有緩存
b. 當?戶或應?發起域名解析后
c. 如果阿?云DNS服務器?有請求過的地址且TTL時間未過期的話就直接返回結果
d. 否則阿?云DNS服務器將去境外Akamai去請求解析記錄,但由于從國內到境外的?絡
波動會導致部分請求失敗
臨時解決方案
在?期解決?案未落地前我們使?了2個臨時解決?案。
1. 如果是A記錄的通過臨時綁定Hosts解決
2. 如果是CNAME記錄或其它的則使?阿?云的Private Zone臨時內?DNS解析服務解決
長期解決方案
為了能?期解決這個問題,我們還是準備把域名解析服務放到阿?云的云解析上。保證國內訪問沒有問題。同時應?也要做兩個變更:
1. 要設置調?失敗的重試機制,?如失敗后重試3次每次間隔3秒
2. 要設置重試后任然失敗的補償機制,這個需要業務負責?去制定具體的補償規則