五、搭建DNS服务器#
5.1、Bind#
Bind是一款开源的DNS软件,全称:Berkeley Internet Name Domain 由美国加州大学伯克利分享开发、维护。
支持unix、window。BIND现在由互联网系统协会(Internet Systems Consortium)负责开发和维护。
那下文主要就是记录如何使用Bind软件搭建DNS服务以及搭建主从DNS服务。软件人家已经写好了,对使用者来说都很友好,只要改一改配置文件然后启动就OK(重点是理解那些参数都是啥意思)。
DNS域名解析会使用:udp/53
主从DNS服务之间的数据传输使用:tcp/53
其实如果你没有自建dns域名解析服务的需求,看到这里就可以结束了。如果以后可能会有这个记得收藏。
5.2、系统环境准备#
- 调整yum源
yum install epel-release -y
- 关闭SELinux、firewalld
# 临时关闭SELinux setenforce 0 # 永久关闭SElinux vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled #增加 # 重启 # 关闭防火墙,注意一定要关闭防火墙 # 不然后面使用bind9自建dns时其他的服务器无法和自建的dns服务器通信~ # 不然etcd集群也没法搭建起来~ systemctl stop firewalld # 为了不在重启后再去手动的关闭防火墙,所以直接将其禁用掉~ systemctl enable firewalld
- 安装必要的工具
yum install wget net-tools telnet tree nmap sysstat dos2unix bind-utils -y
5.3、安装#
在hdss7-11上执行命令:
yum install bind -y
检测bind版本
rpm -qa bind
查看bind都有哪些文件
rpm -ql bind
了解配置文件
man 5 xxx.conf
5.4、查看bind的相关文件#
通过如下命令可以找到Bind的主配置文件named.conf
的位置
# 软件名叫bind,但是bin文件进程名称叫named [root@localhost ~]# rpm -ql bind | grep etc /etc/logrotate.d/named # 日志轮转的配置 /etc/named /etc/named.conf # 主配置文件 /etc/named.iscdlv.key /etc/named.rfc1912.zones # zone文件,用于定义域 /etc/named.root.key /etc/rndc.conf /etc/rndc.key /etc/rwtab.d/named
查看程序常用bin文件位置
[root@localhost ~]# rpm -ql bind | grep sbin /usr/sbin/named # 程序启动文件 /usr/sbin/named-checkconf # 检查配置文件语法(named.conf、named.rfc1912.zones) /usr/sbin/named-checkzone # 检查区域文件语法的命令
查看服务的日志文件位置
[root@localhost ~]# rpm -ql bind | grep named.log /var/log/named.log
其他动态文件的位置
[root@localhost ~]# rpm -ql bind | grep var /var/log/named.log # 日志文件 /var/named /var/named/data /var/named/dynamic /var/named/named.ca # 根域名服务器配置(所有DNS服务器都知道根域名服务器在哪里) /var/named/named.empty /var/named/named.localhost # 正向解析区域文件的模版 /var/named/named.loopback # 反向解析区域文件的模版 /var/named/slaves # 从DNS服务器的下载文件的默认路径
5.5、查看bind的主配置文件#
[root@localhost ~]# cat /etc/named.conf options { /* 监听方式,服务监听指定ip的53号端口 服务器可能有多张网卡,any表示所有网卡监听53端口的DNS解析请求 todo 可以个实验:1、ip指定为本机ip。2、ip指定为同网段随便的ip */ listen-on port 53 { 127.0.0.1; any;}; /**/ /*数据文件目录*/ 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"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; /* 允许哪些client来查询dns服务,默认是localhost。 any表示所有人都能进行dns查询 */ allow-query { localhost;any; }; /*是否递归*/ recursion yes; /*DNS安全扩展机制,默认开启,直接关闭即可*/ dnssec-enable no; dnssec-validation no; /* Path to ISC DLV key */ bindkeys-file "/etc/named.root.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; /*之所以全部DNS服务器都知道根域名服务器的位置,就是下面的配置在生效*/ zone "." IN { type hint; file "named.ca"; }; /*子配置文件*/ include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
修改完主配置文件后使用如下命令检验是否改错了
[root@localhost ~]# named-checkconf
5.6、查看域配置文件 - named.rfc1912.zones#
[root@localhost ~]# cat /etc/named.rfc1912.zones // 正向模版,从域名=>ip地址 // localhost.localdomain 为域名 // named.localhost为该域对应的配置文件,它位于/var/named/ // allow-update表示是否允许slave更新master的区域文件 zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; }; }; // 反向模版,从ip地址=>域名 // 1.0.0.127 看着怪怪的,其实他是ip地址反过来写了。而且也要求反过来写 zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; };
5.7、查看某个具体的域的配置文件#
[root@localhost ~]# ll /var/named/ 总用量 16 drwxrwx--- 2 named named 6 4月 29 22:05 data drwxrwx--- 2 named named 6 4月 29 22:05 dynamic -rw-r----- 1 root named 2253 4月 5 2018 named.ca -rw-r----- 1 root named 152 12月 15 2009 named.empty -rw-r----- 1 root named 152 6月 21 2007 named.localhost -rw-r----- 1 root named 168 12月 15 2009 named.loopback drwxrwx--- 2 named named 6 4月 29 22:05 slaves
看一个正向解析的域的配置文件named.localhost
[root@localhost ~]# cat /var/named/named.localhost $TTL 1D # 缓存的生命周期,默认1D表示1天 @ IN SOA @ rname.invalid. ( # ()中是slave相关配置 0 ; serial # 更新序列号,当这个文件有变动时,需要将这个序列号+1,然后slave会向master同步数据 1D ; refresh # slave从master中同步最新数据的时间间隔 1H ; retry # slave从master中下载数据失败之后,隔多久的时间再重试 1W ; expire # slave中区域文件的过期时间,w是周 3H ) ; minimum # salve上缓存的最小有效时间 NS @ A 127.0.0.1 AAAA ::1 # @:表示当前域,也就是 named.rfc1912.zones 中的zone的名称 # IN:表示Internet,互联网 # SOA:表示开始授权 # rname.invalid. 是邮箱地址,因为@符号有特殊含义,所以这里的邮箱使用.分隔 # NS: 全称NameServer 表示DNS服务器 # A:正向的Ipv4解析 # AAAA:IPv6
看一个反向解析的域的配置文件named.loopback
[root@localhost ~]# cat /var/named/named.loopback $TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1 PTR localhost. # 大部分参数和第一个文件相同 # PTR表示反向解析
5.8、实验前提前抛出一个问题#
可以通过下面的方式配置网卡的dns服务器的地址
[root@localhost named]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=none DEFROUTE=yes NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=10.4.7.7 NETMASK=255.255.255.0 GATEWAY=10.4.7.2 DNS1=10.4.7.2
比如网卡配置文件中指定的dns服务器地址是:10.4.7.2
另外系统上还运行着NetworkManager
进程,它的作用之一将DHCP中获取的DNS信息写入/etc/resolv.conf
[root@localhost named]# ps -elf | grep NetworkManager 4 S root 6172 1 0 80 0 - 137970 poll_s 08:18 ? 00:00:00 /usr/sbin/NetworkManager --no-daemon 0 S root 7237 7080 0 80 0 - 28181 pipe_w 09:00 pts/0 00:00:00 grep --color=auto NetworkManager
也就是将我们设置的dns服务器地址,更新进下面的文件
[root@localhost named]# cat /etc/resolv.conf nameserver 10.4.7.2
那么问题来了:
我们本机的ip是10.4.7.7
,然后我们在本机自建的dns服务时又需要指定dns服务的ip地址,那既然本机就是dns服务器,那指定的dns服务的地址肯定是本机的ip地址10.4.7.7
,那这和NetworkManager更新入/etc/resolv.conf
的ip地址是不同的。
而且通过nslookup ${域名}
进行域名解析时,它会去使用/etc/resolv.conf
里面的dns去解析域名,而不是我们自己在本机搭建的dns服务。
如果你非想用nsloopup
验证我们自己的dns服务是否正常,可以使用如下命令
[root@localhost named]# echo nameserver 10.4.7.7 > /etc/resolv.conf
5.9、实验:搭建DNS正向解析服务#
实验目的:实现将www.meng.com
解析成192.168.1.2
1、修改/etc/named.conf
中的监听方式为全网监听、允许所有人访问dns服务、关闭安全验证机制
2、修改子配置文件/etc/named.rfc1912.zones
添加meng.com
域。注意这个meng.com
域也会往下分层,比如:www.meng.com
、wiki.meng.com
、family.meng.com
[root@localhost etc]# vi /etc/named.rfc1912.zones // 添加如下配置 zone "meng.com" IN { type master; file "named.meng.zone"; allow-update { none; }; };
3、创建named.meng.zone
配置文件,meng.com
域分层的详细逻辑就在这个named.meng.zone
配置文件中定义。
[root@localhost etc]# rpm -ql bind | grep named.localhost /usr/share/doc/bind-9.11.4/sample/var/named/named.localhost /var/named/named.localhost [root@localhost etc]# cp /var/named/named.localhost /var/named/named.meng.zone # 注意将named.meng.zone文件的所属组改成named # 否则会以为named无法使用root文件而导致DNS服务不能解析meng.zone域 [root@localhost named]# chown -R root:named named.meng.zone [root@localhost etc]# vi /var/named/named.meng.zone # 按需修改配置文件 $TTL 1D @ IN SOA meng.com. rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum # 下面这两行指定了dns服务器的nameServer是meng.com、ip地址是10.4.7.7(它自己) # dns1是自定义的dns服务的名称,叫啥都行 @ NS dns1.meng.com. dns1 A 10.4.7.7 # 在meng.com域中添加一个www主机,A记录表示是一个正向解析。解析结果为192.168.1.2 www A 192.168.1.2
4、检查配置文件
[root@localhost etc]# rpm -ql bind | grep sbin/named /usr/sbin/named /usr/sbin/named-checkconf /usr/sbin/named-checkzone /usr/sbin/named-compilezone /usr/sbin/named-journalprint [root@localhost etc]# named-checkconf named.conf [root@localhost etc]# named-checkconf named.rfc1912.zones [root@localhost named]# named-checkzone named.meng.zone named.meng.zone zone named.meng.zone/IN: loaded serial 0 OK
5、开启服务
[root@localhost named]# rpm -ql bind | grep named /etc/logrotate.d/named /etc/named ... /usr/sbin/named /usr/sbin/named-checkconf [root@localhost sbin]# systemctl start named [root@localhost sbin]# systemctl enable named Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service. [root@localhost sbin]# netstat -luntp | grep 53 tcp 0 0 10.4.7.7:53 0.0.0.0:* LISTEN 25833/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 25833/named tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 25833/named tcp6 0 0 ::1:953 :::* LISTEN 25833/named udp 0 0 10.4.7.7:53 0.0.0.0:* 25833/named udp 0 0 127.0.0.1:53 0.0.0.0:* 25833/named
6、查看或修改本机的dns服务器地址+验证实验效果
[root@localhost named]# echo nameserver 10.4.7.7 > /etc/resolv.conf [root@localhost named]# nslookup www.meng.com Server: 10.4.7.7 Address: 10.4.7.7#53 Name: www.meng.com Address: 192.168.1.2
通过dig命令验证
[root@localhost named]# dig @10.4.7.7 www.meng.com ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> @10.4.7.7 www.meng.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65534 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.meng.com. IN A ;; ANSWER SECTION: www.meng.com. 86400 IN A 192.168.1.2 ;; AUTHORITY SECTION: meng.com. 86400 IN NS dns1.meng.com. ;; ADDITIONAL SECTION: dns1.meng.com. 86400 IN A 10.4.7.7 ;; Query time: 0 msec ;; SERVER: 10.4.7.7#53(10.4.7.7) ;; WHEN: 四 8月 19 08:32:16 CST 2021 ;; MSG SIZE rcvd: 92
通过host命令查看
[root@localhost named]# host www.meng.com www.meng.com has address 192.168.1.2
5.10、实验:搭建DNS反向解析服务#
1、修改/etc/named.conf
中的监听方式为全网监听、允许所有人访问dns服务、关闭安全验证机制
2、修改子配置文件/etc/named.rfc1912.zones
添加meng.com
域反向解析
[root@localhost named]# vi /etc/named.rfc1912.zones zone "1.168.192.in-addr.arpa" IN { type master; file "named.meng.loopback"; allow-update { none; }; };
3、创建、编辑子配置文件named.meng.loopback
[root@localhost named]# cp -p named.loopback named.meng.loopback [root@localhost named]# vi named.meng.loopback $TTL 1D @ IN SOA meng.com. rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum # 下面这两行也可以简写成一行:@ NS dns1.meng.com. # 之所以能简写是因为dns1在正向解析配置中已经定义好了 @ NS dns2.meng.com. dns2 A 10.4.7.7 2 PTR www.meng.com. # 2是1.168.192网段的最后一位,(192.168.1.2)
4、重启服务
[root@localhost named]# systemctl restart named
5、验收
[root@localhost named]# dig -x 192.168.1.2 @10.4.7.7 ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> -x 192.168.1.2 @10.4.7.7 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4572 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;2.1.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 2.1.168.192.in-addr.arpa. 86400 IN PTR www.meng.com. ;; AUTHORITY SECTION: 1.168.192.in-addr.arpa. 86400 IN NS dns2.meng.com. ;; Query time: 0 msec ;; SERVER: 10.4.7.7#53(10.4.7.7) ;; WHEN: 四 8月 19 08:57:51 CST 2021 ;; MSG SIZE rcvd: 98
或者
[root@localhost named]# nslookup 192.168.1.2 2.1.168.192.in-addr.arpa name = www.meng.com. [root@localhost named]# host 192.168.1.2 2.1.168.192.in-addr.arpa domain name pointer www.meng.com.