需求

内网的服务越来越多,记 IP 地址太烦。

局域网内可以通过域名访问内网的服务,并且可以通外网

背景假设

DNS 所在的服务器的 IP 是192.168.1.1,内网的机器是192.168.2.1,需要分配域名host1.in.example.com;另一个内网机器192.168.3.1,需要分配域名host2.in.example.com

一般情况下,都是配置主、从两个 DNS 服务器的,方式挂掉影响服务。但是由于我比较懒,所以只配置了一个主服务器。如果需要配置从服务器,可以看参考文章,和主服务器配置方法基本相同。

安装软件

1
sudo yum install bind bind-utils

配置主 DNS 服务器

编辑named.conf配置文件

1
sudo vi /etc/named.conf

在其中添加信任的网段

1
2
3
acl "trusted" {
192.168.0.0/16; # 也可以填单独的 IP 地址
};

修改options

1
2
3
4
5
6
7
8
9
10
11
12
options {
listen-on port 53 { 127.0.0.1; 192.168.1.1; }; # 填上本地的 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";
allow-query { trusted; }; # 把刚才的信任段放这
forwarders { 202.119.80.10; }; # 这儿写你上游的 DNS 服务器地址

..... # 省略,默认值
};

然后在配置的最后添加

1
include "/etc/named/named.conf.local";

修改自定义配置

1
sudo vi /etc/named/named.conf.local

写入自己的域

1
2
3
4
zone "in.example.com" {
type master;
file "/etc/named/zones/db.in.example.com"; # zone file path
};

同时写入反向解析域

1
2
3
4
zone "168.192.in-addr.arpa" {
type master;
file "/etc/named/zones/db.192.168"; # 192.168.0.0/16 subnet
};

改完之后修改一下文件的权限

1
2
sudo chmod 755 /etc/named
sudo mkdir /etc/named/zones

填写自定义规则

修改自定义规则

1
sudo vi /etc/named/zones/db.in.example.com

首先写入 SOA 记录。尽管我也不懂这是什么意思。

1
2
3
4
5
6
@       IN      SOA     ns1.in.example.com. admin.in.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL

数字不用改,把对应域名改掉就行了

然后写入 NS 记录

1
2
; name servers - NS records
IN NS ns1.in.example.com.

接下来就是自定义的 A 记录了。

1
2
3
4
5
6
; name servers - A records
ns1.in.example.com. IN A 192.168.1.1

; 192.168.0.0/16 - A records
host1.in.example.com. IN A 192.168.2.1
host2.in.example.com. IN A 192.168.3.1

填写反向自定义规则

1
sudo vi /etc/named/zones/db.192.168

同样写入不知道干什么用的 SOA 记录

1
2
3
4
5
6
@       IN      SOA     ns1.in.example.com. admin.in.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL

和 NS 记录

1
2
; name servers - NS records
IN NS ns1.in.example.com.

然后把自定义的记录的反向记录写入

1
2
3
4
; PTR Records
1.1 IN PTR ns1.in.example.com. ; 192.168.1.1
1.2 IN PTR host1.in.example.com. ; 192.168.2.1
1.3 IN PTR host2.in.example.com. ; 192.168.3.1 注意最前面的顺序,是反向的

检查配置文件

1
sudo named-checkconf

用上面检查各种.conf文件的正确性

1
sudo named-checkzone in.example.com /etc/named/zones/db.in.example.com

检查正向规则的正确性

1
sudo named-checkzone 168.192.in-addr.arpa /etc/named/zones/db.192.168

检查反向规则的正确性

启动

如果以上规则检查没有问题的话,就可以启动 DNS 服务了

1
sudo systemctl start named

设置开机自启动

1
sudo systemctl enable named

此时,你的 DNS 服务已经 OK

客户端

接下来需要修改你的客户端。

比如 DHCP 分配的 DNS 地址

比如 CentOS 自己的。可以直接修改/etc/resolv.conf以生效

对于 Ubuntu,如果是通过自动获取 IP 的话,通过sudo resolvconf -u即可更新

参考文章

How To Configure BIND as a Private Network DNS Server on CentOS 7