一、DNS
1、域名系统概述
域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。
域名到IP地址的解析过程的要点如下:
当某一个应用需要把主机名解析为IP地址时,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序获得目的主机的IP地址后即可进行通信。
几个名词:
FQDN:full qualified domain name,完全控制域名,它包含了域和主机名,如:www.baidu.com是一个FQDN
IP:ip地址,包括IPv4、IPv6
Resolve:解析,转换
域名解析的过程其实就是:FQDN <-----> IP ,这两者间的转换过程
2、域名的结构
在互联网初期,由于主机较少,解决DNS的办法就是在本机创建一个hosts文件,里面记录了IP----FQDN的记录,但是随着互联网的快速发展,显然这种方法已经行不通
因此,早在1983年因特网开始采用层次树状结构的命名方法,并使用分布式的域名系统DNS。并采用客户服务器方式。DNS使大多数名字都在本地解析(resolve),仅有少量解析需要在因特网上通信,因此DNS系统的效率很高。由于DNS是分布式系统,即使单个计算机除了故障,也不会妨碍整个DNS系统的正常运行。
几个名词:
根域(root domain):由于采用树状的分布式结构,显然根域值得是一个结构开始的节点,这里的根域用“.”表示,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输入时会省略后面的点,而这也已经成为了习惯。根域全球有13台,这些主机的内容都保持一致性。
顶级域(top level domain):根域下来就是顶级域或者叫一级域,有两种划分方式,一种互联网刚兴起时的按照行业性质划分的com.,net.等,一种是按国家划分的如cn.,jp.,等。
二级域:这个比较好理解,比如,baidu.com,baidu就是一个二级域名
3、域名服务器
上面已经介绍,域名解析的过程其实就是FQDN和IP之间的转换,而这些转换关系就是一个数据库,由于互联网的蓬勃发展,需要使用一些专门的服务器来存储这些数据,当用户来访问请求解析时,可以查找自身的数据库,并把相关的信息反馈。
一个服务器所负责管辖(或有权限)的范围叫做区(zone)。
各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。
每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。
总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。
区是DNS服务器实际管辖的范围。区 <= 域。
根域名服务器:
最高层次的域名服务器,也是最重要的域名服务器。
所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。
权限域名服务器:负责一个“区”的域名服务器。
本地域名服务器:本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
4、域名解析过程
前面已经介绍,域名解析其实就是FQDN和IP之间的转换
几个名词:
递归查询:
如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。
因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
迭代查询:
当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。
根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
因此,一个主机查询的过程分为两个部分,主机到本地DNS服务器之间是递归查询,本地服务器向根和相关服务器查询是迭代查询
正向解析:FQDN-->IP,这个比较好理解,通过主机名获取其对应的广域网IP地址
反向解析:IP-->FQDN,反向解析一般用于邮件服务器,IP反向解析主要应用到邮件服务器中来阻拦垃圾邮件,特别是在国外。多数垃圾邮件发送者使用动态分配或者没有注册域名的IP地址来发送垃圾邮件,以逃避追踪,使用了域名反向解析后,就可以大大降低垃圾邮件的数量。
比如你用 [email protected] 这个邮箱给我的邮箱 [email protected] [email protected]的信头文件,这封信的信头文件会显示这封信是由哪个IP地址发出来的。然后根据这个IP地址进行反向解析,如果反向解析到这个IP所对应的域名是name.com 那么就接受这封邮件,如果反向解析发现这个IP没有对应到name.com,那么就拒绝这封邮件。
为了完成逆向域名解析,系统提供一个特别域,该特别域称为逆向解析域in-addr.arpa。这样欲解析的IP地址就会被表达成一种像域名一样的可显示串形式,后缀以逆向解析域域名"in-addr.arpa"结尾。
例如一个IP地址:222.211.233.244,其逆向域名表达方式为:244.233.221.222.in-addr.arpa
5、域名服务器的资源记录
这里常用资源记录的类型有这几种:记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX
SOA(start of authority)
起始授权机构,此记录指定区域的起点。它所包含的信息有区域名、区域管理员电子邮件地址,以及指示辅 DNS 服务器如何更新区域数据文件的设置等。
A(address):是用来指定主机名(或域名)对应的IP地址记录。也就是 FQDN---IP
NS(name server):此记录指定负责给定区域的名称服务器。
DNS服务器NS记录地址一般以以下的形式出现: ns1.domain.com、ns2.domain.com等。
简单的说,NS记录是指定由哪个DNS服务器解析你的域名。
MX(mail exchange):记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。例如,当Internet上的某用户要发一封信给 [email protected] 时,该用户的邮件系统通过DNS查找mydomain.com这个域名的MX记录,如果MX记录存在, 用户计算机就将邮件发送到MX记录所指定的邮件服务器上。
CNAME(Canonical Name):
别名记录,允许您将多个名字映射到同一台计算机。通常用于同时提供WWW和MAIL服务的计算机。
如,有一台计算机名为“host.mydomain.com”(A记录),它同时提供WWW和MAIL服务,为了便于用户访问服务。
可以为该计算机设置两个别名(CNAME):WWW和MAIL
这两个别名的全称“www.mydomain.com”和“mail.mydomain.com”,实际上他们都指向 “host.mydomain.com”。
PTR(pointer):
反向查询IP--->FQDN,IP,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而有特定后缀:in-addr.arpa.,所以完整写法为:4.3.2.1.in-add.arpa.
TXT:一般指某个主机名或域名的说明,如:admin IN TXT "管理员, 电话:XXXXXXXXXXX",mail IN TXT "邮件主机,存放在xxx , 管理人:AAA",Jim IN TXT "contact: [email protected]",也就是您可以设置 TXT 内容以便使别人联系到您。
TTL(time to live):
简单的说,TTL就是一条域名解析记录在DNS服务器中的存留时间。
当各地的DNS服务器接受到解析请求时,就会向域名指定的NS服务器发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向NS服务器发出请求,而是直接返回刚才获得的记录,而这个记录在DNS服务器上保留的时间,就是TTL值。
泛域名解析:泛域名是指在一个域名根下,以 *.Domain.com的形式表示这个域名根所有未建立的子域名。 泛解析是把*.Domain.com的A记录解析到某个IP 地址上,通过访问任意的前缀.domain.com都能访问到你解析的站点上。
域名转向:域名转向又称为域名指向或域名转发,当用户地址栏中输入您的域名时,将会自动跳转到您所指定的另一个域名。一般是使用短的好记的域名转向复杂难记的域名。
资源记录格式:
语法:name [TTL] IN rr_type value
注意:
(1) TTL可从全局继承
(2) @可用于引用当前域的名字
(3) 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
(4) 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机
二、bind搭建DNS服务器
1、bind的安装
在 Linux 上面﹐提供 DNS 服务的套件是叫 bind。但执行服务程序名称则是 named 。
可以yum安装或者手动编译安装,注意,手动编译安装,相关的配置文件要手动填写,这里使用yum安装,安装完成后设置服务启动,并且设置开机启动
[root@localhost ~]# service named status
rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
named is stopped
[root@localhost ~]# service named start
Generating /etc/rndc.key: [ OK ]
Starting named: [ OK ]
[root@localhost ~]# chkconfig named on
[root@localhost ~]# chkconfig --list named
named 0:off1:off2:on3:on4:on5:on6:off
DNS默认监听TCP、UDP的53端口
我们知道,每台DNS服务器都知道根域的位置,安装完bind后,其根域的配置位于/var/namd/named.ca
由配置文件我们可以看到,有a-m 13台根服务器,还有其对应的IP地址,AAAA表示IPv6的地址
[root@gd2ywkfvm59 alrudns]# cat /var/named/named.ca
; This file holds the information on root name servers needed to
; initialize cache of Internet domain name servers
; (e.g. reference this file in the "cache .
; configuration file of BIND domain name servers).
;
; This file is made available by InterNIC
; under anonymous FTP as
; file /domain/named.cache
; on server FTP.INTERNIC.NET
; -OR- RS.INTERNIC.NET
;
; last update: April 11, 2017
; related version of root zone: 2017041101
;
; formerly NS.INTERNIC.NET
;
. 3600000 NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:ba3e::2:30
;
; FORMERLY NS1.ISI.EDU
;
. 3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201
B.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:84::b
;
; FORMERLY C.PSI.NET
;
. 3600000 NS C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
C.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2::c
;
; FORMERLY TERP.UMD.EDU
;
. 3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET. 3600000 A 199.7.91.13
D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2d::d
;
; FORMERLY NS.NASA.GOV
;
. 3600000 NS E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
E.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:a8::e
;
; FORMERLY NS.ISC.ORG
;
. 3600000 NS F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2f::f
;
; FORMERLY NS.NIC.DDN.MIL
;
. 3600000 NS G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
G.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:12::d0d
;
; FORMERLY AOS.ARL.ARMY.MIL
;
. 3600000 NS H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET. 3600000 A 198.97.190.53
H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::53
;
; FORMERLY NIC.NORDU.NET
;
. 3600000 NS I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
I.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fe::53
;
; OPERATED BY VERISIGN, INC.
;
. 3600000 NS J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30
J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:c27::2:30
;
; OPERATED BY RIPE NCC
;
. 3600000 NS K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fd::1
;
; OPERATED BY ICANN
;
. 3600000 NS L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42
L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:9f::42
;
; OPERATED BY WIDE
;
. 3600000 NS M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
M.ROOT-SERVERS.NET. 3600000 AAAA 2001:dc3::35
; End of file
bind的主配置文件:/etc/namd.conf
【注意这是C语言的格式,注释使用“//”,每行结束要有“;”,/* ”与“ */ ”之间则批注一整段文字。】
该文件只包括Bind的基本配置,并不包含任何DNS的区域数据。
这个配置文件,可以分为几部分:
options{}:全局配置选项
logging{}:日志子系统配置
zone:定义了根域的文件位置
include "/etc/named.rfc1912.zones";
包含了/etc/named.rfc1912.zones 这个配置文件,一般把要添加的域写在 /etc/named.rfc1912.zones,方便管理
include "/etc/named.root.key";
[21:02 [email protected]~]# cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
listen-on port 53 { 127.0.0.1; }; /*DNS监听的本机IP地址和端口,默认是本机的环回地址*/
listen-on-v6 port 53 { ::1; };
directory "/var/named";
/*指定了 named 的资源记录( RR - Resource Record )档案目录所在位置为﹕“/var/named”﹔也就是说﹐它会到这个目录下面寻找 DNS 记录档案。*/
dump-file "/var/named/data/cache_dump.db";
/*当执行rndc dumpdb时服务器dump文件的路径*/
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; }; /*允许查询RR表的na机器,localhost表示是本机的所有IP地址*/
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN { //在这个文件中是用zone关键字来定义域区的,一个zone关键字定义一个域区,但是为表规范,通常我们在/etc//named.rfc1912.zones文件添加相应的域名记录
type hint;
/*在这里type类型有三种,它们分别是master,slave和hint它们的含义分别是:
master:表示定义的是主域名服务器
slave :表示定义的是辅助域名服务器
hint:表示是互联网中根域名服务器
*/
file "named.ca";
/*由于上面已经定义directory是/var/named目录,所以这里是相对路径表示,表示是/var/namd/namd.ca*/
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
2、搭建DNS服务器
正向解析步骤:
(1)按需修改 named.conf,这里修改默认的监听IP,将默认127.0.0.1改成local本机所有IP地址,并且允许所有机器能查询,将allow-query的值改为any,表示允许所有机器IP查询
(2)建立需要添加的域名,这里在/etc/namd.rfc1912.zones文件添加相应的域名记录
(3)添加相应的资源记录表格,根据配置文件的定义,在/var/named目录下建立相应的RR
(4)修改RR的属主属组为named,同时修改相关权限,重启DNS服务即可生效
修改named.conf文件
[root@gd2ywkfvm59 alrudns]# cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
//listen-on port 53 { 127.0.0.1; }; 监听的本地接口,允许所有 ,修改的地方,注释掉该行
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
//allow-query { localhost; };
allow-query { any; }; //修改为允许所有
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
添加测试域名nihao.com
[root@gd2ywkfvm59 alrudns]# cat /etc/named.rfc1912.zones
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
// (c)2007 R W Franks
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
zone "nihao.com" IN {
type master;
file "nihao.zone";
};
zone "zzk.com" IN {
type master;
file "zzk.zone";
};
添加RR(Resource Records)资源记录
指每个域所包含的与之相关的资源。例如,每个RR都包括这个域的所属(RR是从哪个域名中得到的),类型(什么样的资源存在于这个RR中),TTL(time to live,存活时间)
[root@gd2ywkfvm59 alrudns]# cat /var/named/nihao.zone
$TTL 86400
@ IN SOA dns.nihao.com. admin.nihao.com. (
2016092301
1H
30M
1W
1D )
@ IN NS dns.nihao.com.
dns.nihao.com. IN A 172.18.16.137
@ IN MX 2 mail
maiil IN A 1.1.1.2
www IN A 119.75.218.70
重启DNS服务后测试成功
[root@gd2ywkfvm59 alrudns]# service named restart
Stopping named: . [ OK ]
Starting named: [ OK ]
[root@gd2ywkfvm59 alrudns]# dig www.zzk.com
; <<>> DiG 9.9.10-P3 <<>> www.zzk.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60943
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.zzk.com. IN A
;; ANSWER SECTION:
www.zzk.com. 600 IN CNAME tf01.zhongjie.com.
tf01.zhongjie.com. 600 IN A 123.60.30.133
;; Query time: 214 msec
;; SERVER: 192.168.50.20#53(192.168.50.20)
;; WHEN: Thu Jul 27 10:25:55 CST 2017
;; MSG SIZE rcvd: 84
上面因为没有指定解析的DNS服务器,所以请求到了网络上的DNS服务器,结果导致解析到了一个CNAME记录
指定本地的DNS服务器进行解析
[root@gd2ywkfvm59 alrudns]# dig www.zzk.com @192.168.46.59
; <<>> DiG 9.9.10-P3 <<>> www.zzk.com @192.168.46.59
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 217
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.zzk.com. IN A
;; ANSWER SECTION:
www.zzk.com. 86400 IN A 119.75.218.71
;; AUTHORITY SECTION:
zzk.com. 86400 IN NS dns.zzk.com.
;; ADDITIONAL SECTION:
dns.zzk.com. 86400 IN A 172.18.16.137
;; Query time: 0 msec
;; SERVER: 192.168.46.59#53(192.168.46.59)
;; WHEN: Thu Jul 27 10:26:07 CST 2017
;; MSG SIZE rcvd: 90
使queryperf进行测试结果:
测试目录路径:
[root@gd2ywkfvm59 queryperf]# pwd
/home/apps/dns_test/alrudns/bind/bind-9.9.10-P3/contrib/queryperf
使用多域名,添加外网解析(www.qq.com)
使用的域名解析请求test文件如下:
删除空白行后
[root@gd2ywkfvm59 queryperf]# sed -i '/^$/d' test1
这条命令也可以删除空白行
测试结果:
(测试环境:2CPU8核 59测试机,单机,测试程序也是跑在DNS服务器上,会造成性能下降)