一、安装基本的DNS服务器
安装DNS服务的软件包叫做BIND(berkley internet naming daemon,伯克利互联网名称后台),该软件包是在linux和UNIX平台上使用最广泛的DNS服务的软件包。也可以使用其他的拥有DNS服务的软件包,比如Djbdns、dnsmasq(DNS + DHCP打包的轻量解决方案)、powerDNS(模块化开源DNS服务器软件)
- 安装BIND和dnsutils:sudo apt-get install bind9 dnsutils
- 重启服务:sudo systemctl restart bind9
- 查询服务运行状态:sudo systemctl status bind9
- Dnsutils是提供安装完BIND后的验证功能以及nslookup、dig等工具
- Ubuntu server 20.04可用
- 安装完后DNS服务器只保存和解析本域各种域名记录(A、CNAME等),同时该DNS服务器都包含13个根域名服务器地址(事实上分布于世界的数百台服务器)
二、转发DNS服务器
企业搭建DNS服务器主要就是为了内部提供域名解析服务,但是一般都是作为二级域的权威DNS,对于互联网上的域名则采用转发请求的形式。这就是转发DNS服务器。
一般公司如果有多台服务器需要接入互联网并提供服务,则就需要申请一个域,比如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
正向区域文件解析:
- ;BIND data file for epiol.top #注释内容(;为注释符)
- $TTL 604800 #表示epiol.top区域的权威DNS,其他的缓存DNS来查询记录后所能保存该记录的时间。单位s,默认7天
- @ #表示本域域名,这里是epiol.top
一个区域的第一条记录总是SOA记录(起始授权记录):
- soa.epiol.top表示master的FQDN
- root.localhost.表示本域的管理员邮箱地址,为什么不叫root@localhost.因为这里.表示@
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
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
2)resolv
缓存文件位于/etc/resolv.conf
3)nsswitch
名称解析顺序文件位于/etc/nsswitch.conf
内容解析:
- 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服务器(如下图)
修改hosts文件:C:\Windows\System32\drivers\etc\hosts
windows在执行域名解析时,首先从hosts文件中读取,如果没有则在DNS缓存中读取,如果再没有,就执行DNS解析程序,从互联网DNS服务读取
nslookup来查看A/MX/NS记录:nslookup -qt={a | mx | ns} domain [dns-server]