时间:2023-02-03 01:28:01 | 来源:建站知识
时间:2023-02-03 01:28:01 来源:建站知识
但是为什么末尾的点是有用且重要的呢?
dig example.com
查询 example.com
的 IP,你会看到一下内容:$ dig example.comexample.com. 5678 IN A 93.184.216.34
执行完 dig
命令后,example.com
有一个 .
——变成了 example.com.
!发生了什么?.
:如果你在使用 miekg/dns 时传给它 example.com
,它会报错:// trying to send this message will return an errorm := new(dns.Msg)m.SetQuestion("example.com", dns.TypeA)
最初我以为我知道这个问题的答案(“呃,末尾的点意味着域名是完全限定的?”)。这是对的 —— 一个完全限定域名(fully qualified domain name)(FQDN)是一个末尾有 .
的域名!.
,所以我们把它放进去,以匹配你的计算机实际发送/接收的内容”。但事实并不是这样!example.com
被编码为这 13 个字节。7example3com0
编码后的内容一个点也没有。一个 ASCII 域名(如 example.com
)被转成了各种 DNS 软件的 DNS 请求/响应中使用的格式。nsd
或 bind
)来为该区域文件中指定的 DNS 记录提供服务。example.com
的示例区域文件:orange 300 IN A 1.2.3.4fruit 300 IN CNAME orangegrape 3000 IN CNAME example.com.
在这个文件中,任何不以 .
结尾的域名(比如 orange
)后都会自动加上 .example.com
。所以 orange
成了 orange.example.com
的简称。DNS 服务器从它的配置中得知这是一个 example.com
的区域文件,所以它知道在所有不以点结尾的名字后面自动添加 example.com
。orange.example.com. 300 IN A 1.2.3.4 fruit.example.com. 300 IN CNAME orange.example.com. grape.example.com. 3000 IN CNAME example.com.
确实多了很多字符。dig
命令的输出:$ dig example.com; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> +all example.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10712;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 65494;; QUESTION SECTION:;example.com. IN A;; ANSWER SECTION:example.com. 81239 IN A 93.184.216.34
有一件奇怪的事是,几乎每一行都以 ;;
开头,这是怎么回事?;
是区域文件中的注释字符!dig
以这种奇怪的方式输出的原因可能是为了方便你粘贴这些内容到区域文件时,不用修改就可以直接用。example.com
末尾有个 .
的原因 —— 区域文件要求域名末尾必须有点(否则它们会被解释为是相对于该区域的)。因此 dig
也这么处理了。+human
选项,以更人性化的方式打印出这些信息,但现在我太懒了,懒得花工夫去实际贡献代码来做这件事(而且我并不擅长 C),所以我只能在我的博客上抱怨一下 :smiley:.
的例子:curl
!grapefruit
,其上运行着 Web 服务器。当我执行 curl grapefruit
时,会输出:$ curl grapefruit<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head>......
这样运行没问题!但是如果我在域名后加一个 .
会怎样呢?它报错了:$ curl grapefruit.curl: (6) Could not resolve host: grapefruit.
发生了什么?为了搞清楚,我们需要先来学习下搜索域:curl grapefrult
时,它是怎么被转成一个 DNS 请求的?你可能会认为我的计算机会向域名 grapefruit
发送一个请求,对吗?但事实并不是这样。tcpdump
来看看到底是什么域名在被查询。$ sudo tcpdump -i any port 53[...] A? grapefruit.lan. (32)
实际上是向 grapefruit.lan.
发送的请求。为什么呢?curl
调用函数 getaddrinfo
来查询 grapefruit
getaddrinfo
查询了我计算机上的文件 /etc/resolv.conf
/etc/resolv.conf
包含两行内容:nameserver 127.0.0.53 search lansearch lan
这行内容,所以 getaddrinfo
在 grapefruit
的末尾添加了一个 lan
,去查询 grapefruit.lan
lan
)被加到最后。但是什么时候会发生这种情况呢?.
,那么这时不会用到搜索域.
(如 example.com
),那么默认也不会用到搜索域。但是可以通过修改配置来改变处理逻辑(在 ndots 里有更详细的说明)curl grapefruit.
与 curl grapefruit
结果不一样的原因——因为一个查询的是 grapefruit.
,而另一个查询的是 grapefruit.lan.
。lan
—— 它也是通过这个方式给我的计算机分配 IP。example.com
的区域文件中,grapefruit
会被转为 grapefruit.example.com
lan
),grapefruit
被转为 grapefruit.lan
.
,以此来表示 “这是域名,末尾不需要添加任何东西,这就是全部内容”。否则会引起混乱。google.com.
是一个完全限定域名,而 google.com
不是。google.com
而不是 google.com.something.else
! 我为什么要指其他东西?那太傻了!”.
很有用,可以让人确切的知道,不应该再添加其他东西。jvns.ca
使用的 DNS 服务器让我在域名的末尾加上 .
(例如在 CNAME 记录中),并提示如果我不添加,它将在我输入的内容末尾加上 .jvns.ca
。我不同意这个设计决定,但这不是什么大问题,我只是在最后加一个 .
。.
不能正常运行。例如,如果我在浏览器中输入 https://twitter.com.
,它就会报错。它会返回 404。Host
标头设置为 Host:twitter.com.
,而对端的 Web 服务器则期望 Host:twitter.com
。https://jvns.ca.
由于某种原因,返回了一个 SSL 错误。grapefruit
来指代我家的另一台计算机 grapefruit.lan
)在过去更常用,因为 DNS 是在大学或其他有大型内部网络的大机构中开发的。example.com
)似乎更为普遍。关键词:中国,末尾