DNS服务器最佳实践

DNS服务器最佳实践

Scroll Down

一、安装基本的DNS服务器

安装DNS服务的软件包叫做BIND(berkley internet naming daemon,伯克利互联网名称后台),该软件包是在linux和UNIX平台上使用最广泛的DNS服务的软件包。也可以使用其他的拥有DNS服务的软件包,比如Djbdns、dnsmasq(DNS + DHCP打包的轻量解决方案)、powerDNS(模块化开源DNS服务器软件)

  1. 安装BIND和dnsutils:sudo apt-get install bind9 dnsutils
  2. 重启服务:sudo systemctl restart bind9
  3. 查询服务运行状态:sudo systemctl status bind9
  • Dnsutils是提供安装完BIND后的验证功能以及nslookup、dig等工具
  • Ubuntu server 20.04可用
  • 安装完后DNS服务器只保存和解析本域各种域名记录(A、CNAME等),同时该DNS服务器都包含13个根域名服务器地址(事实上分布于世界的数百台服务器)

二、转发DNS服务器

企业搭建DNS服务器主要就是为了内部提供域名解析服务,但是一般都是作为二级域的权威DNS,对于互联网上的域名则采用转发请求的形式。这就是转发DNS服务器。

dns1.png

一般公司如果有多台服务器需要接入互联网并提供服务,则就需要申请一个域,比如epiol.top,服务器都在epiol.top域下,用户在访问服务器时,会最终查找到本域的DNS服务器,DNS服务器返回自己内部的区域文件中的记录给用户。所以如果公司存在多台服务器,就需要搭建DNS服务器,提供域名解析。DNS可以使用UDP也可以使用TCP协议,一般使用UDP 53端口,也可以使用TCP 53端口。

企业可以根据自己的需求创建DNS服务器,而需求决定了如何去配置四个配置文件。一般修改named.conf.options、named.conf.local以及区域配置文件即可满足大部分的DNS需求。当然正常企业都会为自己的DNS域创建正向、反向区域配置文件,配置主从DNS服务器。

DNS的主配置文件为/etc/bind/named.conf,包含了其他配置文件

1、DNS全局转发

DNS全局转发(即DNS缓存功能):当收到公司内部的DNS-query时,凡是本地DNS没有缓存的记录,会通过互联网的域名系统来查询解析记录(域名->IP),然后记录在本地。

配置DNS全局转发主要是修改/etc/bind/named.conf.options

DNS安全:出于安全因素和使用因素,只有公司内部的DNS-query才会走本服务器去进行域名查询,不允许互联网上的用户使用本台服务器去执行域名查询。当接收到互联网用户的DNS查询时,直接拒绝。以下是配置案例:

acl “local-network” { 
 10.0.0.0/24;   #公司内网地址段
};

options{
 recursion yes;      #允许递归查询
 allow-recursion{ local-network; }; #允许名为local的ACL网段对我发起递归查询
 listen-on {10.0.0.2;}; #允许在本地的某个网卡上侦听(存在多网卡时启用)
 forwarders{
	9.9.9.9;  #执行递归查询时,将DNS服务器指定为9.9.9.9(IBM DNS)
	8.8.8.8;  #执行递归查询时,将DNS服务器指定为8.8.8.8(google DNS)
};
};

2、DNS区域转发

区域转发功能:根据请求的区域有选择性的请求不同的DNS服务器。比如凡是查询公司区域的请求不转发给全局中的公网DNS,而是转发给区域中的公网DNS(或本地DNS)

配置DNS区域转发主要是修改/etc/bind/named.conf.options

DNS转发效率:凡是查询jianshu.com的请求不转发给option中的114.114.114.114和8.8.8.8而是转发给下面的forwarders中的DNS地址

zone “jianshu.com”{  
 type forward;  #区域类型:forward
 forwarders{ 
	223.5.5.5;  #转发给223.5.5.5(阿里云DNS)
	223.6.6.6;  #转发给223.6.6.6(阿里云DNS)
};
};

三、主从DNS服务器

1、主从概念

  • 主备:为了提高域名服务器的可靠性,DNS域名服务器都把数据复制到几个域名服务器来保存,一个是master域名服务器,其他都是slave域名服务器。
  • 区域文件:记录域名和IP的对应关系的文件
  • 正向区域文件:将域名解析成IP的记录
  • 反向区域文件:将IP解析成域名的记录
  • 区域传输:企业为了保证DNS的可靠性,一般会部署两台及以上的DNS服务器,不间断为内网用户提供域名解析服务。所以在master故障时,slave需要保证能够继续提供服务的前提就是master需要定期把区域文件拷贝到slave,而这个过程叫做区域传输,但是注意更改解析记录的行为只能在master中进行,这就保证了区域文件的一致性。

2、配置Master

