术→技巧, 运维

如何搭建DNS服务

钱魏Way · · 425 次浏览

什么是DNS服务器?

DNS,即域名系统(Domain Name System),是计算机网络中的一项基础服务。通常来说,在网络上访问某个主机有两种方式:主机名、或IP地址。在互联网中,使用 IP 地址与服务器进行通信根本行不通,原因如下:

  • IP地址不便于记忆
  • IP 地址会经常变更,所以通过 IP 地址去访问某台机器就会发生问题

DNS它所提供的服务是用来将域名转换为 IP 地址或把IP地址转换为域名的工作。DNS它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。是一个应用层的协议DNS使用TCP和UDP端口53。

域名

ICANN

全世界域名的最高管理机构,是一个叫做 ICANN (Internet Corporation for Assigned Names and Numbers)的组织。它的总部在美国加州。它原来是美国商务部下面的一个非盈利机构,所以有人说,美国政府控制了全世界的域名,这种说法是有根据的。2016年,美国政府宣布,ICANN 不再隶属于商务部,成为一个自我管理的独立机构。但是可想而知,美国政府依然对它有绝对影响。ICANN 负责管理全世界域名系统的运作。它的一项主要工作,就是规定顶级域名(top level domain,简写为 TLD)。

TLD

所谓顶级域名(TLD),就是最高层级的域名。简单说,就是网址的最后一个部分。比如,网址www.example.com的顶级域名就是.com。

ICANN 就负责规定,哪些字符串可以当作顶级域名。截至2015年7月,顶级域名共有1058个。它们可以分成两类:

  • 一类是一般性顶级域名(gTLD),比如.com、.net、.edu、.org、.xxx等等,共有700多个。
  • 一类是国别顶级域名(ccTLD),代表不同的国家和地区,比如.cn(中国)、.io(英属印度洋领地)、.cc( 科科斯群岛)、.tv(图瓦卢)等,共有300多个。

顶级域名托管商

ICANN 自己不会去管理这些顶级域名,因为根本管不过来。想想看,顶级域名有1000多个,每个顶级域名下面都有许多批发商,如果每个都要管,就太麻烦了。

ICANN 的政策是,每个顶级域名都找一个托管商,该域名的所有事项都由托管商负责。ICANN 只与托管商联系,这样管理起来就容易多了。举例来说,.cn域名的托管商就是中国互联网络信息中心(CNNIC),它决定了.cn域名的各种政策。

目前,世界最大的顶级域名托管商是美国的 Verisign 公司。Verisign 是一家商业公司,总部在美国维吉尼亚州。它托管了.com、.net 、.name、.gov这四个一般性顶级域名,以及.cc和.tv这两个国别顶级域名。另外,.edu和.jobs的后台管理工作,也外包给了它。它对.com和.net的独家垄断是历史形成的。最早的时候, Network Solutions 公司接受美国国家科学基金会的委托,管理顶级域名。2000年,Verisign 收购了这家公司,继承了域名业务。2003年,Verisign 卖掉了域名注册业务,只保留顶级域名管理。也就是说,它只做域名批发,不做域名零售了。2010年,Verisign 又把网站安全和加密证书业务卖给了 Symantec 公司。后者又在2017年把这项业务卖给了 DigiCert。

按理说,Verisign 是 ICANN 最大的托管商,两家的关系应该很好才对。事实却是它们的关系很差,甚至还打过官司。原因在于,ICANN 是政府支持的非盈利机构,不以盈利为目标,而 Verisign 是一家商业公司,追求利润最大化,每年必须交大量的托管费给前者。两家的矛盾就源于此。

2003年,Verisign 推出了一项新业务 Site Finder,用户访问没有注册过的.com或.net域名,都会被导向 Verisign 的网站。这意味着,它事实上拥有了所有没有注册过的.com和.net域名。 几天之内,Verisign 就挤入了全世界的前10大网站。ICANN 要求 Verisign 立刻停止该业务,否则将终止域名托管合同。Verisign 屈服了,停止了这项业务,但是接着就把 ICANN 告上了法庭,要求法庭厘请两者之间的合同,ICANN 到底有没有权力干涉它的业务。2006年底,它们达成了庭外和解。ICANN 同意延长 Verisign 的顶级域名托管合同,并且同意 Verisign 向消费者收取的单个域名注册费的上限,从6美元提高到了7.85美元。这个费用标准,一直沿用到了今天,你去注册一个.com或.net域名,所交的钱有0.18美元是 ICANN 收取的管理费,7.85美元是 Verisign 收取的托管费,其余的钱就是域名零售商的费用。

