一.hosts

由于IP地址不便记忆,所以产生了域名(一种主机识别码的东西,为每台主机赋予唯一主机名),为此需要有hostName -> IP的机制,主机利用一个hosts的数据库文件来实现。

hosts文件是一个用于储存计算机网络中各节点信息的计算机文件。这个文件负责将主机名称映射到相应的IP地址。hosts文件通常用于补充或替换网络中DNS的功能。和DNS不同的是,计算机的用户可以直接对hosts文件进行控制。

hosts文件作用:

1.主机名到IP地址的映射

2.重定向, 如将server_a 重定向到其他IP。

3.减少对DNS服务器的访问来加快访问速度并减少带宽消耗。

对于重定向,有很好的作用,如:

将网易163.com 重定向到一个其他IP地址,比如重定向到一个另一个网站, 可以这样做:

# sudo vim /etc/hosts
123.53.214.30 163.com

如果想屏蔽一个网站,如百度,可以这样做, 该网站的域名映射到错误的IP或自己计算机的IP:

127.0.0.1 屏蔽的网站
0.0.0.0 屏蔽的网站

如下是屏蔽前后的效果:

$ curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>

# 屏蔽后
$ curl baidu.com                        
curl: (7) Failed to connect to baidu.com port 80: Connection refused

如果你想加速一个网站的访问,跳过DNS解析的部分,因为有些国外的网站DNS解析太慢,更改hosts文件可减少解析,直接访问。比如加速github的访问:

185.31.17.185 github.global.ssl.fastly.net

还比如最新可用的google hosts文件

如果对一些数据库服务器,访问时输入IP地址不能访问的,只能输入服务器名才能访问。那么我们配置好Hosts文件,这样输入服务器名就能顺利连接了。

二.DNS

2.1 dns

光hosts肯定不行,它只是个本地补充而已,需要一个大的系统来管理主机名和IP地址映射关系,这就是DNS. 如下解析流程:

域名分类如下:

每一层都有域名服务器,如通过域名查找一个网站过程

DNS如同互联网中的分布式数据库,主机名->IP只是其中的一部分,主机名->IP 的对应信息叫A记录,IP->主机名 的信息叫PTR, 上层或下层域名服务器IP地址的映射信息叫NS记录; 邮件地址与邮件服务器主机名的映射信息叫MX记录.

2.2 域名解析

2.2.1 A记录

IP指向,对于泛域名解析即将该域名所有未指定的子域名都指向一个空间。在“主机名”中填入*,类型为A.

2.2.2 CNAME

别名指向, 为一个主机设置别名, 比如用github page 来写博客,那么在CNAME文件中写你的域名,如beginman.cn, 然后取解析。那么就问 rhatyang.github.io 设定了一个叫 fanzhiyang.cn的别名,也就是绑定了自己的域名。注意,CNAME的目标主机地址只能使用主机名,不能使用IP地址;主机名前不能有任何其他前缀,如:http://等是不被允许的;A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。

2.2.3 NS记录

解析服务器记录。用来表明由哪台服务器对该域名进行解析。这里的NS记录只对子域名生效。

如用户希望由IP为xx.xx.xx.xxx或域名为ns.mydomain.com这台服务器来解析xx.mydomain.com,则需要设置xx.mydomain.com的NS记录。NS记录优先于A记录。

三、Linux DNS处理

Linux有两个相关命令,nslookupdig, ns也就是name servers缩写, 对域名解析检查方法:

$ nslookup -q=a www.youdomain.com

如果返回的记录只有一个IP且是当前使用的主机IP,则解析正常。如果返回的记录有多个IP地址,则解析有问题,需要修改解析。

如解析zhihu域名

$ nslookup www.zhihu.com
Server:        223.5.5.5          # DNS服务器的主机名
Address:    223.5.5.5#53           # DNS服务器IP地址

Non-authoritative answer:       # 非权威服务器的应答
www.zhihu.com    canonical name = eclipse.zhihu.com.   # cname = eclipse.zhihu.com. 别名

Name:    eclipse.zhihu.com         # 解析的URL
Address: 115.159.241.25         # 解析出来的IP

Name:    eclipse.zhihu.com
Address: 115.159.241.95

