BIND搭建DNS实践
BIND 是一个开源的 DNS 软件系统,包括权威服务器、递归解析器和相关实用程序。搭建 BIND(Berkeley Internet Name Domain)DNS 服务器实现 DNS 服务的管理和配置。
1. bind安装
bind支持源码安装、镜像源安装等方式。
1.1 CentOS 7安装
sudo yum -y install bind bind-utils
1.2 ubuntu安装
sudo apt-get update
sudo apt-get install bind9 bind9utils bind9-doc
2. 配置 BIND
主要包括主配置文件/etc/named.conf
;区域配置文件,例如,/var/named/test.com.zone
,根据域名自行创建。
2.1 主配置文件
主配置文件 /etc/named.conf
( BIND 的守护进程为named
) 包含了 BIND服务器 的全局设置和区域配置。以下为一个配置文件示例:
[root@dns ~]# cat /etc/named.conf
options {
listen-on port 53 { any; }; # ipv4监听地址:配置为any或者节点ip地址
listen-on-v6 port 53 { ::1; };
directory "/var/named";
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";
allow-query { any; }; # 允许查询的主机。引用acl:allow-query { trusted-clients; };
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
# 如果你正在搭建一个权威DNS服务器,请不要启用递归功能。
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
# 如果你正在搭建一个递归(缓存)DNS服务器,你需要启用递归功能。
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
# 如果你的递归DNS服务器拥有一个公网IP地址,你必须启用访问控制以限制查询仅来自合法用户。如果不这样做,你的服务器可能会成为大规模DNS放大攻击的一部分。在你的网络中实施BCP38标准将极大地减少这种攻击面。
*/
forwarders { 8.8.8.8; 8.8.4.4; };
recursion yes; # 是否允许递归查询
dnssec-enable no; # dns安全扩展,这里关闭
dnssec-validation no; # dns安全扩展确认,这里关闭
/* 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;
};
};
acl "trusted-clients" { # 定义了ACL之后在allow-query位置处应用ACL。
192.168.1.0/24;
127.0.0.1;
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
- options区块
options
区块定义了全局配置选项和默认值,如服务器使用的IP地址、DNS查询转发、数据文件目录、缓存大小和查询超时等。
- Logging区块
定义了日志的记录方式和位置。配置文件为相对路径data/named.run
,绝对路径为/var/named/data/named.run
。
- acl区块
acl
区块定义了访问控制列表(ACL),包含了允许访问的 IP 范围。有的情况下,配置文件没有acl
区块,可以根据需求进行添加。
- zone区块
zone
区块定义了DNS服务器需要管理的域名,每个域名需要一个zone
区块,并可以指定区域类型(master或slave)、对应的数据文件名和转发策略等。默认有一个根区域 .(通常用于引导 DNS 解析)。
- include语句
include
语句用于将其他文件中的配置项包含到named.conf
文件中,使配置文件更加灵活和易于管理。
这里以域名test.com
为例,将域名区域信息写到配置文件/etc/named.rfc1912.zones
:
[root@dns ~]# cat /etc/named.rfc1912.zones
# 增加域名配置,以test.com为例。
## 正向解析:
zone "test.com" IN {
type master;
file "test.com.zone";
allow-update { none; };
};
## 反向解析:zone名对应网络地址的反写。这里以10.210.10.0/24网段为例。
zone "10.210.10.in-addr.arpa" IN {
type master;
file "10.210.10.zone";
allow-update { none; };
}
配置完成后通过下面命令检查语法:
named-checkconf
2.2 区域配置文件
区域配置文件包含了指定区域(域名)的 DNS 记录,例如/var/named/test.com.zone
,需要根据域名进行创建。
1. 创建主区域文件
- 正向解析文件
在目录/var/named/
下,复制named.localhost
文件,更改属组为named
。
cp -p named.localhost test.com.zone # 通过-p保持文件权限和所属一致
chown named:named test.com.zone
vi test.com.zone
添加以下内容:
$TTL 3H
@ IN SOA @ dns.test.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS dns.test.com.
dns IN A 110.210.10.220
harbor IN A 110.210.10.210
os-master IN A 110.210.10.216
os-node1 IN A 110.210.10.217
os-node2 IN A 110.210.10.218
检查区域配置文件语法:
[root@dns named]# named-checkzone "test.com" /var/named/test.com.zone
zone test.com/IN: loaded serial 0
OK
- 反向解析文件
使用named.localhost文件的副本,更改属组为named。
cp named.localhost 10.210.10.zone
chown named:named 10.210.10.zone
vi 10.210.10.zone
10.210.10.zone
文件内容如下:
$TTL 1D
@ IN SOA @ dns.test.com. (
2017020701 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS dns.test.com.
220 IN PTR dns.test.com.
210 IN PTR harbor.test.com.
检查语法:
named-checkzone "10.210.10.ip-addr.arpa" /var/named/10.210.10.zone
3. 启动和测试 BIND
3.1 启动 BIND
# centos
sudo systemctl start named
sudo systemctl enable named
3.2 检查 BIND 状态
sudo systemctl status named
3.3 测试 DNS 解析
使用 dig
, nslookup
,host
命令来测试 DNS 解析,测试解析域名harbor.test.com(10.210.10.210)
,dns服务器地址为10.210.10.220
。
# dig正向解析测试
dig @10.210.10.220 harbor.test.com
# dig反向解析测试
dig -x 10.210.10.210 @10.210.10.220
# nslookup测试
[root@client ~]# cat /etc/resolv.conf
nameserver 10.210.10.220
[root@client ~]# nslookup
> harbor.test.com # 正向解析
Server: 10.210.10.220
Address: 10.210.10.220#53
Name: harbor.test.com
Address: 10.210.10.210
> 10.210.10.220 # 反向解析
220.10.210.10.in-addr.arpa name = dns.test.com.
# host测试
[root@client ~]# host harbor.test.com
harbor.test.com has address 10.210.10.210
[root@client ~]# host 10.210.10.210
210.10.210.10.in-addr.arpa domain name pointer harbor.test.com.
4. 排错
- 区域配置文件语法错误
[root@infra named]# named-checkzone "test.com" test.com.zone
dns_rdata_fromtext: test.com.zone:3: near '1D': not a valid number
zone test.com/IN: loading from master file test.com.zone failed: not a valid number
zone test.com/IN: not loaded due to errors.
原因:
/var/named/test.com.zone
配置文件 SOA 后面要加@ 或主域名。