如果一个.com或.net域名售价10美元,ICANN 和 Verisign 合计拿走8.03美元。后来,Verisign 的顶级域名托管合同又延长过两次,当前合同要到2024年才会到期。

表面上看,ICANN 让 Verisign 获得了巨额垄断利润。(曾经有公司提出,只要让它来托管.com域名,单个域名的托管费,可以降低到每年1美元。)但是实际上,ICANN 通过另一种方式在发挥市场的力量,那就是它不断提高顶级域名的数量和品种。如果你觉得.com域名太贵,你完全可以申请其他的顶级域名,有 1000多个顶级域名任你选择。

根域名

由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.example.com被写成www.example.com.,即最后还会多出一个点。这个点就是根域名。

理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。事实上也确实如此,ICANN 维护着一张列表,里面记载着顶级域名和对应的托管商。比如,我要访问www.example.com,就必须先询问 ICANN 的根域名列表,它会告诉我.com域名由 Verisign 托管,我必须去找 Verisign,它会告诉我example.com服务器在哪里。再比如,我要访问abc.xyz,也必须先去询问根域名列表,它会告诉我.xyz域名由 CentralNic 公司托管。根域名列表还记载,.google由谷歌公司托管,.apple由苹果公司托管等等。由于根域名列表很少变化,大多数 DNS 服务商都会提供它的缓存,所以根域名的查询事实上不是那么频繁。

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.

也就是说,.com域名的解析结果,可以到这个13个服务器的任一台查询。细心的读者可能发现,这些服务器本身也是使用域名(比如a.gtld-servers.net.)标识,那么还得去查询它们指向的服务器,这样很容易造成循环查询。因此,DNS 根区还会同时提供这些服务器的 IP 地址(IPv4 和 IPv6)。

a.gtld-servers.net. 172800  IN  A   192.5.6.30
a.gtld-servers.net. 172800  IN  AAAA    2001:503:a83e:0:0:0:2:30
b.gtld-servers.net. 172800  IN  A   192.33.14.30
b.gtld-servers.net. 172800  IN  AAAA    2001:503:231d:0:0:0:2:30
c.gtld-servers.net. 172800  IN  A   192.26.92.30
c.gtld-servers.net. 172800  IN  AAAA    2001:503:83eb:0:0:0:0:30
...
...

根域名服务器

保存 DNS 根区文件的服务器,就叫做 DNS 根域名服务器(root name server)。由于早期的 DNS 查询结果是一个512字节的 UDP 数据包。这个包最多可以容纳13个服务器的地址,因此就规定全世界有13个根域名服务器,编号从a.root-servers.net一直到m.root-servers.net。1个为主根服务器在美国,由美国互联网机构Network Solutions运作。其余12个均为辅根服务器,其中9个在美国,2个在欧洲(位于英国和瑞典),1个在亚洲(位于日本)。你可以在 http://root-servers.org 这个网站查到所有根域名服务器的信息。与现有IPv4根服务器体系架构充分兼容基础上,“雪人计划”于2016年在全球16个国家完成25台IPv6根服务器架设,事实上形成了13台原有根加25台IPv6根的新格局,为建立多边、民主、透明的国际互联网治理体系打下坚实基础。中国部署了其中的4台,由1台主根服务器和3台辅根服务器组成,打破了中国过去没有根服务器的困境。

DNS是一个分布式数据库,命名系统采用层次的逻辑结构如同一颗倒置的树,这个逻辑的树形结构称为域名空间,由于DNS划分了域名空间,所以各机构可以使用自己的域名空间创建DNS信息。

DNS树的每个节点代表一个域。通过这些节点对整个域名空间进行划分,成为一个层次结构。域名空间的每个域的名字,通过域名进行表示。通常由一个完全合格域名(FQDN)标识,FQDN能准确表示出其相对于DNS 域树根的位置,也就是节点到DNS 树根的完整表述方式。从节点到树根采用反向书写并将每个节点用“.”分隔,对于DNS 域biaodianfu来说,其完全正式域名(FQDN)为biaodianfu.com。例如:biaodianfu为com域的子域,其表示方法为biaodianfu.com,而www为google域中的子域,可以使用www.biaodianfu.com表示。

