八股23- DNS查询过程,肯定有你不知道但又耳目一新的环节
原创 发哥 Linux运维实战派 2024年09月03日 11:54 陕西
阅读提示:
- 部分过程是很少出现在其他文章中的,更偏向于生产真实的过程,而非理论
- 过程中引出的部分知识点也在后边做了解析,有兴趣的,推荐完整阅读
- 文末有福利哦
本地缓存查询
1、客户端程序在需要访问域名的时候,调用域名查询,如果应用程序本身维护了域名缓存,会先从本地缓存中查找,如果有缓存,并且TTL还没有到期,则会直接返回缓存记录,如果没有缓存则会继续后续的查询
2、查询本地的hosts文件,在linux服务器上,会根据nssswitch.conf
配置的hosts 解析顺序,默认的顺序是 file dns,也就是先读 /etc/hosts ,然后再进行dns解析,windows在C:\Windows\System32\drivers\etc\hosts
定义,在文件中如果查询到域名的记录绑定,则会直接返回,应用程序也会对应更新自己的缓存
DNS查询过程
3、浏览器如果配置了DOH,会走doh的http请求进行dns记录查询,其他客户端应用程序如果也配置了doh(httpdns)的解析链路,一般都会优先doh或者httpdns解析
Linux服务器上发起DNS查询的时候,会检查是否存在nscd缓存,如果有缓存,会从缓存中查询域名缓存,如果有缓存会直接返回
4、走默认的DNS协议查询域名记录,会通过读取本地网络配置,Linux配置在/etc/resolv.conf
中,window配置TCP/IP网络配置中;
从中获取配置的localdns的IP地址,并向localdns发送dns查询请求
LocalDNS处理过程
5、LocalDNS接收到DNS查询请求之后,会先查自己的缓存,如果有,直接返回;
如果缓存没有,会接着判断域是否由本地直接进行权威管理(即,域名记录的数据库是在本地)则直接查询记录,对请求做权威回答
如果域在本地管理,但配置了请求转发,则会将dns查询转发到其他localdns服务器上,并等待回复,获取其他localdns的查询记录后返回给客户端,并缓存
如果以上情况都不匹配,则会判断当前dns服务器是否开启递归查询,只有开启之后localdns才会继续向根服务器发起查询请求,否则会直接返回失败
Localdns迭代查询
6、localdns会向根服务器发送查询请求,请求www.163.com
的IP记录
7、根服务器是不会直接存储域名解析记录的,它只会存储顶级域及对应的地址,所以根服务器会回复“.com”的dns地址,告诉localdns,应该到.com
那里问一下,这个域是它负责管理的
8、localdns会缓存根服务器回复的.com
的地址,下次就会直接去.com
查询;localdns继续发送dns查询到.com
服务器,询问www.163.com
的记录,.com
的dns服务器同样并不直接维护域名记录,会返回163.com
的权威dns服务器的地址
9、localdns会缓存下163.com
的权威服务器地址,下一次会直接去这里查询;localdns则继续向163.com
的权威服务器查询 www 主机记录,163.com
的权威服务器会发现,这就是我自己维护的域,所以会查询自己的域名地址库,如果查询到,就会直接返回IP地址,如果未查询到,则会返回错误
10、localdns会将最终的结果缓存下来,下次相同的记录查询过来,会直接从缓存回复。
关于DOH/HTTPDNS
DOH(dns over https)与httpdns叫法不同,但本质上原理是一致的,就是通过http协议来查询域名记录。可以避免使用dns协议查询记录时面临的域名劫持、缓存污染、dns解析调度不准确的问题。
httpdns的工作流程
httpdns实际上就是客户端原本使用DNS协议从Localdns解析域名IP的过程修改为客户端直接访问HTTPDNS的http(s)接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。获取到IP后就直接往此IP发送业务协议请求
关于localdns的转发
在生产环境下,会一些场景是需要用到转发的
- • LocalDNS处于一些网络受限的环境,没有办法访问公网
- • 减少服务器资源消耗,LocalDNS因为需要去公网上,一跳一跳的进行dns记录查询,这个过程是比较消耗资源的,有一些企业不愿意自己承担这部分的资源消耗,就可以直接把解析请求转发到其他DNS服务器做解析,自己只做记录缓存
- • 优化DNS解析性能,比如下图中的nebulaedu.net,如果这个域是我自己管理的域名,那显然是将nebulaedu.net的解析请求直接转发给权威DNS解析速度更快【非自己管理的权威DNS建议不要这样做哦,并且权威DNS一般不接受递归查询,如果有CNAME记录,则不要使用,且权威DNS都是有比较严格的限速设置的】
关于nscd缓存
NSCD(name service cache daemon)是GLIBC中网络库的一个组件,基本上来讲我们能见到的一些编程语言和开发框架最终均会调用到glibc的网络解析的函数(如gethostbyname or gethostbyaddr等),因此绝大部分程序能够使用NSCD提供的缓存服务。当然如果是应用端自己用socker编写了一个网络client,就无法使用NSCD提供的缓存服务,比如DNS领域常见的dig命令不会使用NSCD提供的缓存,相反ping得到的DNS解析结果将使用NSCD提供的缓存。
nscd是在glibc的解析过程中直接嵌入的逻辑,只要linux客户端主机上启动了进程,并开启了hosts的缓存,那向localdns发起请求前,就会先过nscd缓存。
nscd不止可以缓存dns记录,还可以缓存用户,密码等信息。
写在最后
客官,看到这里了,给个关注再走呗。
运维相关岗位面试时涉及到的知识面非常广,所以复习起来会有无从下手的感觉。为了让同学们面试不迷茫,我们整理了运维面试的高频面试题。
面试库带答案,涉及Linux系统,高并发集群解决方案,Linux网络,K8S云原生等等
关注 我,回复 面试题 免费领取。
祝愿每一位读者都可以面试成功,进入大厂。
#24秋招求职节奏总结##实习,投递多份简历没人回复怎么办##我的求职思考##23届找工作求助阵地##运维工程师#