我根据此链接设置我的名称服务器:https://www.digitalocean.com/community/tutorials/an-introduction-to-dns-terminology-components-and-concepts
通常名称服务器 resolv.conf 将包含2
其他可用的名称服务器 IP。但是,如果 resolv.conf 仅使用 127.0.0.1 作为服务器名,如下所示:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
#nameserver 172.31.0.2
#nameserver 127.0.0.53
search ec2.internal
然后在我的自定义名称服务器上,我在终端中输入以下命令:
telnet www.yahoo.com 80
Trying 98.139.180.149...
Connected to fd-fp3.wg1.b.yahoo.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.yahoo.com
我已经测试过,名称服务器运行良好。
因此,我有两个假设:
1:如果 resolv.conf 文件仅包含 127.0.0.1,则名称服务器将迭代查询“根”服务器,然后是 TLD 名称服务器等。
2:名称服务器,例如bind9,有root
服务器的记录,因此可以直接发送查询,无需额外查询。
如果我是正确的,名称服务器在哪里记录根服务器地址?
但是,如果我错了,这种情况的查询流程是什么?谢谢。
更新
使用 tcpdump 跟踪查询流程后,名称服务器首先查询根名称服务器。但为什么根服务器将所有其他根名称服务器返回给我?
k.root-servers.net.domain > ip-172-31-8-42.55523: Flags [P.], cksum 0x8784 (correct), seq 1:1100, ack 31, win 229, options [nop,nop,TS val 1581998147 ecr 403293], length 109964020*- q: NS? . 14/0/27 . NS b.root-servers.net., . NS g.root-servers.net., . NS i.root-servers.net., . NS c.root-servers.net., . NS e.root-servers.net., . NS f.root-servers.net., . NS d.root-servers.net., . NS l.root-servers.net., . NS k.root-servers.net., . NS a.root-servers.net., . NS j.root-servers.net., . NS h.root-servers.net., . NS m.root-servers.net., . RRSIG ar: a.root-servers.net. A 198.41.0.4, b.root-servers.net. A 192.228.79.201, c.root-servers.net. A 192.33.4.12, d.root-servers.net. A 199.7.91.13, e.root-servers.net. A 192.203.230.10, f.root-servers.net. A 192.5.5.241, g.root-servers.net. A 192.112.36.4, h.root-servers.net. A 198.97.190.53, i.root-servers.net. A 192.36.148.17, j.root-servers.net. A 192.58.128.30, k.root-servers.net. A 193.0.14.129, l.root-servers.net. A 199.7.83.42, m.root-servers.net. A 202.12.27.33, a.root-servers.net. AAAA 2001:503:ba3e::2:30, b.root-servers.net. AAAA 2001:500:84::b, c.root-servers.net. AAAA 2001:500:2::c, d.root-servers.net. AAAA 2001:500:2d::d, e.root-servers.net. AAAA 2001:500:a8::e, f.root-servers.net. AAAA 2001:500:2f::f, g.root-servers.net. AAAA 2001:500:12::d0d, h.root-servers.net. AAAA 2001:500:1::53, i.root-servers.net. AAAA 2001:7fe::53, j.root-servers.net. AAAA 2001:503:c27::2:30, k.root-servers.net. AAAA 2001:7fd::1, l.root-servers.net. AAAA 2001:500:9f::42, m.root-servers.net. AAAA 2001:dc3::35, . OPT UDPsize=4096 DO (1097)
如果名称服务器已经拥有所有根服务器的记录,则此步骤没有意义。
答案1
该文件/etc/resolv.conf
与您的名称服务器无关。它是解析器库的配置文件,告诉库在哪里可以找到名称服务器。在这种情况下,由于该文件仅包含一个nameserver
指向 的条目127.0.0.1
,因此本地主机上的某些软件组件充当名称服务器。在不了解您的配置的情况下,我无法判断它是bind9还是代理(例如dnsmasq,如上面dirkt所建议的)。
重点是该resolv.conf
文件不会影响名称服务器的功能,它不是名称服务器配置文件。
答案2
您可以实时调试 DNS 流/路径;安装并使用该dnstracer
命令,或者使用 的调试模式nslookup
,或者dig
在跟踪模式下。
有关如何使用这些命令,请参阅我对相关问题的回答如何找出解析特定主机名的名称服务器
答案3
尝试回答我自己的问题,希望有任何改进或更好的答案。不包括更新部分
我的两个假设都是对的。如果 resolv.conf 文件仅包含 127.0.0.1,名称服务器将直接询问root server
.
我使用bind9
名称服务器,所有根服务器信息都存储在/etc/bind/db.root
.因此,名称服务器只需获取它并随机使用其中之一。
然后您可以用来tcpdump
记录查询流程。
tcpdump -w tcpdump.out & telnet www.google.com 80 tcpdump -t -r tcpdump.out
您还可以使用tcpdump -vv
查看更多详细信息。
答案4
当递归名称服务器启动时,例如位于127.0.0.1
您服务器上的名称服务器,它会执行“根启动”:它以文件中的某个根服务器 IP 地址(在安装软件时随软件分发)启动并请求NS .
(您可以在 tcpdump 输出中看到)以获取根服务器的所有当前名称和 IP 地址(v4 和 v6)(因为其本地文件可能包含陈旧信息,根服务器 IP 地址很少更改,但偶尔会更改)。
所以这一步并不是没有意义的,它是一种软自动更新。