通常FQDN 有严格的命名限制,长度不能超过256 字节,只允许使用字符a-z,0-9,A-Z和减号(-)。点号(.)只允许在域名标志之间(例如“biaodianfu.com”)或者FQDN 的结尾使用。域名不区分大小,由最顶层到下层,可以分成:根域、顶级域、二级域、子域。

bidoainfu.com就是一个顶级域名,而www.biaodianfu.com却不是顶级域名,他是在biaodianfu.com 这个域里的,叫做www的主机。一级域之后还有二级域,三级域,只要我买了一个顶级域,并且我搭建了自己BIND服务器(或者其他软件搭建的)注册到互联网中,那么我就可以随意在前面多加几个域了(DNS域名空间中树的最大深度不得超过127层,树中每个节点最长可以存储63个字符)。比如a.www.biaodianfu.com,在这个网址中,www.biaodianfu.com变成了一个二级域而不是一台主机,主机名是a。

DNS树状结构图:

DNS服务器类型

粗略来说,DNS服务器具有以下几种:

  • 根DNS服务器。根服务器在逻辑上共有13个(即13个IP地址),分布在世界各地。由于UDP查询和响应报文的最大长度为512字节,为了保证根服务器数据能被包含在一个UDP包中,最多只能允许13个根DNS服务器存在,其命名从A到M。
  • 顶级域DNS服务器。这些服务器负责顶级域名的DNS查询,如com、org、net等,以及国家的顶级域名。
  • 权威DNS服务器。特定的机构为了使得自己的域名可以被公共访问,需要维护对应的DNS记录。可以选择自己的权威DNS服务器以保存这些记录,也可以选择支付费用以存储在某个服务提供商的权威DNS服务器中。
  • 本地DNS服务器。对于一个ISP来说,都有一台本地DNS服务器承担代理的作用。它严格上并不属于DNS层级中。

DNS通信过程

DNS两种查询方式:

  • 递归查询:递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器并将返回的查询结果提交给客户机。
  • 迭代查询:DNS 服务器另外一种查询方式为迭代查询,当客户机发送查询请求时DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果。

解析方式:

  • 正向解析:FQDN –> IP
  • 反向解析:IP –> FQDN

FQDN:(Fully Qualified Domain Name)全称域名。正向解析是两个不同的名称空间是两个不同的解析树,所以各需要一个解析库来分别负责本地域名的正向和反向。

递归:DNS请求被服务器接受后,如果属于此服务器管辖范围则请求上级服务器依次传递请求,并且依次传递结果给发出请求的主机。

迭代: DNS请求被服务器接受后,如果不是自己管辖范围,让客户端访问根域服务器,然后跟域通知客户端去访问下级服务器,直到最后客户端访问管辖请求域名的服务器为止。

例如访问一个www.baidu.com的地址,DNS查询过程主要包括递归查询与迭代查询:

  • 查询本地浏览器缓存
  • 查询本地hosts文件
  • 请求本地DNS服务器进行域名查询(至此的查询为递归查询)
  • 若本地DNS服务器没有对应地址的缓存,则请求根DNS服务器,返回com顶级DNS服务器的地址。
  • 请求com顶级DNS服务器,获得com权威DNS服务器的地址
  • 请求com权威DNS服务器,获得www.google.com的地址(至此的查询为迭代查询)

下图展示了这一查询过程:

显然,如果每次查询都经过这样的全部过程,那耗时将是不可接受的,因此DNS缓存应运而生。在整个DNS网络中,当某个DNS服务器接受到一个DNS应答时,它将在本地进行缓存,从而在未来的一段时间内(例如2天)对于同样的域名进行直接应答,从而减少请求的次数。

DNS记录类型

DNS服务器实际存储的是一条条资源记录(Resource Record,RR),一条资源记录包括以下4个字段:Name、Value、Type和TTL。其中TTL表示该记录应从缓存中删除的时间,其余三个字段在不同的组合下拥有如下的含义。

每个 DNS 记录都有一个类型。这种类型定义了记录内容的含义。例如,MX 类型的 DNS 记录包含邮件交换服务器的位置。所有记录类型都在所谓的 RFC(征求意见稿)中进行了严格定义。自从域名系统诞生以来,就增加了很多新的记录类型。一些记录类型也被声明为过时,因为它们已被更新的记录类型取代。