slave服务器会同步master服务器,想要将master服务器开启正向解析的区域的话,需要修改配置文件(named.conf.local),新建正向区域文件(db.epiol.top),在配置文件中包含正向区域文件。

修改/etc/bind/named.conf.local配置文件,将正向区域文件包含进来

zone “epiol.top”{
 type master; #区域类型:master,表示本机是epiol.top区域的权威DNS
 file “/etc/bind/db.epiol.top”;  #指定正向区域记录文件
};

type {master| slave | forward}

  • master:作为主服务器
  • slave:作为从服务器
  • forward:作为转发服务器

file “区域文件绝对路径”

DNS安全:出于安全因素,我们需要配置反向区域,以保证公司内部的邮箱服务器不会收到恶意邮件

zone “8.1.10.in-addr.arpa” {
 type master;
 file “/etc/bind/db.10.1.8”;
};

如果邮件服务器处于内网网段是10.1.8.0/24,那么在zone后面需要反过来填写8.1.10.in-addr.arpa

1)正向区域文件

因为是正向解析,即根据FQDN查询IP,所以正向区域文件中的FQDN到IP的映射需要定义清楚,一般来说正向区域文件中存在的记录类型:

  • SOA:起始授权记录;定义当前区域的名称(即当前区域名的主DNS服务器FQDN)、当前区域管理员的邮箱地址、主从服务器协调属性的定义、否定答案的缓存时间
  • NS:定义当前区域内一个或多个DNS服务器的FQDN
  • A/AAAA:主机记录;记录FQDN到IP的映射关系,对于MX、NS等类型记录的value为FQDN,此FQDN都需要有一个对应的A/AAAA记录

1st.创建正向区域文件:touch /etc/bind/db.epiol.top

正向区域文件解析:
dns2.png

  • ;BIND data file for epiol.top #注释内容(;为注释符)
  • $TTL 604800 #表示epiol.top区域的权威DNS,其他的缓存DNS来查询记录后所能保存该记录的时间。单位s,默认7天
  • @ #表示本域域名,这里是epiol.top

一个区域的第一条记录总是SOA记录(起始授权记录):

2nd.编辑正向区域文件:

$TTL 604800
@	IN	SOA		ns1.epiol.top.		12345.gmail.com. (
				2 ; Serial
		  		604800 ; Refresh
				86400 ; Retry
				2419200 ; Expire
				604800 ) ; Negative Cache TTL
;
@	IN	NS 	ns1.
ns1 	IN	A	127.0.0.1
#A/AAAA记录
halo		IN	CNAME	www
web		IN	CNAME	www
www	IN	A	192.168.0.103
#MX记录
@		IN	MX	10	MX1	
@		IN	MX	20	MX2
email	IN	CNAME MX1
MX1		IN	A	192.168.0.124
MX2		IN	A	192.168.0.125

3rd.检查bind9状态:systemctl status bind9

4th.配置文件语法检查:named-checkconf

5th.区域文件语法检查:named-checkconf /etc/bind/db.epiol.top

6th.测试:linux测试、windows测试

采用dig和nslookup命令测试获取返回值:

  • dig 域名/FQDN {ns | a | aaaa | mx} @DNS服务器地址
  • windows本地默认会缓存DNS解析结果,ubuntu默认则不会
    • 显示缓存记录:ipconfig/displaydns
    • 清除缓存记录:ipconfig/flushdns

2)反向区域文件

如果有一个黑客使用虚拟机搭建了邮件服务器,他配置邮件服务器声称为epiol.top域的邮件服务器,黑客就会以epiol.top的名义向外发送邮件。比如真正epiol.top的一个员工的邮箱地址是zhangsan@epiol.top,黑客会以epiol.top公司老板的邮箱地址lisi@epiol.top从自己的虚拟机中发一封邮件到公司的服务器上,如果公司的服务器配置不当或者没有做过滤机制的话,邮箱服务器会接收这封邮件并投递到这位员工的邮箱中。邮件内容可能是钓鱼网站、或其他木马病毒等等。

所以为了安全性,邮件服务器需要进行安全检查,检查数据报的首部的IP地址。所以可以根据来源IP地址反查域名是否为epiol.top域的邮件服务器域名。这就需要做IP到域名的查询,所以DNS需要配置反向区域文件(/etc/bind/named.conf.local)。

1st.创建反向区域文件:touch /etc/bind/db.10.1.8

2nd.编辑反向区域文件:

@	IN	NS	ns.epiol.top.
192.168.80.129 IN PTR ns.epiol.top.
192.168.80.130 IN PTR mx1.epiol.top.
192.168.80.131 IN PTR mx2.epiol.top.
192.168.80.130 IN PTR w3.epiol.top.

反向解析记录主要配置的是PTR记录

3rd.检查bind9状态:systemctl status bind9

