[RHEL]-20-使用bind服务实现域名解析
引言
这篇文章将实例演示如何使用bind来配置DNS域名解析服务。
文章目录
- 0×1.DNS解析服务介绍
- 0×2.DNS主服务器正反向解析配置实例
- 0×3.DNS从服务器配置实例
- 0×4.DNS主从服务器间实现加密通信
- 0×5.DNS缓存服务器配置
- 0×6.配置DNS分离解析
- 0×7.配置DNS转发
0×1.DNS解析服务介绍
DNS(Domain Name System)是互联网上的一个基础服务,其功能上可以实现"正向解析"与"反向解析","正向解析"实现从主机域名到IP地址的解析查询,而"反向解析"实现从IP到主机域名的查询。
DNS协议采用了树型数据结构,由上往下形成了一个分布式的数据库系统,全球共有13台根服务器,往下再细分成每个国家,每个国家的不同地区,每个地区的不同互联网接入商等等。
在实际的DNS查询过程中,很少会触及根服务器,而是在网络供应商提供的DNS服务器的数据库中就能够查到DNS记录,客户机在发起一个DNS查询时,查询步骤如下,由上往下只要查找到就返回不再往下查找:
1.查询本地HOSTS文件;
2.查询本地缓存;
3.查询本地指定的互联网DNS服务器(大多数为接入商提供的DNS);
4.检查DNS服务器缓存;
5.向其他指定的DNS服务器发起迭代查询;
6.查询根域;
7.根据根域的返回信息,查询子域;
大多数的查询都会在第5步中被找到,而无需请求根服务器。
BIND全名叫做Berkeley Internet Name Daemon(伯克利互联网域名服务)最早出现在伯克利大学,而如今是互联网中使用最广泛的域名解析服务程序,如何在RHEL7中安装bind:
[root@qingsword.com ~]# yum install -y bind-chroot #安装完成后,主要的三个文件地址如下 # 主程序 /usr/sbin/named # 主配置文件 /etc/named.conf # 区域配置文件 /etc/named.rfc1912.zones
0×2.DNS主服务器正反向解析配置实例
实验环境:
RHEL7,安装了bind-chroot程序,IP 192.168.1.233/24;
客户端CentOS7,IP 192.168.1.23/24 DNS服务器设置成192.168.1.233;
两者处于同一局域网,且能够互相ping通;
1)首先设置服务端iptables
#可以添加允许DNS规则,或直接清空保存,本例选择直接清空iptables [root@qingsword.com ~]# iptables -F [root@qingsword.com ~]# service iptables save
2)修改服务端bind主配置文件
#使用vim编辑bind主配置文件 [root@qingsword.com ~]# vim /etc/named.conf #其他的地方不需要修改,主要修改下面any两处 options { #中括号中可以用逗号隔开,设置本机由哪几块网卡接收响应客户端的DNS查询,本例设置为any,即从所有网卡接收客户端的DNS查询 listen-on port 53 { any; }; #如果服务端配置有IPv6地址,则将下面中括号改成any或对应接收DNS查询的网卡IP listen-on-v6 port 53 { ::1; }; #工作目录,这个目录下存放了域名解析记录文件 directory "/var/named"; #DNS缓存转储位置 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"; #将localhost改成any或对应目标地址(网段或单个ip),表示接收任何源地址发起的DNS查询,如果仅指定某个IP(或网段),那么服务器只响应对应IP(或网段)的DNS查询,默认只允许本机查询 allow-query { any; }; #允许递归查询 recursion yes; }; ...省略部分输出.. zone "." IN { type hint; #全球13台根服务器的IP地址保存文件(保存在/var/named/named.ca,大家可以使用vim查看下这个文件) file "named.ca"; }; #named.rfc1912.zones文件中保存着正反向解析的区域信息列表,稍后会编辑到 include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
3)编辑区域信息文件named.rfc1912.zones
[root@qingsword.com ~]# vim /etc/named.rfc1912.zones #在文件的末尾添加下面两条记录 #正向解析 # zone "顶级域名" IN { # type master; 代表这是主服务器 # file "对应域名的解析文件,名称可自定义" # allow-update { none; }; 禁止来自客户端的更新与修改 # }; zone "qingsword.com" IN { type master; file "qingsword.com.zone"; allow-update { none; }; }; #对某个网段的反向解析 # zone "网段ip前三段反写.in-addr.arpa" IN { # type master; # file "对应域名的解析文件,可自定义" # allow-update { none; }; # }; zone "1.168.192.in-addr.arpa" IN { type master; file "192.168.1.arpa"; allow-update { none; }; };
4)创建区域信息文件中解析记录对应的解析文件
#首先将已有的正向解析与反向解析文件复制创建新的解析文件(也可以手动创建,复制会有一个参考格式,比较方便而已,-a参数会连同权限一起复制) [root@qingsword.com ~]# cp -a /var/named/named.localhost /var/named/qingsword.com.zone [root@qingsword.com ~]# cp -a /var/named/named.loopback /var/named/192.168.1.arpa #然后逐个编辑这两个文件(注意,每个域名后面都要带".") [root@qingsword.com ~]# vim /var/named/qingsword.com.zone # $TTL 1D # @ IN SOA 主域名. 邮箱地址(用"."代替@符号). ( # 0 ; serial 更新序列号 # 1D ; refresh 刷新时间,默认每天 # 1H ; retry 重试延时,默认一小时 # 1W ; expire 失效时间,默认一周 # 3H;minimum 无效解析记录缓存时间,默认3小时 # # 域名服务器记录 # NS ns.qingsword.com. # ns IN A 192.168.1.233 # 因为主域是qingsword.com,所以下面这句的意思就是将www.qingsword.com解析到192.168.1.233,这是一条A记录(A记录,即域名到IP的解析记录) # www IN A 192.168.1.233 $TTL 1D @ IN SOA qingsword.com. admin.qingsword.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns.qingsword.com. ns IN A 192.168.1.233 www IN A 192.168.1.233 #如果想让N.qingsword.com(N代表任何字母数字组合)都解析到192.168.1.233可以写一条泛解析如下 * IN A 192.168.1.233 [root@qingsword.com ~]# vim /var/named/192.168.1.arpa #反向解析使用的是PTR记录 $TTL 1D @ IN SOA qingsword.com. admin.qingsword.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns.qingsword.com. ns IN A 192.168.1.233 #反向解析的IP前缀已经在"1.168.192.in-addr.arpa"中定义,所以反向解析只需要写IP地址最后一段,下面的233就表示"192.168.1.233",意思是将这个IP解析成"xxx.qingsword.com",以此类推 233 PTR xxx.qingsword.com. 234 PTR bbs.qingsword.com. 235 PTR blog.qingsword.com.
5)重启named服务
[root@qingsword.com ~]# systemctl restart named #若有必要,设置成开机启动 [root@qingsword.com ~]# systemctl enable named
6)客户端测试
#客户端上将DNS解析指向192.168.1.233后,使用nslookup测试,配置正确的话,结果应该如下 [root@qingsword.com ~]# nslookup > 192.168.1.233 Server: 192.168.1.233 Address: 192.168.1.233#53 233.1.168.192.in-addr.arpa name = xxx.qingsword.com. > 192.168.1.234 Server: 192.168.1.233 Address: 192.168.1.233#53 234.1.168.192.in-addr.arpa name = bbs.qingsword.com. > 192.168.1.235 Server: 192.168.1.233 Address: 192.168.1.233#53 235.1.168.192.in-addr.arpa name = blog.qingsword.com. > www.qingsword.com Server: 192.168.1.233 Address: 192.168.1.233#53 Name: www.qingsword.com Address: 192.168.1.233 #因为添加了泛解析,所以 > abcde.qingsword.com Server: 192.168.1.233 Address: 192.168.1.233#53 Name: abcde.qingsword.com Address: 192.168.1.233
0×3.DNS从服务器配置实例
我们上面配置的服务器就像是一台地区根服务器,保存了所有主要的DNS信息,但一个地区少则几万人,多则几千万,不可能让所有人都直接在根服务器上查询信息,那样根服务器早就宕机了,科学的做法是,配制出一定数量的从服务器,让从服务器缓存根服务器的DNS数据,客户端可以直接在从服务器上得到对应的DNS信息,接着上面的实验,将CentOS7那台原本的客户机配成从服务器,并且再开启一台Ubuntu客户机,DNS指向从服务器的IP地址,测试客户机能否查询到正确的DNS信息。
1)从服务器上也需要安装bind-chroot
[root@qingsword.com ~]# yum -y install bind-chroot
2)修改主配置文件(两处any,其他配置不变)
[root@qingsword.com ~]# vim /etc/named.conf options { listen-on port 53 { any; }; ..省略部分输出.. allow-query { any; };
3)修改从服务器named.rfc1912.zones文件,添加从属关系记录
[root@qingsword.com ~]# vim /etc/named.rfc1912.zones #添加要从主服务器上获取哪些记录 #要缓存的正向解析条目 zone "qingsword.com" IN { #服务类型为从服务 type slave; #named服务重新启动后,会自动去主服务器获取对应条目的解析文件下载到本地的/var/named/slaves目录中,file后面指定的文件名要和主服务器下载下来的文件一致 file "slaves/qingsword.com.zone"; #指定主服务器的IP地址,可以用逗号隔开多个主服务器IP地址 masters { 192.168.1.233; }; }; #要缓存的反向解析条目 zone "1.168.192.in-addr.arpa" IN { type slave; file "slaves/192.168.1.arpa"; masters { 192.168.1.233; }; };
4)重启从服务器的named服务
[root@qingsword.com ~]# systemctl restart named #重启后,就能够在slaves文件夹下看到从主服务器获取到的解析记录了 [root@qingsword.com ~]# ls /var/named/slaves/ 192.168.1.arpa qingsword.com.zone
5)清空iptables列表
[root@qingsword.com ~]# iptables -F
现在,使用ubuntu客户端网卡配置DNS指向从服务器的IP地址(192.168.1.23),配置无误的话,就能够顺利的在从服务器上查询到DNS信息了。
0×4.DNS主从服务器间实现加密通信
在实际应用中bind主从服务器之间一般都采用了一种叫做TSIG(TSIGRFC 2845)的加密机制,在主服务器上生成一个密码文件,然后将这个文件传送给信任的从服务器,通过修改bind服务的配置文件实现主从服务器间DNS信息的加密通信,接着上面的实验。
1)首先在主服务器上生成密钥文件
#使用dnssec-keygen命令生成密钥 # -b 密钥长度,HMAC-MD5长度在1-512位之间 # -a 加密算法 # -n 密钥类型,HOST主机相关类型 # qingsword-key 密钥的名称 # 记录下密钥名称与加密算法,稍后要用到 [root@qingsword.com ~]# dnssec-keygen -b 128 -a HMAC-MD5 -n HOST qingsword-key Kqingsword-key.+157+08912 #在当前目录中会生成两个文件,一个为公钥,一个为私钥 [root@qingsword.com ~]# ls *qingsword-key* Kqingsword-key.+157+08912.key Kqingsword-key.+157+08912.private #查看私钥信息,记录下Key后面的值,稍后要用到 [root@qingsword.com ~]# more Kqingsword-key.+157+08912.private Private-key-format: v1.3 Algorithm: 157 (HMAC_MD5) Key: Dh5rTKdRAy5bjzuZw7Seaw==
2)在主服务器上创建密钥验证文件
#在/var/named/chroot/etc/目录下创建一个新文件,名称可自定义 [root@qingsword.com ~]# vim /var/named/chroot/etc/qingsword.key #在文件中输入下面的内容 # 第一行为密钥名称 # 第二行为加密类型 # 第三行为密钥 #这三行是在上面创建密钥文件时我们记录的那些值 key "qingsword-key" { algorithm hmac-md5; secret "Dh5rTKdRAy5bjzuZw7Seaw=="; }; #修改密钥文件的权限与属组,让named服务能访问此文件 [root@qingsword.com ~]# chown root:named /var/named/chroot/etc/qingsword.key [root@qingsword.com ~]# chmod 640 /var/named/chroot/etc/qingsword.key #为了调用方便,做一个硬链接到/etc目录下 [root@qingsword.com ~]# ln /var/named/chroot/etc/qingsword.key /etc/qingsword.key [root@qingsword.com ~]# ls -l /etc/qingsword.key -rw-r-----. 2 root named 80 Dec 6 21:21 /etc/qingsword.key
3)在主配置文件中开启主服务器的密钥验证功能
[root@qingsword.com ~]# vim /etc/named.conf #在主配置文件中添加一条include信息,指向第2步中创建的密钥验证文件,并且在options区块内部添加一条allow-transfer { key 密钥名称 }; include "/etc/qingsword.key"; options { isten-on port 53 { any; }; ...省略部分输出.. allow-query { any; }; allow-transfer { key qingsword-key; };
4)主服务器重启named服务,并在从服务器上测试
#主服务器重启named服务 [root@qingsword.com ~]# systemctl restart named #切换到从服务器,删除未加密前从主服务器获得的DNS信息 [root@qingsword.com ~]# ls /var/named/slaves/ 192.168.1.arpa qingsword.com.zone [root@qingsword.com ~]# rm -rf /var/named/slaves/* #重启从服务器named服务,此时无法从主服务器获得DNS信息了,因为从服务器还未配置与主服务器相同的密钥文件,主服务器会自动阻止从服务器的请求 [root@qingsword.com ~]# systemctl restart named #再次查看slaves文件夹,看不到任何DNS信息 [root@qingsword.com ~]# ls /var/named/slaves/
5)将密钥文件从主服务器传输到从服务器上(或在从服务器上手动创建一个)
#在主服务器上使用scp,将密钥文件传输给从服务器 [root@qingsword.com ~]# scp /etc/qingsword.key 192.168.1.23:/var/named/chroot/etc/ #在从服务器上给这个传输过来的文件设置权限并建立硬连接 [root@qingsword.com ~]# chmod 640 /var/named/chroot/etc/qingsword.key [root@qingsword.com ~]# chown root:named /var/named/chroot/etc/qingsword.key [root@qingsword.com ~]# ln /var/named/chroot/etc/qingsword.key /etc/qingsword.key [root@qingsword.com ~]# ls -l /etc/qingsword.key -rw-r-----. 2 root named 80 12月 7 10:52 /etc/qingsword.key
6)修改从服务器named主配置文件,添加支持密钥验证
[root@qingsword.com ~]# vim /etc/named.conf #在options区块后,logging区块前添加一段,include指向/etc中的配置文件名称,server后面是主服务器的IP,keys后是密钥名称 options{ ..options区块.. }; include "/etc/qingsword.key"; server 192.168.1.233{ keys { qingsword-key; }; }; logging { ..logging区块.. };
7)重启从服务器的named服务,测试配置是否成功
[root@qingsword.com ~]# systemctl restart named #现在又能顺利的从主服务器上获取DNS信息了,而且这些信息都是加密传输的 [root@qingsword.com ~]# ls /var/named/slaves/ 192.168.1.arpa qingsword.com.zone
0×5.DNS缓存服务器配置
缓存服务器的配置十分简单,在实际环境中应用也比较少,实验环境如下:
RHEL7服务端,安装了bind,相当于企业内部的DNS缓存服务器,安装了两块网卡,一块网卡对外(IP 192.168.1.233/24),一块网卡对内(IP 192.168.100.233/24);
内网客户端CentOS7,IP 192.168.100.23/24,配置其DNS指向192.168.100.233;
在服务端安装好bind,修改主配置文件
[root@qingsword.com ~]# vim /etc/named.conf #将options区块的监听和接收ip改成any后,另添加一条forwarders规则,指向DNS服务器的地址(本例使用国内的114域名解析),添加这条规则后,这台服务器就可以作为DNS缓存服务器来使用了,无需修改其他配置 options { listen-on port 53 { any; }; ..省略部分输出.. allow-query { any; }; forwarders { 114.114.114.114; }; #重启named服务 [root@qingsword Desktop]# systemctl restart named #清空iptables规则并保存(也可以将相应规则添加到其中并允许) [root@qingsword Desktop]# iptables -F [root@qingsword Desktop]# service iptables save
将客户端的网络配置中的DNS地址修改成服务端对内的IP地址即可,此时客户端发起的所有DNS查询,都会发往服务端,再由服务端访问114,收到114的返回信息后,将信息缓存到本地,再将请求的DNS结果发回客户端,客户端再次查询相同的DNS信息时会非常的快,服务端会查询缓存,然后直接将DNS信息发给客户端,而不需要再次像114请求,从而节约了时间。
0×6.配置DNS分离解析
分离解析技术有点类似我们所使用的CDN,在不同的地区使用不同的IP查询同一个域名的DNS信息时,会返回不同的结果,实验环境如下:
服务端RHEL7,安装了bind,在同一块网卡上添加了两个IP(192.168.1.233/24,192.168.100.233/24)来模拟不同的地区来源;
客户端CentOS7,先将IP设置成(192.168.1.0/24)网段,稍后更改成(192.168.100.0/24)来模拟不同的请求来源;
1)配置服务端,修改主配置文件
#只需要修改两个any,然后删除根域区块 [root@qingsword.com ~]# vim /etc/named.conf options { listen-on port 53 { any; }; ..省略部分输出.. allow-query { any; }; #删除下面这段根域区块 zone "." IN { type hint; file "named.ca"; };
2)修改named.rfc1912.zones文件
[root@qingsword.com ~]# vim /etc/named.rfc1912.zones #在文件的末尾添加下面的内容 #定义不同区域的IP段 acl "Earth" { 192.168.1.0/24; }; acl "Mars" { 192.168.100.0/24; }; #针对不同区域设置对应的解析文件 view "Earth" { match-clients { "Earth"; }; zone "qingsword.com" { type master; file "qingsword.com.Earth"; }; }; view "Mars" { match-clients { "Mars"; }; zone "qingsword.com" { type master; file "qingsword.com.Mars"; }; };
3)创建解析文件
#使用localhost的模板文件复制两份,保存其属性 [root@qingsword.com ~]# cp -a /var/named/named.localhost /var/named/qingsword.com.Earth [root@qingsword.com ~]# cp -a /var/named/named.localhost /var/named/qingsword.com.Mars #分别编辑这两个文件 [root@qingsword.com ~]# vim /var/named/qingsword.com.Earth $TTL 1D @ IN SOA qingsword.com. admin.qingsword.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns.qingsword.com. ns IN A 192.168.1.233 www IN A 192.168.1.233 [root@qingsword.com ~]# vim /var/named/qingsword.com.Mars $TTL 1D @ IN SOA qingsword.com. admin.qingsword.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns.qingsword.com. ns IN A 192.168.100.233 www IN A 192.168.100.233
4)配置完成后,重启named服务
[root@qingsword.com ~]# systemctl restart named #清空iptables [root@qingsword.com ~]# iptables -F
5)在客户端配置两个IP,模拟不同的地区分别测试
#使用nmcli添加两个网卡配置,分别模拟Earth与Mars地区 [root@qingsword ~]# nmcli connection add con-name Earth ifname eno16777736 type ethernet autoconnect no ip4 192.168.1.23/24 gw4 192.168.1.1 [root@qingsword ~]# nmcli connection add con-name Mars ifname eno16777736 type ethernet autoconnect no ip4 192.168.100.23/24 gw4 192.168.100.1 [root@qingsword ~]# nmcli connection modify Earth ipv4.dns "192.168.1.233" [root@qingsword ~]# nmcli connection modify Mars ipv4.dns "192.168.100.233" #切换网卡配置,使用nslookup查看地址解析,不同的源IP解析的地址IP也不相同,这就是分离解析 [root@qingsword ~]# nmcli connection up Earth [root@qingsword ~]# nslookup > www.qingsword.com Server: 192.168.1.233 Address: 192.168.1.233#53 Name: www.qingsword.com Address: 192.168.1.233 [root@qingsword ~]# nmcli connection up Mars [root@qingsword ~]# nslookup > www.qingsword.com Server: 192.168.100.233 Address: 192.168.100.233#53 Name: www.qingsword.com Address: 192.168.100.233
0×7.配置DNS转发
在工作中可能遇到这种情况,我们内网DNS服务器配置了内部解析的域名IP,但没有公网的域名解析服务,如果一台主机DNS设置成我们自己的DNS服务器,就只能解析我们配置好的域名,想要让这台主机能够通过我们自己的DNS服务器去解析外网域名,可以使用转发功能,指定上层DNS服务器,请看下面的实例:
#编辑主配置文件,在options段中,任意位置插入两行数据 [root@qingsword.com ~]# vim /etc/named.conf options { #..省略部分输出.. forward first; #括号中填写公网DNS服务器地址 forwarders { 8.8.8.8; }; #..省略部分输出.. } #配置完成后重启DNS服务,主机就能通过我们的DNS查询公网域名了