存在许多不同类型的 DNS 记录。它们中的大多数只是偶尔使用。只有几种记录类型被非常频繁地使用。

这些是最常用的 DNS 记录类型:

DNS服务器的搭建

BIND的安装

BIND(Berkeley Internet Name Domain,伯克利因特网名称域)服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。DNS域名解析服务作为互联网基础设施服务,其责任之重可想而知,因此建议大家在生产环境中安装部署bind服务程序时加上chroot(俗称牢笼机制)扩展包,以便有效地限制bind服务程序仅能对自身的配置文件进行操作,以确保整个服务器的安全。

安装bind服务和启动步骤:

[root@localhost ~]# yum install -y bind*  #安装bind组件
[root@localhost ~]# systemctl start named #启动dns服务
[root@localhost ~]# systemctl enable named #设置dns服务开机启动

DNS配置的主要文件组:

  • /etc/hosts:主机的一个文件列表,添加记录如:111.13.100.92 www.baidu.com,对于简单的主机名解析(点分表示法),默认在请求DNS或NIS网络域名服务器前,/etc/named.conf 通常会告诉程序先查看此文件。
  • /etc/resolv.conf:转换程序配置文件,在配置程序请求BIND域名查询服务查询主机名时,必须告诉程序使用哪个域名服务器和IP地址来完成这个任务
  • /etc/named.conf:BIND主文件,设置一般的name参数,指向该服务器使用的域数据库的信息源
  • /var/named/named.ca:根域名配置服务器指向文件,指向根域名配置服务器,用于告诉缓存服务器初始化
  • /var/named/localhost.zone:localhost区正向域名解析文件,用于将本地IP地址(0.0.1)转换为本地回送IP地址(127.0.0.1)
  • /var/named/name.local:localhost区反向域名解析文件,用于将localhost名字转换为本地回送IP地址(0.0.1)
  • /etc/named.rfc1912.zones:区块设置文件

name.conf文件的主要配置信息:

  • acl:定义ip地址的访问控制清单
  • control:定义rndc使用的控制通道
  • include:把其他的文件包含到配置文件中
  • key:定义授权的安全密钥
  • logging:定义日志内容和位置
  • options:定义全局配置选项和默认值
  • server:定义远程服务的特征
  • zone:定义一个区

配置DNS正向解析

在配置Bind服务时,主要用到以下三个配置文件:

  • 主配置文件(/etc/named.conf):用来定义bind服务程序的运行。
  • 区域配置文件(/etc/named.rfc1912.zones):用来保存域名和IP地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应IP地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。
  • 数据配置文件目录(/var/named):该目录用来保存域名和IP地址真实对应关系的数据配置文件。

第一步:修改主配置文件/etc/named.conf

将监听地址和运行查询的地址都改为 any,分别表示服务器上的所有IP地址均可提供DNS域名解析服务,以及允许所有人对本服务器发送DNS查询请求。

第二步:修改区域配置文件(/etc/named.rfc1912.zones)

用来保存域名和IP地址对应关系的所在位置。在这个文件中,定义了域名与IP地址解析规则保存的文件位置以及服务类型等内容,而没有包含具体的域名、IP地址对应关系等信息。服务类型有三种,分别为hint(根区域)、master(主区域)、slave(辅助区域),其中常用的master和slave指的就是主服务器和从服务器。

zone "example.com" IN {
        type master;
        file "example.com.zone";
}

DNS默认端口是53的TCP和UPD,UDP是供用户查询的,主从复制用TCP和UDP的53端口都用。

BIND的ACL:bind有四个内置的acl:

  • none: 没有一个主机
  • any: 任意主机
  • localhost: 本机
  • localnet: 本机的IP同掩码运算后得到的网络地址段

注意:只能先定义,后使用;因此一般定义在配置文件中, 处于options的前面,当然也可自定义如下:

acl lan{
   192.168.25.0/24
} ;

访问控制的指令:

  • allow-query {}: 允许查询的主机;白名单
  • allow-transfer {}:允许区域传送的主机;(白名单,一般用于主从)
  • allow-recursion {}: 允许递归的主机,建议全局使用
  • allow-update {}: 允许更新区域数据库中的内容

第三步:编辑数据配置文件。

从/var/named目录中复制一份正向解析的模板文件(named.localhost),然后把域名和IP地址的对应数据填写数据配置文件中并保存。在复制时记得加上-a参数,这可以保留原始文件的所有者、所属组、权限属性等信息,以便让bind服务程序顺利读取文件内容:

