1、DNS解析失败
1.1 报connection timed out; no servers could be reached错误
root@15b099c121e2:/# nslookup time.geekbang.org
;; connection timed out; no servers could be reached
1.2 对网络进行排查,或者是使用 nslookup -debug www.baidu.com。结果发现网络是征程连接的,但是访问baidu这个网址取通过本机环回口取访问的,所以导致连接失败。
root@15b099c121e2:/# ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114): 56 data bytes
64 bytes from 114.114.114.114: icmp_seq=0 ttl=127 time=29.275 ms
64 bytes from 114.114.114.114: icmp_seq=1 ttl=127 time=27.183 ms
^C--- 114.114.114.114 ping statistics
root@15b099c121e2:/# nslookup -debug www.baidu.com
;; Connection to 127.0.0.1#53(127.0.0.1) for www.baidu.com failed: connection refused.
;; Connection to ::1#53(::1) for www.baidu.com failed: address not available.
1.3 查看Dns配置文件,发现内容为空。所以我们需要配置DNS服务
/# cat /etc/resolv.conf
root@15b099c121e2:/# echo "nameserver 114.114.114.114 " > /etc/resolv.conf
root@15b099c121e2:/# nslookup www.baidu.com
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 14.215.177.39
Name: www.a.shifen.com
Address: 14.215.177.38
2、DNS解析不稳定
2.1 用time nslookup mp.csdn.net为例,来查看时延,可以看到real这一栏的时延有15S之久
harbo@harbo-virtual-machine:~$ time nslookup mp.csdn.net
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
Name: mp.csdn.net
Address: 101.201.178.55
real 0m15.099s
user 0m0.000s
sys 0m0.013s
2.2 如果多测试一下,会出现哪些现象呢,可能也会出现解析失败的现象
/# time nslookup mp.csdn.net
;; connection timed out; no servers could be reached
real 0m15.011s
user 0m0.006s
sys 0m0.006s
2.3 对于上述出现的结果,可能会出现多种原因:
2.3.1 DNS服务器本身有问题,响应慢并且不稳定
2.3.2 客户端到DNS服务器的网络延迟比较大
2.3.3 DNS请求或者响应包,在某些情况下请求包被丢弃
2.4 根据不同的延时,我们可以更换不同的DNS,使用ping命令进行观测
arbo@harbo-virtual-machine:~$ ping mp.csdn.net
PING mp.csdn.net (101.201.178.55) 56(84) bytes of data.
64 bytes from 101.201.178.55 (101.201.178.55): icmp_seq=1 ttl=128 time=38.4 ms
64 bytes from 101.201.178.55 (101.201.178.55): icmp_seq=2 ttl=128 time=34.5 ms
2.5 针对DNS解析时间过长的问题,可以为目标进行DNS缓存,使用dnsmasq
#该命令是在容器上执行
/# /etc/init.d/dnsmasq start
* Starting DNS forwarder and DHCP server dnsmasq [ OK ]
2.6 修改/etc/resolv.conf,将DNS服务器改为DNSmasq的监听地址,本次用的是本机地址 114.114.114.114,然后多次执行nslookup命令
root@a7e78e494a4d:/# time nslookup mp.csdn.net
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
Name: mp.csdn.net
Address: 101.201.178.55
real 0m0.115s
user 0m0.011s
sys 0m0.026s
2.7 可以看到执行多次以后,DNS解析都比较快。
2、DNS优化解决方法
2.1 对DNS解析结果进行缓存,但是要注意,缓存过期以后,需要重新获取新纪录,有经验的小伙伴可以写一个脚本,定期进行获取新记录。
2.2 对DNS解析的结果进行预取,这是浏览器等 Web 应用中最常用的方法,也就是说,不等用户点击页面上的超链接,浏览器就会在后台自动解析域名,并把结果缓存起来。
2.3 使用HTTPDNS取代常规的DNS解析,特别是如今域名劫持普遍存在,使用 HTTP 协议绕过链路中的 DNS 服务器,就可以避免域名劫持的问题
2.4 基于 DNS 的全局负载均衡(GSLB)。这不仅为服务提供了负载均衡和高可用的功能,还可以根据用户的位置,返回距离最近的 IP 地址。
本文整理自极客时间 倪朋飞:《Linux性能优化实战》