跨境DNS解析失败问题解决

6cb8447a1f5bce605f9b94a3d1e66528.gif

新钛云服已累计为您分享748篇技术干货

41080db7ba18bdcf3dcd27c24a36c783.gif

问题

33175464dd3780ded3f37e48ef496e1a.gif

公司使⽤的是阿⾥云基础设施,DNS解析使⽤的是境外的Akamai作为域名的DNS解析服务商。

当前有部分应⽤需要被第三⽅应⽤调⽤,同时也有主动调⽤第三⽅应⽤的需求。最近突发了很多调⽤失败问题。

应⽤调⽤失败:

156dd9a81065eda60b811b8dd9a553f0.png

Gitlab拉取失败:

3c1078580166ab3d599574be1f605757.png

故障排查

8324a3e78f82331fdd74f3f66d92a197.gif

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命令等待报错出现

0920f2900bd12a40ca5be705cce4f05e.png


37fd89b4e1bb2c2c465b49e68250b86c.png


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.通过云⼚商服务端检查发现问题原因

38ff853937e60fae15330458d9561223.png

原因如下:

a. ⾸先阿⾥云的DNS服务没有缓存

b. 当⽤户或应⽤发起域名解析后

c. 如果阿⾥云DNS服务器⾥有请求过的地址且TTL时间未过期的话就直接返回结果

d. 否则阿⾥云DNS服务器将去境外Akamai去请求解析记录,但由于从国内到境外的⽹络

波动会导致部分请求失败

临时解决方案

e08ffeea7459b8ecd7b615639010d8a5.gif

在⻓期解决⽅案未落地前我们使⽤了2个临时解决⽅案。

1. 如果是A记录的通过临时绑定Hosts解决

2. 如果是CNAME记录或其它的则使⽤阿⾥云的Private Zone临时内⽹DNS解析服务解决

长期解决方案

92feca4ea167c24daebb6859064974a7.gif

为了能⻓期解决这个问题,我们还是准备把域名解析服务放到阿⾥云的云解析上。保证国内访问没有问题。同时应⽤也要做两个变更:

1. 要设置调⽤失败的重试机制,⽐如失败后重试3次每次间隔3秒

2. 要设置重试后任然失败的补偿机制,这个需要业务负责⼈去制定具体的补偿规则

    推荐阅读   

28e2a0d1df33f6c07737b9b90c1ee5a4.png

763d3dc6768a34c57bce5591ecf2ebdf.png

    推荐视频    

猜你喜欢

转载自blog.csdn.net/NewTyun/article/details/130878156