[root@localhost named]# cp -a named.localhost example.com
[root@localhost named]# vim example.com.zone 
$TTL 1D
@       IN SOA  @ example.com.   (
     #授权信息开始:   #DNS区域的地址,在域地址后面还可以加管理员邮箱,不能加@,用.代替。
              20181001        ; serial  #更新序列号
                      1D      ; refresh #更新时间
                      1H      ; retry   #重试时间
                      1W      ; expire   #失效时间
                      3H )    ; minimum  #无效解析记录的缓存时间
        NS      ns.example.com.  #DNS区域的地址
ns      A       192.168.245.128  #地址记录
www     A       192.168.245.128  #www站点记录
mail    A       192.168.245.129  #地址记录
        MX 10   mail.example.com. #邮箱交换记录
example.com.    A 192.168.245.200
# 即使不写主机名,DNS也能解析到另外一个指定的地址
$GENERATE 1-245 server$ A 1.1.1.$
#如果服务器过多,对应主机名也很多,则可以这样写.例如:
#server1.example.com对应地址为:1.1.1.1
#server100.exmaple.com对应地址为:1.1.1.50
bbs     CNAME   www           #别名记录
*       A       192.168.245.128
#“*”代表所有,即便主机www写错,DNS也能正确解析出来。这就是泛域名解析

第四步:检查配置,重启服务和测试

检查和重启服务:

[root@localhost ~]# named-checkconf   #检查主配置文件语法
[root@localhost ~]# named-checkzone eample.com /var/named/example.com.zone 
#检查区域配置文件语法
/var/named/example.com.zone:13: ignoring out-of-zone data (example.com)
zone eample.com/IN: loaded serial 20181001
[root@localhost ~]# vi /etc/resolv.conf
#进入该配置文件,指定使用的域名解析服务器。
    # Generated by NetworkManager
    nameserver 192.168.245.128
    search 192.168.245.128
[root@localhost ~]# systemctl restart named  #重启服务

测试:

配置DNS反向解析

在DNS域名解析服务中,反向解析的作用是将用户提交的IP地址解析为对应的域名信息,它一般用于对某个IP地址上绑定的所有域名进行整体屏蔽,屏蔽由某些域名发送的垃圾邮件。它也可以针对某个IP地址进行反向解析,大致判断出有多少个网站运行在上面。当购买虚拟主机时,可以使用这一功能验证虚拟主机提供商是否有严重的超售问题。

第一步:配置区域文件

反向解析是把IP地址解析成域名格式,因此在定义zone(区域)时应该要把IP地址反写,比如原来是192.168.10.0,反写后应该就是10.168.192,而且只需写出IP地址的网络位即可。

[root@localhost ~]# vim /etc/named.rfc1912.zones
#在中添加反向数据文件的记录
zone "245.168.192.in-addr.arpa" IN {
        type master;
        file "245.168.192.arpa";
};

第二步:编辑数据配置文件

反向解析是把IP地址解析成域名格式,因此在定义zone(区域)时应该要把IP地址反写,比如原来是192.168.10.0,反写后应该就是10.168.192,而且只需写出IP地址的网络位即可。

[root@localhost ~]# cp -a /var/named/named.loopback /var/named/245.168.192.arpa 
[root@localhost ~]# vi /var/named/245.168.192.arpa
#编辑反正配置文件即可,和正向解析格式类似
#PTR为指针记录,仅用于反向解析中。

第三步:检查配置文件,重启服务,测试。

[root@localhost ~]# named-checkconf 
[root@localhost ~]# named-checkzone 245.168.192 /var/named/245.168.192.arpa 
zone 245.168.192/IN: loaded serial 20181001
OK
[root@localhost ~]# systemctl restart named

搭建DNS主从服务器

从而起到备份解析记录与负载均衡的作用,因此通过部署从服务器可以减轻主服务器的负载压力,还可以提升用户的查询效率。

第一步:在主服务器的区域配置文件中允许该从服务器的更新请求,即修改allow-update {允许更新区域信息的主机地址;};参数,然后重启主服务器的DNS服务程序。

[root@localhost ~]# vi /etc/named.rfc191
zone "example.com" IN {
        type master;
        file "example.com.zone";
        allow-update { 192.168.245.129; };
};
zone "245.168.192.in-addr.arpa" IN {
        type master;
        file "245.168.192.arpa";
        allow-update { 192.168.245.129; };
};
[root@localhost ~]# systemctl restart named

