DNS是一个用来把名称解析为IP地址的协议,它是标准TCP/IP协议簇的一部分,是几个能提供名称解析功能的协议中的一个,其他的协议包括NIS和LDAP。
DNS与这些协议的不同之处在于它只做名称解析这一件事,NIS和LDAP还能做其他解析操作,例如对网络用户和组账户的解析。
DNS也是名称解析的行业标准,被因特网上绝大多数系统所采用。
DNS客户端配置非常简单,如linux只需要在本地名为/etc/resolv.conf的文件里指定要使用的DNS服务器的地址即可:
[root@worker-03 ~]#cat/etc/resolv.conf
nameserver 172.16.21.2
ICANN
全世界域名的最高管理机构,是一个叫做 ICANN (Internet Corporation for Assigned Names and Numbers)的组织。它的总部在美国加州。
它原来是美国商务部下面的一个非盈利机构。2016年,美国政府宣布,ICANN 不再隶属于商务部,成为一个自我管理的独立机构。
ICANN 负责管理全世界域名系统的运作。它的一项主要工作,就是规定顶级域名(top level domain,简写为 TLD)。
顶级域名有1000多个,ICANN 自己不会去管理这些顶级域名,每个顶级域名下面都有许多批发商。
ICANN 的政策是,每个顶级域名都找一个托管商,该域名的所有事项都由托管商负责。ICANN 只与托管商联系,这样管理起来就容易多了。举例来说,.cn域名的托管商就是中国互联网络信息中心(CNNIC),它决定了.cn域名的各种政策。
目前,世界最大的顶级域名托管商是美国的 Verisign 公司。
根域名及根服务器
由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.naquan.com被写成www.naquan.com.,即最后还会多出一个点。这个点就是根域名。
DNS 域名解析服务采用了类似目录树的层次结构来记录域名与 IP 地址之间的对应关系,从而形成了一个分布式的数据库系统
理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。ICANN 维护着一张列表,里面记载着顶级域名和对应的托管商。
比如,要访问www.naquan.com,就必须先询问 ICANN 的根域名列表,它会告诉我.com域名由 Verisign 托管,必须去找 Verisign,它会告诉我example.com服务器在哪里。
DNS 根域名服务器
保存 DNS 根区文件的服务器,就叫做 DNS 根域名服务器(root name server)。
由于早期的 DNS 查询结果是一个512字节的 UDP 数据包。这个包最多可以容纳13个服务器的地址,因此就规定全世界有13个根域名服务器,编号从a.root-servers.net一直到m.root-servers.net。分布在世界各地,其管理单位、具体的地理位置,以及 IP 地址如表
名称 管理单位 地理位置 IP 地址
A INTERNIC.NET 美国弗吉尼亚州 198.41.0.4
B 美国信息科学研究所 美国加利福尼亚州 128.9.0.107
C PSINet 公司 美国弗吉尼亚州 192.33.4.12
D 马里兰大学 美国马里兰州 128.8.10.90
E 美国航空航天管理局 美国加利福尼亚州 192.203.230.10
F 因特网软件联盟 美国加利福尼亚州 192.5.5.241
G 美国国防部网络信息中心 美国弗吉尼亚州 192.112.36.4
H 美国陆军研究所 美国马里兰州 128.63.2.53
I Autonomica 公司 瑞典斯德哥尔摩 192.36.148.17
J VeriSign 公司 美国弗吉尼亚州 192.58.128.30
K RIPE NCC 英国伦敦 193.0.14.129
L IANA 美国弗吉尼亚州 199.7.83.42
M WIDE Project 日本东京 202.12.27.33
注:DNS服务器会保存根服务器的信息,Bind系统默认保存在/var/named/named.ca
[root@worker-03 ~]# cat /var/named/named.ca
; <<>> DiG 9.11.3-RedHat-9.11.3-3.fc27 <<>> +bufsize=1200 +norec @a.root-servers.net
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46900
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 518400 IN NS a.root-servers.net.
. 518400 IN NS b.root-servers.net.
. 518400 IN NS c.root-servers.net.
. 518400 IN NS d.root-servers.net.
. 518400 IN NS e.root-servers.net.
. 518400 IN NS f.root-servers.net.
. 518400 IN NS g.root-servers.net.
. 518400 IN NS h.root-servers.net.
. 518400 IN NS i.root-servers.net.
. 518400 IN NS j.root-servers.net.
. 518400 IN NS k.root-servers.net.
. 518400 IN NS l.root-servers.net.
. 518400 IN NS m.root-servers.net.
;; ADDITIONAL SECTION:
a.root-servers.net. 518400 IN A 198.41.0.4
b.root-servers.net. 518400 IN A 199.9.14.201
c.root-servers.net. 518400 IN A 192.33.4.12
d.root-servers.net. 518400 IN A 199.7.91.13
e.root-servers.net. 518400 IN A 192.203.230.10
f.root-servers.net. 518400 IN A 192.5.5.241
g.root-servers.net. 518400 IN A 192.112.36.4
h.root-servers.net. 518400 IN A 198.97.190.53
i.root-servers.net. 518400 IN A 192.36.148.17
j.root-servers.net. 518400 IN A 192.58.128.30
k.root-servers.net. 518400 IN A 193.0.14.129
l.root-servers.net. 518400 IN A 199.7.83.42
m.root-servers.net. 518400 IN A 202.12.27.33
a.root-servers.net. 518400 IN AAAA 2001:503:ba3e::2:30
b.root-servers.net. 518400 IN AAAA 2001:500:200::b
c.root-servers.net. 518400 IN AAAA 2001:500:2::c
d.root-servers.net. 518400 IN AAAA 2001:500:2d::d
e.root-servers.net. 518400 IN AAAA 2001:500:a8::e
f.root-servers.net. 518400 IN AAAA 2001:500:2f::f
g.root-servers.net. 518400 IN AAAA 2001:500:12::d0d
h.root-servers.net. 518400 IN AAAA 2001:500:1::53
i.root-servers.net. 518400 IN AAAA 2001:7fe::53
j.root-servers.net. 518400 IN AAAA 2001:503:c27::2:30
k.root-servers.net. 518400 IN AAAA 2001:7fd::1
l.root-servers.net. 518400 IN AAAA 2001:500:9f::42
m.root-servers.net. 518400 IN AAAA 2001:dc3::35
;; Query time: 24 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Apr 05 15:57:34 CEST 2018
;; MSG SIZE rcvd: 811
美国军方控制的:
U.S. DOD Network Information Center(G根)
U.S. Army Research Lab(H根)
企业控制的:
Verisign (A根、J根)
Cogent Communications(C根)
Netnod(I根)
高校控制的:
USC(B根)
University of Maryland(D根)
政府组织控制的:
NASA Ames Research Center(E根)
其他组织控制的:
Internet Systems Consortium, Inc.(F根)
RIPE NCC(G根)
ICANN(L根)
日本WIDE组织(K根)
这13台根域名服务器由12个组织独立运营。其中,Verisign 公司管理两台根域名服务器:A 和 J。每家公司为了保证根域名服务器的可用性,会部署多个节点,比如单单 Verisign 一家公司就部署了104台根域名服务器(2016年1月数据)。
所以,根域名服务器其实不止13台。据统计,截止2021年12月,全世界共有 1478 台根域名服务器。可以在 http://root-servers.org 这个网站查到所有根域名服务器的信息。
DNS根区
根域名列表的正式名称是 DNS 根区(DNS root zone),ICANN 官网可以查看这个根区文件。
该文件保存所有顶级域名的托管信息,所以非常大,超过2MB。
举例来说,顶级域名.com可以查到13个域名服务器。
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
DNS查询
DNS 域名解析服务采用分布式的数据结构来存放海量的“区域数据”信息,在执行用户发起的域名查询请求时,具有递归查询和迭代查询两种方式。
递归查询,是指 DNS 服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果 DNS 服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。
迭代查询,DNS 服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台 DNS 服务器的地址,用户再向这台 DNS 服务器提交请求,这样依次反复,直到返回查询结果
在一般情况下,当用户向配置指定的 DNS 服务器发起对某个域名的查询请求(这里以www.cisco.com为例),其查询流程大致如图
Bind
BIND 9
现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早由伯克利大学的一名学生编写,现在最新的版本是9,有ISC(Internet Systems Consortium)编写和维护。BIND支持先今绝大多数的操作系统(Linux,UNIX,Mac,Windows),BIND服务的名称称之named。DNS默认使用UDP、TCP协议,使用端口为53(domain),953(mdc,远程控制使用)。
Bind-chroot
BIND服务器通常从因特网可直接访问。只要有一个通过因特网可以直接访问的系统,安全就成了一个大问题。这些安全问题包括有人破坏了服务器上的数据(有时称为数据投毒)和黑客控制了暴露的服务器进程,允许被劫持的服务器未经授权访问其他系统文件。
named进程在处理传人的DN查询时与网连接起交互。任何时候,只要一个进程是通过网络可访问的,那么这个进程就有可能受到动击。在这种攻击中,远程系统上的用户控制本地服务器上的进程。一旦这个用户有了提制权,他们就可以访问本地系统,包括查看或修改文件。
当被劫持的进程是以非root身份运行时,虽然危害是有限的。但是,像/etc/passwd这样
的系统核心文件。系统上的每个用户,包括named用户,都能查看/etc/passwd文件的内容,因为每个用户都有这个文件的读取权限。
chroot jail的目的是限制对系统文件的访问。named进程被放入jail,在那里它只能看到和BIND相关的配置。这是通过将BIND的配置文件放到特定的子目录中并启动named进程实现,这样文件系统的根看起来就是前面提到的子目录(chroot代表 change root,就好像是更改这个进程的文件系统根路径)。
bind-chroot本质上是使用chroot方式给bind软件换了个“根”,这“根”在/var/named/chroot下,把yum安装的bind-chroot在/etc下的产生的配置文件硬链接到/var/named/chroot/etc下。配置起来就跟BIND9没什么区别。