DNS服务器搭建

实验搭建 DNS 服务器

尝试搭建 DNS 服务器,中途碰到了些问题,解决后,将搭建的过程和步骤记录下来

安装软件

DNS 用到的软件是 bind,直接安装即可
Arch Linux 和 RHEL7 用的都一样

1
pacman -S bind

RHEL7

1
yum install bind

最基本的配置

编辑 /etc/named.conf 文件,修改以下两个配置

1
2
listen-on port 53 { any; };
allow-query { any; };

设置ipv4的监听地址为所有地址,允许查询的主机为任意主机

编辑 /etc/named.rfc1912.zones 文件,添加正向和反向的DNS解析

1
2
3
4
5
6
7
8
9
zone "hello.com" IN { #正向解析
type master;
file "data/hello.com.zone";
};

zone "10.16.172.in-addr.arpa" IN { #反向解析
type master;
file "data/10.16.172.in-addr.arpa.zone";
};

保留权限的复制 /var/named/named.empty 到 /var/named/data/hello.com.zone

1
cp -p /var/named/named.empty /var/named/data/hello.com.zone

编辑 /var/named/data/hello.com.zone 文件

1
2
3
4
5
6
7
8
9
10
11
$TTL 3H
@ IN SOA @ jkmail.neroumu.top. (
1 ; 序列号
1D ; 刷新时间
1H ; 重试时间
1W ; 过期时间
3H ) ; 否定答案的TTL值
NS @
A 172.16.10.10
world IN A 172.16.10.20
nihao IN A 172.16.10.30
  • @ 代表当前区域的域名
  • 第一个 @ 是当前区域的名字
  • SOA 表示资源类型为SOA
  • 第二个 @ 为主DNS的名称,表示下面哪一条资源记录是主 DNS
  • jkmail.neroumu.top. DNS服务器的管理员邮箱,@用点 . 来代替
  • IN 代表Internet
  • NS @ 其中 NS 表示这是一条域名服务器记录,@ 表示当前区域的服务器是域名服务器
  • A 172.16.10.10 表示当前区域的域名服务器的 IP 地址,也就是本机的 IP 地址

同理复制一个反向解析文件 data/10.16.172.in-addr.arpa.zone,编辑如下

1
2
3
4
5
6
7
8
9
10
11
12
$TTL 3H
@ IN SOA @ jkmail.neroumu.top. (
1 ; 序列号
1D ; 刷新时间
1H ; 重试时间
1W ; 过期时间
3H ) ; 否定答案的TTL值
NS @
A 127.0.0.1
10 IN PTR hello.com.
20 IN PTR world.hello.com.
30 IN PTR nihao.hello.com.

重启服务

1
systemctl restart named

客户端可以通过 nslookup 命令测试是否搭建完成

1
2
3
4
5
nslookup hello.com
nslookup nihao.hello.com

nslookup 172.16.10.10
nslookup 172.16.10.20

搭建从服务器

从服务器安装好 bind 后,同样的修改 /etc/named.conf 中的两个 any
编辑 /etc/named.rfc1912.zones 文件,增加一个正向解析和一个反向解析,并设置类型为slave

1
2
3
4
5
6
7
8
9
10
11
zone "hello.com" IN {
type slave;
file "slaves/hello.com.zone";
masters {172.16.10.10;}; #主服务器IP地址
};

zone "10.16.172.in-addr.arpa" IN {
type slave;
file "slaves/10.16.172.in-addr.arpa.zone";
masters {172.16.10.10;}; #主服务器IP地址
};

重启服务

1
systemctl restart named

此时在 /var/named/slaves 目录下可以看到正向和反向区域解析都已自动获取,配置完成

搭建 DNS 子域委派

编辑 /etc/named.conf 文件,将服务器之间的认证机制关闭,否则后续会导致无法认证以至于无法委派子域,父域和子域都要配置

1
2
dnssec-enable no;
dnssec-validation no;

编辑子域服务器的 /etc/named.rfc1912.zones 文件,添加一个子域zone

1
2
3
4
zone "sekai.hello.com" IN {
type master;
file "data/sekai.hello.com.zone";
};

编辑 /var/named/data/sekai.hello.com.zone 文件

1
2
3
4
5
6
7
8
9
10
$TTL 3H
@ IN SOA @ jkmail.neroumu.top. (
1 ; 序列号
1D ; 刷新时间
1H ; 重试时间
1W ; 过期时间
3H ) ; 否定答案的TTL值
NS @
A 172.16.10.11
kono IN A 172.16.10.40

其实就是在子域服务器上搭建一个新的 DNS 服务器,它管理的域名是 hello.com 的一个子域 sekai
此时启动服务后,本服务器可以解析 sekai.hello.com 的资源
但此时父域服务器无法解析子域管理的域名,需要给它授权才能解析到子域管理的域名
编辑父域服务器的 /var/named/data/hello.com.zone 文件,添加子域服务器认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$TTL 3H
@ IN SOA @ jkmail.neroumu.top. (
1 ; 序列号
1D ; 刷新时间
1H ; 重试时间
1W ; 过期时间
3H ) ; 否定答案的TTL值
NS @
A 172.16.10.10
world IN A 172.16.10.20
nihao IN A 172.16.10.30

sekai IN NS dns1 #添加子域服务器,它管理的是sekai子域
dns1 IN A 172.16.10.11 #子域服务器的IP地址

添加的两条解析的意思是如果碰到 sekai 这个域的域名解析,把它交给 dns1 所指向的服务器解析,dns1 指向的服务器为子域服务器的 IP 地址

重启 named 服务后,客户端将DNS服务器设置为父域服务器,并尝试解析子域服务器管理的域名,可以得到未经过认证的解析结果

1
2
nslookup sekai.hello.com
nslookup kono.sekai.hello.com

常见错误

  1. 忘记关闭防火墙导致子域服务器配置失败

    1
    2
    systemctl stop firewalld
    iptables -F
  2. 序列号不相同导致无法授权

  3. 认证机制未关闭,因为配置的时候没有配置认证,所以应该关闭认证,否则会无法授权
    编辑 /etc/named.conf 文件的如下配置

    1
    2
    dnssec-enable no;
    dnssec-validation no;

总算是把 DNS 服务器配置出来了,尤其是子域配置,配置了很久
之所以能在子域卡这么久,就是因为很多博主在配置的时候,都没有提到过关闭认证机制,导致我一直配置不成功,关闭之后,一下就成功了
从大量的重复、真真假假的文章中找答案真是太难受了,还是直接读官方文档好啊 ( ′ 3`) sigh~