要了解上面的这些输出,就要搞清楚DNS的整个解析过程, 参考DNS解析过程详解:

1.现在我有一台计算机,通过ISP接入了互联网,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。

2.现在的我计算机要向这台ISPDNS发起请求查询www.zhihu.com这个域名了,(这里准确来说不是ISPDNS,而应该是用户自己电脑网络设置里的DNS,并不一定是ISPDNS。比如也有可能你手工设置了8.8.8.8)

3.ISPDNS拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为非权威服务器的应答。

4.如果缓存中没有的话,ISPDNS会从配置文件里面读取13个根域名服务器的地址(这些地址是不变的,直接在BIND的配置文件中)

5.然后像其中一台发起请求。

6.根服务器拿到这个请求后,知道他是com.这个顶级域名下的,所以就会返回com域中的NS记录,一般来说是13台主机名和IP。

7.然后ISPDNS向其中一台再次发起请求,com域的服务器发现你这请求是zhihu.com这个域的,我一查发现了这个域的NS,那我就返回给你,你再去查

8.ISPDNS不厌其烦的再次向zhihu.com这个域的权威服务器发起请求,zhihu.com收到之后,查了下有www的这台主机,就把这个IP返回给你了

9.然后ISPDNS拿到了之后,将其返回给了客户端,并且把这个保存在高速缓存中。

第一步ISP接入互联网分配的DNS服务器是动态的,在/etc/resolv.conf文件里,具体可参考DNS域名解析的配置文件/etc/resolv.conf

$ cat /etc/resolv.conf
#
# Mac OS X Notice
#
# This file is not used by the host name and address resolution
# or the DNS query routing mechanisms used by most processes on
# this Mac OS X system.
#
# This file is automatically generated.
#
nameserver 223.5.5.5
nameserver 119.29.29.29
nameserver 8.8.8.8
nameserver 114.114.114.114

dig工具来跟踪一下:

$ dig +trace www.zhihu.com

# 第一步是向我这台机器的ISPDNS获取到根(`.`)域服务区的13个IP和主机名[b-j].root-servers.NET.
; <<>> DiG 9.8.3-P1 <<>> +trace www.zhihu.com
;; global options: +cmd
.            143034    IN    NS    m.root-servers.net.
.            143034    IN    NS    a.root-servers.net.
.            143034    IN    NS    g.root-servers.net.
.            143034    IN    NS    d.root-servers.net.
.            143034    IN    NS    c.root-servers.net.
.            143034    IN    NS    k.root-servers.net.
.            143034    IN    NS    h.root-servers.net.
.            143034    IN    NS    j.root-servers.net.
.            143034    IN    NS    i.root-servers.net.
.            143034    IN    NS    f.root-servers.net.
.            143034    IN    NS    e.root-servers.net.
.            143034    IN    NS    l.root-servers.net.
.            143034    IN    NS    b.root-servers.net.
;; Received 525 bytes from 223.5.5.5#53(223.5.5.5) in 196 ms

# 第二步是向其中的一台根域服务器(Servername就是末行小括号里面的)发送www.zhihu.com的查询请求,返回了`com.`顶级域的服务器IP(未显示)和名称

com.            172800    IN    NS    d.gtld-servers.net.
com.            172800    IN    NS    k.gtld-servers.net.
com.            172800    IN    NS    g.gtld-servers.net.
com.            172800    IN    NS    c.gtld-servers.net.
com.            172800    IN    NS    e.gtld-servers.net.
com.            172800    IN    NS    m.gtld-servers.net.
com.            172800    IN    NS    h.gtld-servers.net.
com.            172800    IN    NS    i.gtld-servers.net.
com.            172800    IN    NS    a.gtld-servers.net.
com.            172800    IN    NS    b.gtld-servers.net.
com.            172800    IN    NS    f.gtld-servers.net.
com.            172800    IN    NS    l.gtld-servers.net.
com.            172800    IN    NS    j.gtld-servers.net.
;; Received 491 bytes from 192.203.230.10#53(192.203.230.10) in 672 ms

# 第三步,便向`com.`域的一台服务器192.203.230.10请求,www.zhihu.com,他返回了`zhihu.com`域的服务器IP(未显示)和名称,知乎有2台顶级域的服务器