4th.配置文件语法检查:named-checkconf

5th.区域文件语法检查:named-checkconf /etc/bind/db.epiol.top

6th.测试反向查询域名:dig -x x.x.x.x @DNS服务器地址

3、配置slave

为了实现冗余容错,通常会为每个域安装多个slave DNS服务器,修改记录只在master上操作,通过版本号(即serial)通知slave服务器同步。同时为了安全性考虑:

  • 服务器全局禁止区域传输(即允许同步本域所有DNS记录,如果不禁止,任何客户端可以拿到所有的DNS记录,DNS记录是机密信息)
  • 只允许指定IP、指定区域的slave服务器进行区域传输
  • 区域数据同步使用TCP 53端口

dig执行区域传输:dig @192.168.80.129 epiol.top axfr
dns3.png

1)master权限限制

master设置允许指定slave服务器进行区域传输,同时每次修改完master的记录后就需要手动修改serial。以下为权限限制的具体操作:

1st.全局配置文件(/etc/bind/named.conf.options)禁止区域传输:

allow-transfer { none; }

2nd.本地配置文件(/etc/bind/named.conf.local)允许指定slave服务器进行区域传输:

#正向区域
allow-transfer { slave-ip; }; 
#反向区域
allow-transfer { slave-ip; };

3rd.正向区域文件(db.epiol.top)为slave服务器创建ns记录:

ns2 IN A slave-ip

4th.反向区域文件(db.10.1.8)为slave服务器创建PTR记录:

slave-ip IN PTR ns2.epiol.top

2)slave区域传输安全设置

1st.修改全局配置文件(/etc/bind/named.conf.option):

acl “local” { 
 10.1.8.0/24; #公司内网地址段
};
options{
 recursion yes; #允许递归查询
 allow-recursion{ local; }; #允许ACL名为local的网段地址对我发起递归查询
 allow-transfer { none; };
 listen-on { slave网卡; }; #允许在本地的某个网卡上侦听(存在多网卡时启用)
forwarders{
	9.9.9.9;  #执行递归查询时,将DNS服务器指定为9.9.9.9(IBM DNS)
	8.8.8.8;  #执行递归查询时,将DNS服务器指定为8.8.8.8(google DNS)
};
};

2nd.创建本地区域文件(/etc/bind/named.conf.local):

#正向区域
zone “epiol.top”{  
 type slave;
 file “db.epiol.top”; #注意不要加路径
 masters {master服务器IP地址}  #指定需要同步的master服务器
};
#反向区域
zone “8.1.10.in-addr.arpa”{  
 type slave;
 file “db.10.1.8”; #注意不要加路径
 masters {master服务器IP地址}  #指定需要同步的master服务器
};

同步后会存入/var/cache/bind/目录下,会被加密且无法更改。可以通过查看日志来判断slave是否已经同步master的所有记录(grep bind /var/log/syslog)。

3rd.测试:dig ns epiol.top @slave服务器

4th.master修改记录后,手动改serial后,slave的同步
建议添加功能:在named.conf.local中,在正向和反向区域中添加also-notify { slave服务器IP地址;};

四、客户端指定DNS

1、知名DNS服务器

国内公有IPV4 DNS:

  • 114.114.114.114
  • 114.114.115.115

阿里云DNS:

  • 223.5.5.5
  • 223.6.6.6

谷歌DNS:

  • 8.8.8.8
  • 8.8.4.4

2、linux指定DNS

Ubuntu中名称解析顺序是先查看hosts,没有则查看/etc/resolv.conf,再没有则DNS服务器。而名称解析顺序文件则为/etc/nsswitch.conf,可以修改该文件来更改名称解析顺序。

1)host

hosts文件位于/etc/hosts
dns4.png

2)resolv

缓存文件位于/etc/resolv.conf

3)nsswitch

名称解析顺序文件位于/etc/nsswitch.conf
dns5.png

内容解析:

  • files代表/etc/hosts、dns代表DNS服务器
  • resolve表示system-resolved.service(缓存、localhost、本机名)
  • [!NOTFOUND=return]表示只要是resolve服务可用的情况下,就直接返回结果
  • mdns4_minimal表示multicast DNS

3、windows指定DNS

掌握windows查看DNS服务器、设置DNS服务器、设置hosts解析文件。

  • 查看可用的DNS服务器:ipconfig/all
  • 设置DNS服务器:在指定的网络适配器中配置IPV4属性,然后修改首选和备用DNS服务器(如下图)

dns6.png

修改hosts文件:C:\Windows\System32\drivers\etc\hosts

windows在执行域名解析时,首先从hosts文件中读取,如果没有则在DNS缓存中读取,如果再没有,就执行DNS解析程序,从互联网DNS服务读取

nslookup来查看A/MX/NS记录:nslookup -qt={a | mx | ns} domain [dns-server]