第二步: 在从服务器中填写主服务器的IP地址与要抓取的区域信息,然后重启服务。注意此时的服务类型应该是slave(从),而不再是master(主)。masters参数后面应该为主服务器的IP地址,而且file参数后面定义的是同步数据配置文件后要保存到的位置,稍后可以在该目录内看到同步的文件。

[root@localhost ~]# vi /etc/named.conf
options {
        listen-on port 53 { any; }; #改为any,
        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     { any; }; #改为any,允许所有主机查询
[root@localhost ~]# vi /etc/named.rfc191
zone "example.com" IN {
        type master;
        file "example.com.zone";
        allow-update { 192.168.245.129; };
};
zone "245.168.192.in-addr.arpa" IN {
        type master;
        file "245.168.192.arpa";
        allow-update { 192.168.245.129; };
};
[root@localhost ~]# vi /etc/named.conf^C
[root@localhost ~]# iptables -F  #关闭防火墙
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]# systemctl restart named
[root@localhost ~]# systemctl enable named

第三步:测试。可将从服务的DNS地址改为自己,进行地址解析。

[root@localhost named]# dig www.example.com

; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9870
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.example.com.               IN      A

;; ANSWER SECTION:
www.example.com.        86400   IN      A       192.168.245.128

;; AUTHORITY SECTION:
example.com.            86400   IN      NS      ns.example.com.

;; ADDITIONAL SECTION:
ns.example.com.         86400   IN      A       192.168.245.128

;; Query time: 1 msec
;; SERVER: 192.168.245.129#53(192.168.245.129)
;; WHEN: Tue Oct 16 11:19:04 CST 2018
;; MSG SIZE  rcvd: 93

这种情况下,证明DNS主从服务器搭建成功。一旦主DNS发生故障,将自动利用DNS从服务器进行解析,实现了某种程度上的容错。

配置DNS安全的加密传输

TSIG主要是利用了密码编码的方式来保护区域信息的传输(Zone Transfer),即TSIG加密机制保证了DNS服务器之间传输域名区域信息的安全性。

第一步:在主服务上生产密钥

dnssec-keygen命令用于生成安全的DNS服务密钥,其格式为“dnssec-keygen [参数]”,常用的参数以及作用如下:

参数 作用
-a 指定加密算法,包括RSAMD5(RSA)、RSASHA1、DSA、NSEC3RSASHA1、NSEC3DSA等
-b 密钥长度(HMAC-MD5的密钥长度在1~512位之间)
-n 密钥的类型(HOST表示与主机相关)

使用下述命令生成一个主机名称为master-slave的128位HMAC-MD5算法的密钥文件。在执行该命令后默认会在当前目录中生成公钥和私钥文件,在传输配置文件中会用到该秘钥。

