Linux就该这么学—Fourteen 使用Bind提供域名解析服务
DNS域名解析服务
相较于由数字构成的IP地址,域名更容易被理解和记忆,所以我们通常更习惯通过域名的方式来访问网络中的资源。但是,网络中的计算机之间只能基于IP地址来相互识别对方的身份,而且要想在互联网中传输数据,也必须基于外网的IP地址来完成。
为了降低用户访问网络资源的门槛,DNS(Domain Name System,域名系统)技术应运而生。这是一项用于管理和解析域名与IP地址对应关系的技术,简单来说,就是能够接受用户输入的域名或IP地址,然后自动查找与之匹配(或者说具有映射关系)的IP地址或域名,即将域名解析为IP地址(正向解析),或将IP地址解析为域名(反向解析)。
鉴于互联网中的域名和IP地址对应关系数据库太过庞大,DNS域名解析服务采用了类似目录树的层次结构来记录域名与IP地址之间的对应关系,从而形成了一个分布式的数据库系统,如图所示。
域名后缀一般分为国际域名和国内域名。原则上来讲,域名后缀都有严格的定义,但在实际使用时可以不必严格遵守。目前最常见的域名后缀有.com(商业组织)、.org(非营利组织)、.gov(政府部门)、.net(网络服务商)、.edu(教研机构)、.pub(公共大众)、.cn(中国国家顶级域名)等。
DNS技术作为互联网基础设施中重要的一环,为了为网民提供不间断、稳定且快速的域名查询服务,保证互联网的正常运转,提供了下面三种类型的服务器。
主服务器:在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系。
从服务器:从主服务器中获得域名与IP地址的对应关系并进行维护,以防主服务器宕机等情况。
缓存服务器:通过向其他域名解析服务器查询获得域名与IP地址的对应关系,并将经常查询的域名信息保存到服务器本地,以此来提高重复查询时的效率。
简单来说,主服务器是用于管理域名和IP地址对应关系的真正服务器,从服务器帮助主服务器“打下手”,分散部署在各个国家、省市或地区,以便让用户就近查询域名,从而减轻主服务器的负载压力。缓存服务器不太常用,一般部署在企业内网的网关位置,用于加速用户的域名查询请求。
DNS域名解析服务采用分布式的数据结构来存放海量的“区域数据”信息,在执行用户发起的域名查询请求时,具有递归查询和迭代查询两种方式。所谓递归查询,是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果DNS服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。而迭代查询则是指,DNS服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的地址,用户再向这台DNS服务器提交请求,这样依次反复,直到返回查询结果。
由此可见,当用户向就近的一台DNS服务器发起对某个域名的查询请求之后(这里以www.linuxprobe.com为例),其查询流程大致如图所示。
13台根DNS服务器的具体信息
名称 | 管理单位 | 地理位置 | 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 |
安装Bind服务程序
BIND(Berkeley Internet Name Domain,伯克利因特网名称域)服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。DNS域名解析服务作为互联网基础设施服务,其责任之重可想而知,因此建议大家在生产环境中安装部署bind服务程序时加上chroot(俗称牢笼机制)扩展包,以便有效地限制bind服务程序仅能对自身的配置文件进行操作,以确保整个服务器的安全。
bind服务程序的配置并不简单,因为要想为用户提供健全的DNS查询服务,要在本地保存相关的域名数据库,而如果把所有域名和IP地址的对应关系都写入到某个配置文件中,估计要有上千万条的参数,这样既不利于程序的执行效率,也不方便日后的修改和维护。因此在bind服务程序中有下面这三个比较关键的文件。
主配置文件(/etc/named.conf):只有58行,而且在去除注释信息和空行之后,实际有效的参数仅有30行左右,这些参数用来定义bind服务程序的运行。
区域配置文件(/etc/named.rfc1912.zones):用来保存域名和IP地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应IP地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。
数据配置文件目录(/var/named):该目录用来保存域名和IP地址真实对应关系的数据配置文件。
bind服务程序名称为named,在部署bind服务之前要先修改bind服务程序的主配置文件/etc/named.conf,使得服务器上的所有IP地址均可提供DNS域名解析服务,以及允许所有人对本服务器发送DNS查询请求。
vim /etc/named.conf #在11行和17行,地址均改为any ... listen-on port 53 { any; }; #服务器上的所有IP地址均可提供DNS域名解析服务。原始值为127.0.01 ... allow-query { any; }; #允许所有人对本服务器发送DNS查询请求。原始值为localhost ...
域名解析为IP地址的正向解析参数和将IP地址解析为域名的反向解析参数分别如下图所示
正向解析
反向解析
如果遇到启动bind服务程序失败的情况,可以执行以下命令:
named-checkconf命令:检查bind服务程序主配置文件/etc/named.conf 中语法或参数的错误。 named-checkzone命令:检查bind服务程序数据配置文件/var/named/xxxx中语法或参数的错误。
** 正反向解析实验**
在DNS域名解析服务中,正向解析是指根据域名(主机名)查找到对应的IP地址。也就是说,当用户输入了一个域名后,bind服务程序会自动进行查找,并将匹配到的IP地址返给用户。这也是最常用的DNS工作模式。
第1步:编辑区域配置文件(/etc/named.rfc1912.zones)。
区域配置文件用来保存域名和IP地址对应关系的所在位置。在这个文件中,定义了域名与IP地址解析规则保存的文件位置以及服务类型等内容,而没有包含具体的域名、IP地址对应关系等信息。服务类型有三种,分别为hint(根区域)、master(主区域)、slave(辅助区域),其中常用的master和slave指的就是主服务器和从服务器。
vim /etc/named.rfc1912.zones zone "linuxprobe.com" IN { #正向解析参数 type master; #服务类型为主服务器 file "linuxprobe.com.zone"; #域名与IP地址解析规则保存的文件位置(/var/named/linuxprobe.com.zone) allow-update {none;}; #允许哪些客户机动态更新该解析信息(这里不允许任何人) }; zone "10.168.192.in-addr.arpa" IN { #反向解析参数,表示192.168.10.0./24网段的反向解析区域 type master; file "192.168.10.arpa"; };
第2步:编辑数据配置文件(var/named/xxxx)。(文件名在编辑区域配置文件时已经自定义)
从/var/named目录中复制一份正向解析的模板文件(named.localhost),反向解析的模板文件(named.loopback)。然后把域名和IP地址的对应数据填写数据配置文件中并保存。在用cp命令复制时一定要加上-a参数,保留原始文件的所有者、所属组、权限属性等信息,这里的权限至关重要!以便让bind服务程序顺利读取文件内容。
注意域名最后一个“.”,在输入网址时通常为了方便而省略,但在做dns配置时不能省略掉!
cd /var/named/ cp -a named.localhost linuxprobe.com.zone cp -a named.loopback 192.168.10.arpa vim linuxprobe.com.zone #编辑正向解析数据配置文件 $TTL 1D #生存周期为1天 @ IN SOA linuxprobe.com. root.linuxprobe.com. ( #授权信息开始(Start Of Authority) 域名 域名管理员邮箱(邮箱的@符号用.代替) ; serial #更新序列号(该序列号作为slave与master更新的依据,一般利用日期来设定) 1D ; refresh #更新时间(命令slave多久进行一次主动更新) 1H ; retry #重试延时(当到了refresh时间但slave无法连接master时重试连接的时间间隔) 1W ; expire #失效时间(当slave一直无法连接上master,则经过expire的时间后命令) 3H); minimum #无效解析记录的缓存时间(没有指定生存期的数据,可以保存在数据库中的时间和TTL) NS ns.linuxprobe.com. #域名服务器记录(Name Server,NS后面接的一定是主机名称) ns IN A 192.168.10.10 #地址记录(A表示正向解析的标记,格式 [hostname] IN A [IP]) IN MX 10 mail.linuxprobe.com. #邮箱交换记录(MX与Mail Server有关,用途是邮件转发,MX后的数值越小越优先,后面的hostname必须有一条A记录) mail IN A 192.168.10.10 www IN A 192.168.10.10 bbs IN A 192.168.10.20 vim 192.168.10.arpa #编辑反向解析数据配置文件 $TTL 1D @ IN SOA linuxprobe.com. root.linuxprobe.com.( ; serial 1D ; refresh 1H ; retry 1W ; expire 3H); minimum NS ns.linuxprobe.com. ns A 192.168.10.10 PTR ns.linuxprobe.com. #PTR为指针记录,仅用于反向解析(格式: [IP] IN PTR [主机名称]) PTR mail.linuxprobe.com. PTR www.linuxprobe.com. PTR bbs.linuxprobe.com.
第3步:把网卡的DNS地址修改为本机的IP地址,重启网卡服务和named服务,用nslookup命令检验正反向解析结果。
nslookup命令用于检测能否从DNS服务器中查询到域名与IP地址的解析记录,进而更准确地检验DNS服务器是否已经能够为用户提供服务。
vim /etc/sysconfig/network-scripts/ifcfg-eno16777728 #修改网卡参数 ... DNS=192.168.10.10 #把DNS地址改为本机ip地址 ... systemctl restart network #重启网卡服务 systemctl restart named #重启named服务 nslookup >www.linuxprobe.com #显示提供正向解析的服务器为192.168.10.10,解析出IP:192.168.10.10 >bbs.linuxprobe.com #解析出IP:192.168.10.20 >mail.linuxprobe.com #解析出IP:192.168.10.10 >192.168.10.10 #显示提供反向解析的服务器为192.168.10.10,解析出域名:ns/www/mail.linuxprobe.com. >192.168.10.20 #解析出域名:bbs.linuxprobe.com.
部署从服务器
在DNS域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件,从而起到备份解析记录与负载均衡的作用,因此通过部署从服务器可以减轻主服务器的负载压力,还可以提升用户的查询效率。
主服务器192.168.10.10
从服务器192.168.10.20
主服务器192.168.10.10的更改:
1.更改主服务器的区域配置文件,使其允许指定从服务器的更新请求,然后重启DNS服务程序;
2.如果从服务器配置好,且重启DNS服务很多次,但依然无法从主服务器同步数据配置文件,则清空主服务器的iptables防火墙。
vim /etc/named.rfc1912.zones #更改主服务器的区域配置文件,使其允许指定从服务器的更新请求 zone "linuxprobe.com" IN { type master; file "linuxprobe.com.zone"; allow-update { 192.168.10.20; }; #允许来自192.168.10.20的更新请求 }; zone "10.168.192.in-addr.arpa" IN { type master; file "192.168.10.arpa"; allow-update { 192.168.10.20; }; }; systemctl restart named #重启named服务 iptables -F #清空iptables防火墙 service iptables save
从服务器的更改:
1.安装bind服务程序;
2.编辑主配置文件,使得服务器上的所有IP地址均可提供DNS域名解析服务,以及允许所有人对本服务器发送DNS查询请求;
3.编辑区域配置文件,填写主服务器的IP地址与要抓取的区域信息;
4.修改网卡DNS为本机IP,重启网卡服务和DNS服务。
yum install -y bind-chroot vim /etc/named.conf ... listen-on port 53 { any; }; ... allow-query { any; }; ... vim /etc/named.rfc1912.zones #编辑区域配置文件 zone "linuxprobe.com" IN { type slave; #从服务器类型为slave masters { 192.168.10.10; }; #指明主服务器ip地址 file "slaves/linuxprobe.com.zone"; #指定同步过来的数据配置文件的存放位置 }; zone "10.168.192.in-addr.arpa" IN { type slave; masters { 192.168.10.10; }; file "slaves/192.168.10.arpa"; }; vim /etc/sysconfig/network-scripts/ifcfg-eno16777728 #修改网卡DNS参数 ... DNS=192.168.10.20 ... systemctl restart network #重启网卡服务 systemctl restart named #重启named服务 cd /var/named/slaves #进入同步数据配置文件的存放位置/var/named/slaves ls #看到有对应的数据配置文件(内容经过加密),说明同步成功 nslookup #检验提供DNS解析服务的是不是本机自身 >192.168.10.10 >www.linuxprobe.com #显示由192.168.10.20提供DNS解析,解析出对应IP为192.168.10.10
安全的加密传输
互联网中的绝大多数DNS服务器(超过95%)都是基于BIND域名解析服务搭建的,而bind服务程序为了提供安全的解析服务,已经对TSIG(RFC 2845)加密机制提供了支持。TSIG主要是利用了密码编码的方式来保护区域信息的传输(Zone Transfer),即TSIG加密机制保证了DNS服务器之间传输域名区域信息的安全性。
主服务器192.168.10.10
从服务器192.168.10.20
dnssec-keygen命令用于生成安全的DNS服务密钥,其格式为“dnssec-keygen [参数]”
dnssec-keygen命令的常用参数
参数 | 作用 |
---|---|
-a | 指定加密算法,包括RSAMD5(RSA)、RSASHA1、DSA、NSEC3RSASHA1、NSEC3DSA等 |
-b | 密钥长度(HMAC-MD5的密钥长度在1~512位之间) |
-n | 密钥的类型(HOST表示与主机相关) |
主服务器的工作:
1.生成DNS服务密钥(公钥+私钥),查看生成的私钥文件,复制key参数值;
2.进入bind服务程序用于保存配置文件的目录/var/named/chroot/etc/,创建密钥验证文件tansfer.key。把该文件做一个硬链接到/etc目录中。为安全起见,把文件所属组改为named,降低文件权限。
3.开启并加载Bind服务的密钥验证功能。先在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有master-slave密钥认证的DNS服务器同步数据配置文件,重启named服务。
dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave #生成一个主机名称为master-slave的128位HMAC-MD5算法的密钥文件(公钥+私钥) ls -al Kmaster-slave.+157+46845.* #运用通配符查看生成的密钥文件,会有一个私钥文件(后缀为private)和公钥文件(后缀为key) cat Kmaster-slave.+157+46845.private #查看私钥文件,复制当中的key参数值 ... Key: 1XEEL3tG5DNLOw+1WHfE3Q== ... cd /var/named/chroot/etc/ #进入bind服务程序用于保存配置文件的目录 vim transfer.key #创建密钥验证文件 key "master-slave" { #密钥名称 algorithm hmac-md5; #加密算法 secret "1XEEL3tG5DNLOw+1WHfE3Q=="; #私钥加密字符串 }; chown root:named transfer.key #把文件所属组改为named chmod 640 transfer.key #降低文件权限 ln transfer.key /etc/transfer.key #创建一个密钥验证文件的硬链接到/etc目录(配置主配置文件时需要,密钥验证文件必须在/etc目录) vim /etc/named.conf #编辑bind服务主配置文件,开启并加载Bind服务的密钥验证功能 ... include "/etc/transfer.key"; #密钥验证文件必须在/etc目录 allow-transfer { key master-slave; }; #只允许拥有该密钥验证文件的人进行同步 ... systemctl restart named #重启bind服务程序
清空从服务器/var/named/slaves目录中从主服务器同步过来的数据配置文件,然后重启bind服务,发现已经无法再从主服务器获取到数据配置文件了。
rm -rf /var/named/slaves/* #清空目录下所有数据配置文件 systemctl restart named #重启bind服务 ls /var/named/slaves #再查看slaves目录,发现依然为空,此时从服务器无法再从主服务器中获取数据配置文件
从服务器要做的工作:
1.在bind服务程序的配置文件目录中创建密钥认证文件(步骤和参数跟主服务器中的设置一样),并设置相应的权限,然后把该文件做一个硬链接到/etc目录中;
2.开启并加载从服务器的密钥验证功能(与主服务器中的设置稍有不同)。在主配置文件中加载密钥认证文件,然后按照指定格式写上主服务器的IP地址和密钥名称,重启bind服务。
cd /var/named/chroot/etc #进入bind服务程序的配置文件目录 vim transfer.key #创建密钥认证文件(参数和主服务器的密钥验证文件一样) key "master-slave" { algorithm hmac-md5; secret "1XEEL3tG5DNLOw+1WHfE3Q=="; }; chown root:named transfer.key chmod 640 transfer.key ln transfer.key /etc/transfer.key #创建密钥验证文件的硬链接 vim /etc/named.conf ... include "/etc/transfer.key"; ... server 192.168.10.10 #指明主服务器的IP地址和密钥名称 { keys { master-slave; }; }; ... systemctl restart named ls /var/named/slaves/ #重启bind服务后,查看slaves目录,又能从主服务器同步到数据配置文件
部署缓存服务器
DNS缓存服务器(Caching DNS Server)是一种不负责域名数据维护的DNS服务器。简单来说,缓存服务器就是把用户经常使用到的域名与IP地址的解析记录保存在主机本地,从而提升下次解析的效率。DNS缓存服务器一般用于经常访问某些固定站点而且对这些网站的访问速度有较高要求的企业内网中,但实际的应用并不广泛。而且,缓存服务器是否可以成功解析还与指定的上级DNS服务器的允许策略有关,因此当前仅需了解即可。
此实验很简单,配置不会有错,但为什么客户机不能解析dns,很大原因可能出在上级DNS服务器不允许同步DNS信息。上级DNS服务器地址指的是获取数据配置文件的服务器。
缓存服务器准备两张网卡,一张桥接(能上外网),一张仅主机模式(只能主机间通信),客户机只有一张仅主机模式网卡。只要客户机能解析外网的DNS,就说明一定是由缓存服务器提供域名解析服务的。
缓存服务器需要做的:配置bind服务程序的主配置文件,添加缓存转发参数,重启bind服务。
vim /etc/named.conf ... 17 forwarders { 8.8.8.8; }; #上级DNS服务器地址最好ping测试下,ping通再用 ... systemctl restart named #重启bind服务
客户机需要做的:修改网卡参数,把DNS地址改为缓存服务器的IP,重启网卡。
vim /etc/sysconfig/network-scripts/ifcfg-eno16777728 ... DNS=192.168.10.10 ... systemctl restart network
客户机用nslookup测试外网网站,检验DNS能否被解析。
分离解析技术
为了满足海内外用户的需求,可以购买多台服务器并分别部署在全球各地,然后再使用DNS服务的分离解析功能,即可让位于不同地理范围内的读者通过访问相同的网址,而从不同的服务器获取到相同的数据。
不同主机的操作系统与IP地址情况
主机名称 | 操作系统 | IP地址 |
---|---|---|
DNS服务器 | RHEL 7 | 北京网络:122.71.115.10/ 美国网络:106.185.25.10 |
北京用户 | Windows 7 | 122.71.115.1 |
海外用户 | Windows 7 | 106.185.25.1 |
DNS分离解析技术
DNS服务器的工作:
1.配2块仅主机模式网卡,地址分别为122.71.115.10(北京)和106.185.25.10(美国);
2.配置bind服务的主配置文件。删除51-54行的根域信息(DNS分离解析功能和DNS根服务器配置参数有冲突);
3.编辑区域配置文件;
4.建立数据配置文件(正向解析),重启bind服务;
vim /etc/named.conf #配置bind服务的主配置文件 ... listen-on port 53 { any; }; ... allow-query { any; }; ... # zone "." IN { #注释等同删除,删除根域信息 # type hint; # file "named.ca"; # }; vim /etc/named.rfc1912.zones #编辑区域配置文件 acl "china" { 122.71.115.0/24; }; #使用acl参数分别定义两个变量名称(china与american),后续参数china=122.71.115.0/24 acl "american" { 106.185.25.0/24; }; view "china"{ #通过判断用户的IP地址属于哪个网段,然后去分别加载不同的数据配置文件(linuxprobe.com.china或linuxprobe.com.american) match-clients { "china"; }; zone "linuxprobe.com" { #常规的zone参数定义 type master; file "linuxprobe.com.china"; }; }; view "american" { match-clients { "american"; }; zone "linuxprobe.com" { type master; file "linuxprobe.com.american"; }; }; cd /var/named #进入存放数据配置文件的目录 cp -a named.localhost linuxprobe.com.china #复制两份正向解析的模板 cp -a named.localhost linuxprobe.com.american vim linuxprobe.com.china $TTL 1D @ IN SOA linuxprobe.com. root.linuxprobe.com. ( ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ;) minimum NS ns.linuxprobe.com. ns IN A 122.71.115.10 www IN A 122.71.115.15 vim linuxprobe.com.american $TTL 1D @ IN SOA linuxprobe.com. root.linuxprobe.com. ( ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ;) minimum NS ns.linuxprobe.com. ns IN A 106.185.25.10 www IN A 106.185.25.15 systemctl restart named #重启bind付务
客户机工作:
分别设置网卡地址为122.71.115.1(北京)和106.185.25.1(美国),将DNS地址分别设置为服务器主机的两个IP地址:122.71.115.10(北京)和106.185.25.10(美国),nslookup测试。
- 使用Bind提供域名解析服务2部署缓存服务器
- 学习Linux第16节课--使用Bind提供解析服务
- 使用Bind提供域名解析服务
- 使用Bind提供域名解析服务
- 使用Bind提供域名解析服务
- 第13章 使用Bind提供域名解析服务
- 第12天 使用Bind提供域名解析服务
- Linux就该这么学—Nineteen 使用iSCSI服务部署网络存储
- linux 域名解析服务基本使用
- 运维小白之Bind提供域名解析服务
- BIND提供域名解析服务
- Linux就该这么学—Seventeen 使用Squid部署代理缓存服务
- 使用bind自建DNS服务,实现双DNS服务器主从复制、子域授权、转发、智能解析等效果
- linux安装redis并使用其提供的初始化启动脚本加入到系统服务中
- Linux下为不使用SSH的用户提供SFTP服务环境
- 云服务器 ECS Linux 系统下使用 dig 命令查询域名解析
- 【转】在windows 2000中使用Bind实现域名服务
- Linux就该这么学—Sixteen 使用Postfix与Dovecot部署邮件系统
- Linux就该这么学--计划任务服务
- 使用boost解析域名服务