zhihu.com.        172800    IN    NS    ns3.dnsv4.com.
zhihu.com.        172800    IN    NS    ns4.dnsv4.com.
;; Received 393 bytes from 192.43.172.30#53(192.43.172.30) in 240 ms

# 第四步,向知乎的顶级域服务器(192.43.172.30)请求www.zhihu.com,他发现这个www有个别名,而不是一台主机,别名是eclipse.zhihu.com
www.zhihu.com.        120    IN    CNAME    eclipse.zhihu.com.
eclipse.zhihu.com.    600    IN    A    115.159.241.95
eclipse.zhihu.com.    600    IN    A    115.159.241.25
zhihu.com.        86400    IN    NS    ns4.dnsv4.com.
zhihu.com.        86400    IN    NS    ns3.dnsv4.com.
;; Received 148 bytes from 183.232.90.141#53(183.232.90.141) in 60 ms
$ dig +trace www.zhihu.com

# 第一步是向我这台机器的ISPDNS获取到根(`.`)域服务区的13个IP和主机名[b-j].root-servers.NET.
; <<>> DiG 9.8.3-P1 <<>> +trace www.zhihu.com
;; global options: +cmd
.            143034    IN    NS    m.root-servers.net.
.            143034    IN    NS    a.root-servers.net.
.            143034    IN    NS    g.root-servers.net.
.            143034    IN    NS    d.root-servers.net.
.            143034    IN    NS    c.root-servers.net.
.            143034    IN    NS    k.root-servers.net.
.            143034    IN    NS    h.root-servers.net.
.            143034    IN    NS    j.root-servers.net.
.            143034    IN    NS    i.root-servers.net.
.            143034    IN    NS    f.root-servers.net.
.            143034    IN    NS    e.root-servers.net.
.            143034    IN    NS    l.root-servers.net.
.            143034    IN    NS    b.root-servers.net.
;; Received 525 bytes from 223.5.5.5#53(223.5.5.5) in 196 ms

# 第二步是向其中的一台根域服务器(Servername就是末行小括号里面的)发送www.zhihu.com的查询请求,返回了`com.`顶级域的服务器IP(未显示)和名称

com.            172800    IN    NS    d.gtld-servers.net.
com.            172800    IN    NS    k.gtld-servers.net.
com.            172800    IN    NS    g.gtld-servers.net.
com.            172800    IN    NS    c.gtld-servers.net.
com.            172800    IN    NS    e.gtld-servers.net.
com.            172800    IN    NS    m.gtld-servers.net.
com.            172800    IN    NS    h.gtld-servers.net.
com.            172800    IN    NS    i.gtld-servers.net.
com.            172800    IN    NS    a.gtld-servers.net.
com.            172800    IN    NS    b.gtld-servers.net.
com.            172800    IN    NS    f.gtld-servers.net.
com.            172800    IN    NS    l.gtld-servers.net.
com.            172800    IN    NS    j.gtld-servers.net.
;; Received 491 bytes from 192.203.230.10#53(192.203.230.10) in 672 ms

# 第三步,便向`com.`域的一台服务器192.203.230.10请求,www.zhihu.com,他返回了`zhihu.com`域的服务器IP(未显示)和名称,知乎有2台顶级域的服务器

zhihu.com.        172800    IN    NS    ns3.dnsv4.com.
zhihu.com.        172800    IN    NS    ns4.dnsv4.com.
;; Received 393 bytes from 192.43.172.30#53(192.43.172.30) in 240 ms

# 第四步,向知乎的顶级域服务器(192.43.172.30)请求www.zhihu.com,他发现这个www有个别名,而不是一台主机,别名是eclipse.zhihu.com
www.zhihu.com.        120    IN    CNAME    eclipse.zhihu.com.
eclipse.zhihu.com.    600    IN    A    115.159.241.95
eclipse.zhihu.com.    600    IN    A    115.159.241.25
zhihu.com.        86400    IN    NS    ns4.dnsv4.com.
zhihu.com.        86400    IN    NS    ns3.dnsv4.com.
;; Received 148 bytes from 183.232.90.141#53(183.232.90.141) in 60 ms

参考

(完)