[root@localhost ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave 
Kmaster-slave.+157+15811
[root@localhost ~]# cat Kmaster-slave.+157+47396.key
master-slave. IN KEY 512 3 157 9+m1PlQOAF7xnMLClzNmXw==
[root@localhost ~]# cat Kmaster-slave.+157+47396.private 
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: 9+m1PlQOAF7xnMLClzNmXw==  
Bits: AAA=
Created: 20181016033058
Publish: 20181016033058
Activate: 20181016033058

第二步:在主服务器中创建验证秘钥文件

进入bind服务程序用于保存配置文件的目录,把刚刚生成的密钥名称、加密算法和私钥加密字符串按照下面格式写入到tansfer.key传输配置文件中。为了安全起见,我们需要将文件的所属组修改成named,并将文件权限设置得要小一点,然后把该文件做一个硬链接到/etc目录中。

[root@localhost ~]# vim /var/named/chroot/etc/transfer.key

key "master-slave" {
algorithm hmac-md5;
secret "9+m1PlQOAF7xnMLClzNmXw==";
};
[root@localhost ~]# chown root:named/var/named/chroot/etc/transfer.key
[root@localhost ~]# ln /var/named/chroot/etc/transfer.key /etc/transfer.key

第三步:开启主服务器密钥验证功能

开启并加载Bind服务的密钥验证功能。首先需要在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有master-slave密钥认证的DNS服务器同步数据配置文件:

[root@localhost ~]# vim /var/named/chroot/etc/transfer.key

key "master-slave" {
algorithm hmac-md5;
secret "9+m1PlQOAF7xnMLClzNmXw==";
};
[root@localhost ~]# chown root:named/var/named/chroot/etc/transfer.key
[root@localhost ~]# ln /var/named/chroot/etc/transfer.key /etc/transfer.key

至此,DNS主服务器的TSIG密钥加密传输功能就已经配置完成。此时清空DNS从服务器同步目录中所有的数据配置文件,然后再次重启bind服务程序,这时就已经获取不到主服务器的配置文件了。

第四步:配置从服务器支持秘钥验证

[root@localhost ~]# scp /var/named/chroot/etc/transfer.key root@192.168.245.128:/var/named/chroot/etc/transfer.key
root@192.168.245.128's password: 
transfer.key                    100%   79     0.1KB/s   00:00 
[root@localhost ~]# chown root:named /var/named/chroot/etc/transfer.key
[root@localhost ~]# ln /var/named/chroot/etc/transfer.key /etc/transfer.key

第五步:配置从服务器配置文件

[root@localhost ~]# vi /etc/named.conf 

include "/etc/transfer.key"; #在此添加秘钥文件

options {
        listen-on port 53 { any; };
        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     { any; };

        /* 
           recursion. 
           reduce such attack surface 
        */
        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";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

#在此添加主服务器地址,位置不能太靠前,否则bind服务程序会因为没有加载完预设参数而报错:
server 192.168.245.128 {
        keys { master-slave; };
};

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";

至此,主从服务器配置完成,重启服务后,可在/var/named/slaves/目录下看到同步过来的文件。

[root@localhost ~]# systemctl restart named
[root@localhost ~]# ls /var/named/slaves/
245.168.192.arpa  example.com.zone

配置DNS缓存服务器

DNS缓存服务器(Caching DNS Server)是一种不负责域名数据维护的DNS服务器。简单来说,缓存服务器就是把用户经常使用到的域名与IP地址的解析记录保存在主机本地,从而提升下次解析的效率。DNS缓存服务器一般用于经常访问某些固定站点而且对这些网站的访问速度有较高要求的企业内网中,但实际的应用并不广泛。而且,缓存服务器是否可以成功解析还与指定的上级DNS服务器的允许策略有关。

[root@localhost ~]# vim /etc/named.conf
options {
 listen-on port 53 { any; };
 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 { any; };
 forwarders { 目标地址; }; #在此处添加转发地址即可
......

免费DNS服务资源

免费域名解析服务

一般域名使用注册商提供的域名解析服务虽然方便,但功能大多有限,特别是目前国内还会针对某些DNS服务器进行屏蔽,造成网站无法解析的情况出现,因此,使用第三方域名解析服务也是中国网站的必要选择,这里就介绍一些常见的免费域名解析服务。

域名注册商提供的免费服务

  • Godaddy:不在Godaddy注册域名,也可以使用Godaddy的域名解析服务,使用方法很简单,登录Godaddy网站后,点击“Add Off-site DNS”即可添加用户的域名,之后将用户域名的DNS设置为Godaddy指定的地址,域名DNS生效后,即可点击添加的域名进行DNS解析设置。
  • NameCheap:知名的域名注册商NameCheap也和Godaddy一样,提供免费DNS域名解析,点击“FreeDNS”后,即可添加用户域名,用户可以通过修改DNS或域名邮件来验证自己的域名,NameCheap的解析服务支持的功能有:网址转发(可隐藏原URL、支持301重定向)、邮件转发、A记录、CNAME别名记录、MX邮件记录、TXT文本记录、NS记录、AAAA记录(IPV6)、动态域名解析等等。

国内免费域名解析服务

  • DNSPod:DNSPod是国内运营较久的免费DNS解析服务,除了免费服务外,还提供多项收费服务。DNSPod的功能较多,支持电信、网通、教育网双线或者三线智能DNS解析,在中国国内解析速度较快,但对于国外的Google爬虫来说经常出现无法访问的情况。

国外免费域名解析服务

  • ZoneEdit:美国著名的老牌免费域名DNS解析服务,成立于1999年。免费帐户最多可添加5个域名。解析类型:A记录、AAAA记录、 TXT文本记录、LOC记录、PTR记录、CNAME别名记录、MX邮件记录、网址转发、邮件转发等。界面超级简洁,速度快,稳定。
  • NET:是美国老牌IDC,成立于1994年,在技术领域比较强,尤其是IPV6应用。这个免费DNS解析服务最多可以添加50个域名,可以设置A记录、AAAA记录、CNAME别名记录、MX邮件记录、NS记录、TXT记录、SRV记录。
  • FreeDNS:一家美国免费域名DNS解析服务网站,界面简洁,注册简单,支持添加任何后缀的域名,支持Google Apps服务。免费域名DNS解析服务有三种模式:简单模式可直接设置IP指向、转发模式可设置301永久重定向和302临时重定向、高级模式可设置A记录、AAAA记录、CNAME记录、MX记录、PTR记录、TXT记录。

CDN服务自带域名解析

  • CloudFlare:虽然它的主营业务是CDN(Anycast),但丝毫不影响它作为免费DNS的声誉,况且这个免费DNS是真的全球分布(12个节点),且使用了CDN技术。
  • 百度加速乐:加速乐也主要是CDN业务,顺带提供DNS域名解析,提供抗CC攻击、免费DNS解析、免费分省解析、防黑客攻击、黑链暗链防护、页面篡改防护服务。

主机服务提供的免费服务

  • Linode:是美国一家VPS主机销售商,口碑是相当不错,而Linode也为用户免费提供DNS解析服务,不管你没有购买Linode的VPS主机,你都可以使用Linode DNS进行域名解析。鉴于Linode的高质量主机,因此有理由相信Linode DNS的质量水平。Linode提供了五台NS服务器,分别是:linode.com~ns5.linode.com,机房分布在美国、欧洲等世界各地,响应速度快。

公共DNS服务

在我们使用电信或者其他运营商网络时会自动的给你分配DNS,但是由于目前国内的运营商基本上都是毫无节操的,在给域名解析时常会进行DNS污染,常见的比如弹出相关的广告或者当然输错网址时弹出一个网址导航的页面等。为了避免上述的问题,可以通过修改电脑本地的DNS服务器来防止被运营商DNS污染。

目前广为人知的公共DNS服务为谷歌 Google Public DNS:

  • 8.8.8
  • 8.4.4
  • 3.2.1(新增)

由于谷歌的服务器都在境外,虽然稳定和安全,但是由于某些不可抗力的影响,常有丢包的现象。除了谷歌以外,目前风头正足的就是114DNS了,其总共三种模式的DNS解析:

  • 纯净 无劫持 无需再忍受被强扭去看广告或粗俗网站之痛苦 服务地址为:114.114.114 和 114.114.115.115
  • 拦截 钓鱼病毒木马网站 增强网银、证券、购物、游戏、隐私信息安全 服务地址为:114.114.119 和 114.114.115.119
  • 学校或家长可选拦截 色情网站 保护少年儿童免受网络色情内容的毒害 服务地址为:114.114.110 和 114.114.115.110

另外作为官方管理机构的CNNIC(SNDS)也提供了DNS服务。

  • 2. 4.8
  • 2.4.8
  • 2.1.1
  • 2.2.2

阿里公共DNS是阿里巴巴集团推出的DNS递归解析系统,目标是成为国内互联网基础设施的组成部分,面向互联网用户提供“快速”、“稳定”、“智能”的免费DNS递归解析服务。阿里提供公共DNS服务的优势:

  • 阿里在全国有优质的机房、网络、带宽等互联网基础设施资源。
  • 阿里建设和运营着全国最大的CDN网络,对互联网流量调度有丰富的经验。
  • 阿里旗下万网是国内最大的域名注册商,管理着几百万域名。同时有丰富的DNS管理经验。
  • 阿里拥有大量优秀的技术人才,有非常强的自主研发能力和运维保障能力。

DNS 服务器 IP 地址:

  • 首选:5.5.5
  • 备选:6.6.6

Public DNS+是DNSPod推出的公共域名解析服务,服务IP为119.29.29.29,类似于其他公共DNS(如Google的8.8.8.8和114dns的114.114.114.114),可以为全网用户提供域名的公共递归解析服务(区别于DNSPod原有的域名授权解析服务)。Public DNS+凭借DNSPod多年的域名解析服务经验开发,并依托于腾讯强大的资源优势,旨在为用户提供更加快速、准确、稳定的递归解析服务,且我们不会对任何域名进行恶意劫持。

DNS 服务器 IP 地址:

  • 首选:29.29.29
  • 备选:254.116.116

参考链接:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注