02实现正向主DNS服务器

实现正向主DNS服务器

  • 正向则表示将域名解析成IP
  • 管理和维护所负责解析的域内解析库的服务器

环境说明

hostname IP service
dns-server 10.0.0.103 bind9

创建区域数据库

  • 每个域名对应一个区域数据库
  • 区域数据库 由众多资源记录(Resource Record, RR)组成
  • 数据库名称没有要求,但为了区分 建议见名知意

查看区域数据库存放位置

# /etc/bind/named.conf
options {
	directory "/var/cache/bind"; # 区域数据库应该存放的位置,centos默认为/var/named
...

创建区域数据库

# CentOS
# 拷贝区域数据库模板文件(也可以直接创建)
[root@DNS ~]# cd /var/named/
[root@DNS named]# cp -a named.localhost xiangzheng.com.zone


# Ubuntu
#创建区域数据库(Ubuntu 以 bind 结尾会有着色功能)
root@dns-server:~# touch /var/cache/bind/xiangzheng.com.zone.bind

更改区域数据库权限

  • 每个Linux发行版的默认权限不一样,最好参考其他区域数据库的默认权限来进行配置,下面以Ubuntu举例
# 查看默认权限
root@dns-server:~# ll /var/cache/bind/
total 28
drwxrwxr-x  4 root bind 4096 Jul  5 16:13 ./
drwxr-xr-x 16 root root 4096 Jul  4 23:52 ../
drwxrwx---  2 root bind 4096 Feb 28  2020 dynamic/
drwxrwx---  2 root bind 4096 Feb 28  2020 dyndb-ldap/
-rw-r--r--  1 bind bind  821 Jul  5 13:54 managed-keys.bind
-rw-r--r--  1 bind bind 3041 Jul  5 13:54 managed-keys.bind.jnl
-rw-r--r--  1 root root  267 Jul  5 16:10 xiangzheng.com.zone.bind


# 修改权限
root@dns-server:~# chown bind.bind /var/cache/bind/xiangzheng.com.zone.bind 

配置基础区域数据库

root@dns-server:~# vim /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103

修改主配置文件

Ubuntu

# 查看子配置文件位置
root@dns-server:~# cat /etc/bind/named.conf
...
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones"; #写到这里



# 将配置写到子配置文件中
root@dns-server:~# vim /etc/bind/named.conf.default-zones
// prime the server with knowledge of the root servers
zone "." {
    type hint;
    file "/usr/share/dns/root.hints";
};

zone "xiangzheng.com" { #因为是域名,所以无需加www,www表示主机名
    type master;
    file "/var/cache/bind/xiangzheng.com.zone.bind";
};



// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
...

CentOS

  • /etc/named.conf
	allow-transfer { none; }; # 安全加固,不允许任何人来抓取数据
zone "." IN {
    type hint;
    file "named.ca";
};

include "/etc/named.rfc1912.zones"; # 通常都是写到子配置文件中,便于管理↓
include "/etc/named.root.key";
  • /etc/named.rfc1912.zones
...
zone "xiangzheng.com" IN { # 域名,所以不用加www
    type master;
    file "xiangzheng.com.zone"; # 配置文件直接写相对路径即可,不用写绝对路径(相对于/var/named/)
};

检查配置文件语法后启动DNS

# 检查配置文件语法
named-checkconf 

# 检查区域数据库的语法,第一个xiangzheng.com表示在配置文件中定义的名称,第三段表示区域数据库文件路径
named-checkzone xiangzheng.com /var/cache/bind/xiangzheng.com.zone.bind


# 语法无误后 重启name服务
rndc reload

测试

[root@client ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.0.103


[root@client ~]# ping ns1.xiangzheng.com
PING ns1.xiangzheng.com (10.0.0.103) 56(84) bytes of data.
64 bytes from 10.0.0.103 (10.0.0.103): icmp_seq=1 ttl=64 time=0.520 ms


[root@client ~]# dig ns1.xiangzheng.com

; <<>> DiG 9.11.36-RedHat-9.11.36-3.el8 <<>> ns1.xiangzheng.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59413
#flags中的aa表示信息来自权威DNS服务器
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 6f8ee524a76f31070100000062c40605d1daf16b0f690b20 (good)
;; QUESTION SECTION:
;ns1.xiangzheng.com.		IN	A #查询的问题,ns1.xiangzheng.com.对应的A记录是多少

;; ANSWER SECTION:
ns1.xiangzheng.com.	600	IN	A	10.0.0.103 #查询的结果,ns1.xiangzheng.com.对应的A记录是10.0.0.103,TTL为600秒

;; Query time: 1 msec
;; SERVER: 10.0.0.103#53(10.0.0.103) #向哪个DNS服务器查询的
;; WHEN: Tue Jul 05 17:36:05 CST 2022
;; MSG SIZE  rcvd: 91

区域数据库添加其它记录

准备测试web

  • 此处仅作演示,生产中页面应该都是统一的
[root@18 ~]# yum -y install nginx
[root@28 ~]# yum -y install nginx
[root@18 ~]# echo '10.0.0.18 page' > /usr/share/nginx/html/index.html
[root@28 ~]# echo '10.0.0.28 page' > /usr/share/nginx/html/index.html
[root@18 ~]# systemctl enable --now nginx
[root@28 ~]# systemctl enable --now nginx

www A 记录

目前情况

# 目前记录
root@dns-server:~# cat /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103


# 目前记录的解析情况
[root@client ~]# host www.xiangzheng.com
Host www.xiangzheng.com not found: 3(NXDOMAIN) #找不到,因为没有 www 记录
[root@client ~]# ping www.xiangzheng.com
ping: www.xiangzheng.com: Name or service not known #找不到,因为没有 www 记录
[root@client ~]# host ns1.xiangzheng.com #找得到,因为有 ns1 这个主机记录
ns1.xiangzheng.com has address 10.0.0.103
[root@client ~]# ping ns1.xiangzheng.com
PING ns1.xiangzheng.com (10.0.0.103) 56(84) bytes of data.
64 bytes from 10.0.0.103 (10.0.0.103): icmp_seq=1 ttl=64 time=0.484 ms #找得到,因为有 ns1 这个主机记录

添加记录

# 添加 www 的 A 记录
root@dns-server:~# cat /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103
www       A    10.0.0.18 #添加 www 记录


root@dns-server:~# named-checkzone xiangzheng.com /var/cache/bind/xiangzheng.com.zone.bind
zone xiangzheng.com/IN: loaded serial 2015042201
OK


root@dns-server:~# rndc reload
server reload successful

测试

[root@client ~]# host www.xiangzheng.com
www.xiangzheng.com has address 10.0.0.18 #找得到,因为有 www 记录

[root@client ~]# ping www.xiangzheng.com
PING www.xiangzheng.com (10.0.0.18) 56(84) bytes of data. #找得到,因为有 www 记录

* A 记录

  • 泛域名解析

目前情况

# 目前区域数据得记录
root@dns-server:~# cat /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103
www       A    10.0.0.18


[root@client ~]# host moewqomewqoewq.xiangzheng.com
Host moewqomewqoewq.xiangzheng.com not found: 3(NXDOMAIN) #找不到,因为没有 * 记录

[root@client ~]# ping dsaoewqo.xiangzheng.com
ping: dsaoewqo.xiangzheng.com: Name or service not known #找不到,因为没有 * 记录

添加记录

# 添加 www 的 A 记录
root@dns-server:~# cat /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103
www       A    10.0.0.18
*         A    10.0.0.18 #添加 * 记录


root@dns-server:~# named-checkzone xiangzheng.com /var/cache/bind/xiangzheng.com.zone.bind
zone xiangzheng.com/IN: loaded serial 2015042201
OK


root@dns-server:~# rndc reload
server reload successful

测试

[root@client ~]# host moewqomewqoewq.xiangzheng.com
moewqomewqoewq.xiangzheng.com has address 10.0.0.18 #找得到,因为有 * 记录

[root@client ~]# ping dsaoewqo.xiangzheng.com
PING dsaoewqo.xiangzheng.com (10.0.0.18) 56(84) bytes of data. #找得到,因为有 * 记录

@ A 记录

  • 泛域名解析

目前情况

# 目前区域数据得记录
root@dns-server:~# cat /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103
www       A    10.0.0.18
*         A    10.0.0.18


[root@client ~]# host xiangzheng.com
   #无内容,因为没有 @ 记录
[root@client ~]# ping xiangzheng.com
ping: xiangzheng.com: Name or service not known #找不到,因为没有 @ 记录

添加记录

# 添加 www 的 A 记录
root@dns-server:~# cat /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103
www       A    10.0.0.18
*         A    10.0.0.18
@         A    10.0.0.18 #添加 @ 记录


root@dns-server:~# named-checkzone xiangzheng.com /var/cache/bind/xiangzheng.com.zone.bind
zone xiangzheng.com/IN: loaded serial 2015042201
OK


root@dns-server:~# rndc reload
server reload successful

测试

[root@client ~]# host xiangzheng.com
xiangzheng.com has address 10.0.0.18 #找得到,因为有 @ 记录
[root@client ~]# ping xiangzheng.com
PING xiangzheng.com (10.0.0.18) 56(84) bytes of data. #找得到,因为有 @ 记录

CNAME

添加记录

# 修改区域数据库文件
root@dns-server:~# vim /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
ns1       A    10.0.0.103
www       CNAME websrv #添加CNAME
#添加下面两行以实现泛域名解析是错误得,只能将上面得 www 改为 * 或 @
#*         CNAME websrv
#@         CNAME websrv
websrv    A    10.0.0.18 #指向第一个webserver
websrv    A    10.0.0.28 #指向第二个webserver


#检查区域数据库的语法
named-checkzone xiangzheng.com /var/cache/bind/xiangzheng.com.zone.bind


#语法无误后 重启name服务
rndc reload

测试

#配置DNS
[root@client ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.0.103


#可以实现一定程度的负载均衡
[root@client ~]]# curl www.xiangzheng.com
10.0.0.18 page
[root@client ~]# curl www.xiangzheng.com
10.0.0.28 page
[root@client ~]# curl www.xiangzheng.com
10.0.0.18 page


#使用 ping 测试
[root@client ~]# ping www.xiangzheng.com
PING websrv.xiangzheng.com (10.0.0.28) 56(84) bytes of data.
...
[root@client ~]# ping www.xiangzheng.com
PING websrv.xiangzheng.com (10.0.0.28) 56(84) bytes of data.
...
[root@client ~]# ping www.xiangzheng.com
PING websrv.xiangzheng.com (10.0.0.18) 56(84) bytes of data.
...


#查看对应的DNS解析记录
[root@client ~]# host www.xiangzheng.com
www.xiangzheng.com is an alias for websrv.xiangzheng.com.
websrv.xiangzheng.com has address 10.0.0.18
websrv.xiangzheng.com has address 10.0.0.28



#专业工具查看对应的DNS解析记录
[root@client ~]# dig www.xiangzheng.com
...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: fed522b6041d059f0100000062c40c2f4c2304eaed63f3a9 (good)
;; QUESTION SECTION: #请求的
;www.xiangzheng.com.		IN	A #www.xiangzheng.com.对应的A记录是什么?

;; ANSWER SECTION: #解析出来的
www.xiangzheng.com.	600	IN	CNAME	websrv.xiangzheng.com. #www.xiangzheng.com.是一个CNAME,也就是别名,这个别名是 websrv.xiangzheng.com.
websrv.xiangzheng.com.	600	IN	A	10.0.0.18 #websrv.xiangzheng.com.对应的第一个记录
websrv.xiangzheng.com.	600	IN	A	10.0.0.28 #websrv.xiangzheng.com.对应的第二个记录

;; Query time: 1 msec
;; SERVER: 10.0.0.103#53(10.0.0.103)
;; WHEN: Tue Jul 05 18:02:23 CST 2022
;; MSG SIZE  rcvd: 128

MX

添加记录

root@dns-server:~# vim /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
@         NS   ns2
ns1       A    10.0.0.103
ns2       A    10.0.0.104
@         MX   10  mailsrv #MX记录,10表示优先级 数字越小优先级越高
@         MX   20  mailsrv2 #MX记录冗余
mailsrv   A    10.0.0.66 #mailsrv对应的A记录
mailsrv2  A    10.0.0.88 #mailsrv2对应的A记录

测试

[root@client ~]# host xiangzheng.com
xiangzheng.com mail is handled by 20 mailsrv2.xiangzheng.com.
xiangzheng.com mail is handled by 10 mailsrv.xiangzheng.com.


#查看域名或IP对应的邮件服务器地址
[root@client ~]# dig -t mx xiangzheng.com

; <<>> DiG 9.11.36-RedHat-9.11.36-3.el8 <<>> -t mx xiangzheng.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7628
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 8b0749eac4a760580100000062c419dc8a7cd04843820d01 (good)
;; QUESTION SECTION:
;xiangzheng.com.			IN	MX

;; ANSWER SECTION:
xiangzheng.com.		600	IN	MX	10 mailsrv.xiangzheng.com.
xiangzheng.com.		600	IN	MX	20 mailsrv2.xiangzheng.com.

;; ADDITIONAL SECTION:
mailsrv.xiangzheng.com.	600	IN	A	10.0.0.66
mailsrv2.xiangzheng.com. 600	IN	A	10.0.0.88

;; Query time: 0 msec
;; SERVER: 10.0.0.103#53(10.0.0.103)
;; WHEN: Tue Jul 05 19:00:44 CST 2022
;; MSG SIZE  rcvd: 152

DNS 冗余

  • 是这样解决吗?
root@dns-server:~# vim /var/cache/bind/xiangzheng.com.zone.bind
$TTL 600
@   IN    SOA    ns1    mail.xiangzheng.com. (
            2015042201 ;
            1H ;
            10M ;
            1D ;
            12H ;
            )
@         NS   ns1
@         NS   ns2
ns1       A    10.0.0.103
ns2       A    10.0.0.104


[root@client ~]# host ns1.xiangzheng.com
ns1.xiangzheng.com has address 10.0.0.103
[root@client ~]# host ns2.xiangzheng.com
ns2.xiangzheng.com has address 10.0.0.104