DNS 是互联网的繁荣下隐藏在幕后的中坚力量, DNS 解析的逻辑控制为互联网公司容灾切流、流量调拨管控提供了有力抓手, 因此十分有必要学习并理解 DNS 的解析原理; 本文主要梳理 DNS 解析的逻辑及原理;
常规解析
dns 常规解析逻辑可以总结为递归与迭代的过程:
首先找本机 host (linux: /etc/hosts) 文件中是否有记录, 如果有直接返回;
查找本机的 dns 的配置文件 (linux: /etc/resolv.conf), 找到 local dns, 本机向 local dns 发起查询请求; 说明: /etc/nsswitch.conf 文件的以下这行决定了先查找 /etc/hosts, 再查找 /etc/reslv.conf; hosts: files dns myhostname 其中 files 表示查询 /etc/hosts, dns 表示查询 /etc/resolv.conf;
local dns 如果有缓存解析记录, 直接返回给发起请求的主机; 如果没有, local dns 会向根服务器发起请求;
根服务器收到请求后,会返回顶级服务器 (比如 .com、.net) 给 local dns;
local dns 会去请求顶级服务器,顶级服务器收到请求后,会返回权威服务器
local dns 回去请求权威服务器,权威服务器收到请求后,会返回域名解析记录给local dns
local dns 收到权威服务器返回的记录后,local dns 会返回记录给发起请求主机,同时把该域名解析结果缓存起来用于主机的再次查询
# 向根服务器请求 ; <<>> DiG 9.10.6 <<>> google.com +trace ;; global options: +cmd . 515601 IN NS m.root-servers.net. . 515601 IN NS a.root-servers.net. . 515601 IN NS i.root-servers.net. . 515601 IN NS k.root-servers.net. . 515601 IN NS c.root-servers.net. . 515601 IN NS b.root-servers.net. . 515601 IN NS d.root-servers.net. . 515601 IN NS e.root-servers.net. . 515601 IN NS h.root-servers.net. . 515601 IN NS g.root-servers.net. . 515601 IN NS f.root-servers.net. . 515601 IN NS l.root-servers.net. . 515601 IN NS j.root-servers.net. m.root-servers.net. 801 IN A 202.12.27.33 ;; Received 544 bytes from 30.30.30.30#53(30.30.30.30) in 36 ms
# 向顶级服务器请求 com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 86400 IN DS 19718 13 2 8ACBB0CD28F41250A80A491389424D341522D946B0DA0C0291F2D3D7 71D7805A com. 86400 IN RRSIG DS 8 1 86400 20241205050000 20241122040000 61050 . EcNiR9Y8rUqLlgyi9/UH5Ib/nVwi+uysjvx5uR2EYjqW+a0XjqaorvUA /Ija0QMpeSp2w30RXNt49m22dtCh1dhJnRtBba/NDY01ks3i1lO/TUXZ 4EDKsG4IY43INCGMq91U9zU7FANlgKeu6BvBVnllmxpzVXhjYi4Z3KwL ALQgESap3Zbo8FvqgY0YzLJoK9DqN7SnW1RKkJWiLKrvEliXhuwTWv5X 8VA6Id1j9zUkgFCUPLrgx9P/4tp1GRnmg0GhsZt8b6Q4D8tIBMbfof9L 8DTyRtIS5ZV+kLQXDcAMi+Dc64aSwwdB9tbyv8mhtKD8HxoUm/ke9l7m Edh07g== ;; Received 1170 bytes from 192.33.4.12#53(c.root-servers.net) in 172 ms
# 向权威服务器请求 google.com. 60 IN A 8.7.198.46 ;; Received 54 bytes from 2001:503:83eb::30#53(c.gtld-servers.net) in 13 ms
分线路解析
dns 可以根据请求的源 IP 所在地的不同, 解析返回不同的结果:
dns 解析线路
精确定位用户 IP
dns 服务器是根据用户的 local dns 来定位用户的, 因为 local dns 请求权威服务器时, 会带上源 IP (即 local dns 本身的 IP); 当中国用户自己配置了国外的 dns 后, 这时就被误认为国外用户; 有一种技术 EDNS, 可以把用户的 IP 地址带给权威服务器, 用户去请求 local dns 时把用户 IP 带给 local dns, local dns 请求权威服务器时再把用户 IP 带给权威服务器, 这样权威服务器就获得了用户的真实 IP, 就可以准确定位用户, 实施分线路解析的能力; 如果要支持 EDNS, 需要 local dns 和权威服务器都支持EDNS才可以;