天天看點

跨境DNS解析失敗問題解決

作者:新钛雲服

問題

公司使⽤的是阿⾥雲基礎設施,DNS解析使⽤的是境外的Akamai作為域名的DNS解析服務商。

目前有部分應⽤需要被第三⽅應⽤調⽤,同時也有主動調⽤第三⽅應⽤的需求。最近突發了很多調⽤失敗問題。

應⽤調⽤失敗:

跨境DNS解析失敗問題解決

Gitlab

拉取失敗:

跨境DNS解析失敗問題解決

故障排查

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指令等待報錯出現

跨境DNS解析失敗問題解決
跨境DNS解析失敗問題解決

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.通過雲⼚商服務端檢查發現問題原因

跨境DNS解析失敗問題解決

原因如下:

a. ⾸先阿⾥雲的DNS服務沒有緩存

b. 當⽤戶或應⽤發起域名解析後

c. 如果阿⾥雲DNS伺服器⾥有請求過的位址且TTL時間未過期的話就直接傳回結果

d. 否則阿⾥雲DNS伺服器将去境外Akamai去請求解析記錄,但由于從國内到境外的⽹絡

波動會導緻部分請求失敗

臨時解決方案

在⻓期解決⽅案未落地前我們使⽤了2個臨時解決⽅案。

1. 如果是A記錄的通過臨時綁定Hosts解決

2. 如果是CNAME記錄或其它的則使⽤阿⾥雲的Private Zone臨時内⽹DNS解析服務解決

長期解決方案

為了能⻓期解決這個問題,我們還是準備把域名解析服務放到阿⾥雲的雲解析上。保證國内通路沒有問題。同時應⽤也要做兩個變更:

1. 要設定調⽤失敗的重試機制,⽐如失敗後重試3次每次間隔3秒

2. 要設定重試後任然失敗的補償機制,這個需要業務負責⼈去制定具體的補償規則

繼續閱讀