网络连通性检查-dns

Posted by 周思进 on August 15, 2021

访问一个网络服务,传输层一定是通过 IP+端口 来确定所要访问的服务,但对于人而言,如果访问一个服务还需要记住其 IP 地址,是有点困难的。比如访问百度搜索网站,输入 www.baidu.com 肯定比输入 180.101.49.12 这样来的简单。

当然域名地址最长也可以设置到255个字节,这显然不能说域名比 IP 地址就好记了,域名也有其他好处,如 IP 可能经常变换,但域名是固定不变的。

将域名地址转换成 IP 地址这一工作就需要通过 DNS 服务来完成了,这也是我们网络配置有设置 DNS 地址的原因。

比如你浏览器访问百度网站,将从url栏地址输入 www.baidu.com 开始,到敲回车跳转到对应网站的这个过程,用 wireshark 工具抓包下来,然后过滤 dns 就可以查看到如下 dns 解析报文了。

image

可以注意到系统向 dns 服务器地址的 53 端口进行查询,然后得到了应答。通过报文可以查看到 www.baidu.com 所查询的记录类型是 CNAME,该类型表示查询的域名是另一个域名的别名,会内部跳转查询另一个域名地址,这里就是 www.baidu.com 是 www.a.shifen.com 的一个别名。

这样的好处是,如 www.a.shifen.com 所对应的服务器除了提供搜索服务,还提供其他服务,那肯定还需要提供别的域名地址,如果服务器地址发生变化,只需要修改 www.a.shifen.com 这个域名的 IP 地址记录就行了。

然后查询到 www.a.shifen.com 的 DNS 记录类型是 A,也就是最终所想要的 IP 地址了,可以看到这里返回了2个 IP 地址,180.101.49.11 和 180.101.49.12;在浏览器中直接输入其中任何一个 IP 地址,都可以跳转到对应的百度搜索页面。

DNS 记录类型除了前面提到的 A、CNAME,还有 PTR(逆向查询)、MX(邮件记录)、NS(域名服务器记录)。


所以如果存在域名访问失败的情况,也可以检查下 DNS 地址是否正确配置了。设置的 DNS 地址会写入到 /etc/resolv.conf 文件,可以通过查看该文件内容确认地址是否设置正确。

需要注意,在系统运行过程中,需改 DNS 地址后,想立即生效需要立即执行 res_init 函数。而另一个需要注意的点是,res_init 函数是针对当前进程生效的。其他进程想生效,也需要调用 res_init 接口。

在进行网络连接时,会通过 getaddrinfo 接口来完成域名解析操作。


dns 查询常用命令有 dig、nslookup、host 等。