准备及说明
假设某公司有多个数据中心,数据中心1以内部使用idc1.meeleet.com,数据中心2使用idc2.meeleet.com,数据中心3使用idc3.meeleet.com。我们这里以数据中心3内部需要搭建私网DNS服务器为例来讲,idc3.meeleet.com(具体实施过程中,按读者实际情况进行修改)
- DNS服务器
私网IP地址 | 简称 | 是否为主DNS服务器 |
---|---|---|
10.1.80.220 | ns1 | 是(主DNS服务器) |
10.1.80.221 | ns2 | 否(备DNS服务器) |
- DNS客户端
私网IP地址 | 简称 | |
---|---|---|
10.1.80.91 | s91 | |
10.1.80.92 | s92 |
步骤1 在DNS服务器上安装Bind
在主DNS服务器及备DNS服务器上安装BIND
ON ns1 ns2
1 | sudo apt install bind9 bind9utils bind9-doc |
修改启动参数1
sudo vi /etc/default/named
OPTIONS参数最后添加-4,使用Ipv4模式1
2
3
4
5
6
run resolvconf?
RESOLVCONF=no
startup options for the server
OPTIONS="-u bind -4"
重启bind
1 | sudo systemctl restart bind9 |
步骤2 配置主DNS服务器
on ns1
配置Options文件
打开named.conf.options并修改
1 | sudo vi /etc/bind/named.conf.options |
1 | acl "trusted" { |
注意forwards配置块,有三个ip地址,其中223.5.5.5,223.6.6.6是阿里云公共DNS,114.114.114.114是电信提供公共的DNS。forwards可以为无法直接连接到外网的机器提供域名解析服务。
完成之后,保存并关闭named.conf.options文件。上面的配置指定只有您自己的服务器(受信任”trusted”的服务器)能够查询您的DNS服务器的外部域。
配置named.conf.local
on ns1
打开named.conf.local,用vi来编辑
1 | sudo vi /etc/bind/named.conf.local |
正向、反向解析,指定配置文件路径
1 |
|
创建正向zone文件
on ns1
创建转发区域文件存放目录
1 | mkdir -p /etc/bind/zones |
复制db.local并修改
1 | sudo cp /etc/bind/db.local /etc/bind/zones/db.idc3.meeleet.com |
1 | ; |
将localhost替换为idc3.meeleet.com,删除含delete this line标记的行
文件最后添加上DNS服务器NS记录
1 |
|
给这个域内的主机添加A记录
1 | ... |
每次编辑区域文件时,需要在重新启动命名进程之前增加Serial值。在这里,将其增加为3,注意增加Serial值非常重要!非常重要!非常重要!最终zone配置文件内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
; BIND data file for local loopback interface
;
TTL 604800
@ IN SOA idc3.meeleet.com. root.idc3.meeleet.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.idc3.meeleet.com.
IN NS ns2.idc3.meeleet.com.
; name servers - A records
ns1.idc3.meeleet.com. IN A 10.1.80.220
ns2.idc3.meeleet.com. IN A 10.1.80.221
; 10.1.80.0/24 - A records
s91.idc3.meeleet.com. IN A 10.1.80.91
s92.idc3.meeleet.com. IN A 10.1.80.92
保存/etc/bind/zones/db.idc3.meeleet.com
创建反向zone文件
1 | sudo cp /etc/bind/db.127 /etc/bind/zones/db.10.1.80 |
1 | TTL 604800 |
删除含delete this line标记的行
最终1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19TTL 604800
@ IN SOA ns1.idc3.meeleet.com. root.idc3.meeleet.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.idc3.meeleet.com.
IN NS ns2.idc3.meeleet.com.
; PTR Records
220 IN PTR ns1.idc3.meeleet.com. ; 10.1.80.220
221 IN PTR ns2.idc3.meeleet.com. ; 10.1.80.221
91 IN PTR s91.idc3.meeleet.com. ; 10.1.80.91
92 IN PTR s92.idc3.meeleet.com. ; 10.1.80.92
检查配置文件是否正确
1 | sudo named-checkzone idc3.meeleet.com /etc/bind/zones/db.idc3.meeleet.com |
1 | sudo named-checkzone 80.1.10.in-addr.arpa /etc/bind/zones/db.10.1.80 |
检查没问题,可以重启bind9
1 | sudo systemctl restart bind9 |
如果有使用ufw,则需要让ufw允许bind9(如果有启用ufw的话)
1 | sudo ufw allow Bind9 |
步骤3 配置备DNS服务器
多数情况下搞一套主备DNS服务器还是很有必要的,这样的话当主备DNS服务器不可用时,备DNS服务器也可以接受DNS查询请求并作出响应。幸运的是,配置一个备DNS服务器比配置主DNS服务器简单多了。
on ns2
编辑named.conf.options文件
1 | sudo vi /etc/bind/named.conf.options |
在文件的顶部,添加包含所有受信任服务器的私有IP地址的ACL。(也支持添加单独的ip,这里我为了方便,直接用网段来表示,这样就不用一个个IP写出来了)
1 | acl "trusted" { |
directory指令下方,添加如下行
1 | . . . |
保存并关闭named.conf.options文件。这个文件应该与ns1的named.conf.options文件相同,只是它应该被配置为监听ns2的私有IP地址。
最终named.conf.options文件内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24acl "trusted" {
10.1.80.220; # ns1
10.1.80.221; # ns2
10.1.80.0/24; # trusted DNS clients network
};
options {
directory "/var/cache/bind";
recursion yes; # enables recursive queries
allow-recursion { trusted; }; # allows recursive queries from "trusted" clients
allow-query { trusted; }; # allows queries from "trusted" clients
listen-on { 10.1.80.221; }; # ns2 private IP address
allow-transfer { none; }; # disable zone transfers by default
forwarders {
223.5.5.5;
223.6.6.6;
114.114.114.114;
};
dnssec-validation auto;
listen-on-v6 { any; };
};
现在编辑named.conf.loca文件1
sudo vi /etc/bind/named.conf.local
在主DNS服务器上定义与主DNS服务器对应的辅助区域。注意,该类型是slave,文件不包含路径,并且有一个master指令,该指令应该设置为主DNS服务器的私有IP地址。如果您在主DNS服务器中定义了多个反向区域,请确保将它们全部添加到这里:
1 |
|
注意:考虑到它们的负面含义,DigitalOcean倾向于尽可能避免使用“主人”和“奴隶”等术语。在Bind的最新版本中,可以使用primaries而不是masters,并将备服务器的类型定义为secondary服务器而不是slave服务器。然而,从默认的Ubuntu 20.04存储库中安装的BIND版本(如步骤1中所述)将无法识别这些选项,这意味着除非升级,否则您将不得不使用包含较少的术语。
保存并关闭named.conf.local文件
运行以下命令检查配置文件有效性1
sudo named-checkconf
如果命令执行反回没有任何错误,那么就可以重启bind
1 | sudo systemctl restart bind9 |
然后通过修改防火墙规则使得允许DNS客户端的连接到此DNS服务器
1 | sudo ufw allow Bind9 |
到现在为止,DNS主备服务器就搭建好了
从ns1传输到ns2的区域文件放在 ns2的/var/cache/bind/目录
1 | ls /var/cache/bind/ |
步骤4 配置DNS客户端
在受信任ACL中的所有服务器都可以查询您的DNS服务器之前,必须将每个服务器配置为使用ns1和ns2作为DNS服务器。
假设您的客户端服务器运行Ubuntu,您需要找到与您的专用网络相关联的设备。可以使用ip address命令查询私有子网。在每台客户机上运行以下命令,将突出显示的子网替换为您自己的子网。
1 | ip address show to 10.1.80.0/24 |
本例中私网网卡名为enp0s3。本节中的示例将把enp0s3作为私有网络(10.1.80.0/24网段)网卡,不过您应该根据您的实际情况更改这些示例,以反映您自己的服务器的私有网卡。
修改/etc/netplan/00-installer-config.yaml给s91,s92的相应网卡设置ns1和ns2 DNS服务器的地址,以及search域
1 | vi /etc/netplan/00-installer-config.yaml |
s911
2
3
4
5
6
7
8
9
10
11
12network:
ethernets:
enp0s3:
addresses:
- 10.1.80.91/24
gateway4: 10.1.80.254
nameservers:
addresses: [10.1.80.220,10.1.80.221]
search: [idc3.meeleet.com]
enp0s8:
dhcp4: true
version: 2
s921
2
3
4
5
6
7
8
9
10
11
12
13
14network:
ethernets:
enp0s3:
addresses:
- 10.1.80.92/24
gateway4: 10.1.80.254
nameservers:
addresses:
- 10.1.80.220
- 10.1.80.221
search: [idc3.meeleet.com]
enp0s8:
dhcp4: true
version: 2
DNS服务器列表network->ethernets->enp0s3->nameservers->addresses两种配置方式都可以。search的作用就是就去ping s91时,原来当访问的域名(s91)不能被DNS解析时,resolver会将该域名加上search指定的参数,也就是s91.idc3.meeleet.com,重新请求DNS,直到被正确解析或试完search指定的列表为止。
保存并关闭
使用netplan try尝试新配置,如果有问netplay会在倒计时后自动回滚配置。
现在,检查系统的DNS解析器,以确定您的DNS配置是否已应用:1
sudo systemd-resolve --status
1 | Global |
步骤5 测试客户端
步骤6 维护DNS记录
现在你已拥有了工作在内网的DNS服务器,你需要维护DNS记录以便支持你的服务器环境。
添加新主机DNS记录
任何时候你要添加新主机到你的服务器环境(在同一个数据中心),添加一个新主机的DNS记录,需要以下步骤:
主域名服务器
正向区域文件:为新主机添加A记录,并增加Serial值
反向区域文件:为新主机增加PTR记录,并增加Serial值
添加新的主机私网IP地址到受信任的ACL列表(named.conf.options)
测试配置文件:1
2
3sudo named-checkconf
sudo named-checkzone idc3.meeleet.com /etc/bind/zones/db.idc3.meeleet.com
sudo named-checkzone 80.1.10.in-addr.arpa /etc/bind/zones/db.10.1.80
辅域名服务器
- 添加新的主机私网IP地址到受信任的ACL列表(named.conf.options)
检查配置文件语法是否正确1
sudo named-checkconf
然后重载bind:1
sudo systemctl reload bind9
删除主机DNS记录
如果你要删除某个主机的DNS记录,只需要删除之前添加的该主机的DNS记录信息(就是与之前添加主机DNS记录的步骤相反)
参考
How To Configure BIND as a Private Network DNS Server on Ubuntu 20.04
如何在CentOS-7上将BIND配置为专用网络DNS服务器