bind9实战

前言

不想每次都修改host文件来实现我的域名访问,所以我在想有没有一个更好的方式,可以让我实现域名映射。这个时候我想到了自己架设一个dns服务器。使用用开源dns系统bind9

DNS资源记录类型

  • A : 此记录列出特定主机名的 IPv4地址。这是名称解析的重要记录。
  • AAAA : 名称至 IPv6 地址
  • CNAME 标准名称 此记录指定标准主机名的别名。
  • PTR : IPv4/IPv6 地址至名称
  • MX:邮件交换器,此记录列出了负责接收发到域中的电子邮件的主机。
  • NS:名称服务器,此记录指定负责给定区域的名称服务器。

dig结果显示中status参数

  • NOERROR : 查询成功
  • NXDOMAIN : DNS 服务器提示不存在这样的名称
  • SERVFAIL : DNS 服务器停机或 DNSSEC 响应验证失败
  • REFUSED : DNS 服务器拒绝回答 ( 也许是出于访问控制原因 )

安装

其实安装非常简单,一条命令就搞定了

1
sudo apt install bind9

管理命令

启动:

1
sudo systemctl start bind9

停止:

1
sudo systemctl stop bind9

重启:

1
sudo systemctl restart bind9

状态:

1
sudo systemctl status bind9

配置域名

举个例子,比如现在我们有个域名是:wang.pro(先ping一下是否存在这个域名,换一个不存在的域名)。现在我们要对这个域名进行虚拟映射。

首先打开/etc/bind/named.conf.local,追加如下内容到文件尾部:

1
2
3
4
zone "wang.pro" {
type master;
file "/etc/bind/zones/wang.pro.db";
};

那么现在这个文件的内容完整如下:

1
2
3
4
5
6
7
8
9
10
11
12
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

zone "wang.pro" {
type master;
file "/etc/bind/zones/wang.pro.db"; // 这个文件定义了文件地址
};

我们定义的地址是/etc/bind/zones/wang.pro.db。但是我们的/etc/bind/并没有该目录。所以需要如下命令进行创建:

1
sudo mkdir -p /etc/bind/zones

进入该目录:

1
cd /etc/bind/zones

然后创建该文件wang.pro.db,并追加如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; BIND data file for wang.pro
;
$TTL 14400
@ IN SOA ns1.wang.pro. host.wang.pro. (
201006601 ; Serial
7200 ; Refresh
120 ; Retry
2419200 ; Expire
604800) ; Default TTL
;
wang.com. IN NS ns1.wang.pro.

;域名解析的ip地址:118.190.207.216
ns1 IN A 118.190.207.216
www IN A 118.190.207.216

这样就设置完成了。然后我们将bind9进行重启。

测试DNS效果

dns服务器ip地址(虚拟机地址):192.168.1.12

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
28
$ dig @192.168.1.12 www.wang.pro

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> @192.168.1.12 www.wang.pro
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4142
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 665bf0102d35512c4df4b27b5daf07b1ec2114e2fa9beb42 (good)
;; QUESTION SECTION:
;www.wang.pro. IN A

;; ANSWER SECTION:
www.wang.pro. 14400 IN A 118.190.207.216

;; AUTHORITY SECTION:
wang.pro. 14400 IN NS ns1.wang.pro.

;; ADDITIONAL SECTION:
ns1.wang.pro. 14400 IN A 118.190.207.216

;; Query time: 0 msec
;; SERVER: 192.168.1.12#53(192.168.1.12)
;; WHEN: Tue Oct 22 21:44:17 CST 2019
;; MSG SIZE rcvd: 119

好了,这样就表示已经配置成功了

设置默认本机DNS可用

之前的设置我们需要指定本机的DNS服务器才可以使用,如果我们不指定的话,那么查询该域名是没有效果的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ dig www.wang.pro

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> wang.pro
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34758
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;wang.pro. IN A

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Tue Oct 22 21:44:51 CST 2019
;; MSG SIZE rcvd: 37

设置虚拟机的dns

将关闭虚拟机自动获取dns,添加dns服务器ip:192.168.1.12,114.114.114.114

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig www.wang.pro

; <<>> DiG 9.11.5-P1-1ubuntu2.5-Ubuntu <<>> www.wang.pro
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49051
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.wang.pro. IN A

;; ANSWER SECTION:
www.wang.pro. 6597 IN A 118.190.207.216

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Tue Oct 22 22:13:49 CST 2019
;; MSG SIZE rcvd: 57

测试:ping www.wang.pro

局域网访问

比如我的windows 10的ip地址是192.168.1.96。那么我们可以添加如下内容到/etc/bind/named.conf.options文件中。

1
2
3
4
listen-on {
192.168.1.12;
192.168.1.96;
};

填写完成后打开/etc/bind/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
24
25
26
27
28
29
30
options {
directory "/var/cache/bind";

// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113

// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.

// forwarders {
// 0.0.0.0;
// };

//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;

listen-on-v6 { any; };
listen-on {
// dns服务器ip(虚拟机)
192.168.1.12;
// pc测试机ip
192.168.1.96;
};
};

重启bind9。

然后在windows 10 上设置DNS为192.168.1.12114.114.114.114

这样我们打开cmd,查看域名是否获取到了正确的ip。

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\pc> ping www.wang.pro

正在 Ping www.wang.pro [192.168.1.12] 具有 32 字节的数据:
来自 192.168.1.12 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.12 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.12 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.12 的回复: 字节=32 时间<1ms TTL=64

192.168.1.12 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

但是如果我们这边手机要连怎么办。不能每次都加ip吧。所以这里有个简单的办法。直接将上面的配置修改如下:

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
options {
directory "/var/cache/bind";

// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113

// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.

// forwarders {
// 0.0.0.0;
// };

//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;

listen-on-v6 { any; };
listen-on {
any;
};
};

这样直接将ip列表修改为any。就可以接收所有的ip了。这个时候我们将bind9再次重启。

手机测试

每个手机的设置是不同的。进入设置->无线局域网->在已连接的WIFI右边点击带圈的感叹号->配置DNS->选择手动。

最后点击添加服务器,输入我们虚拟机的地址:192.168.1.12。这个时候我们在手机的浏览器里面输入我们之前设置的域名www.wang.pro

泛域名设置

在开发的时候,可能会出现使用多个域名的情况,但是如果每次添加域名都要设置bind9,还要重启,非常麻烦,那么有没有简单的办法呢?有,就是使用泛域名设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cat /etc/bind/zones/wang.pro.db 

; BIND data file for wang.pro
;
$TTL 14400
@ IN SOA ns1.wang.pro. host.wang.pro. (
201006601 ; Serial
7200 ; Refresh
120 ; Retry
2419200 ; Expire
604800) ; Default TTL
;
wang.pro. IN NS ns1.wang.pro.

;wang.pro. IN A 118.190.207.216

ns1 IN A 118.190.207.216
;www IN A 118.190.207.216
* IN A 118.190.207.216

那么如果要设置泛域名,只需要把最后一行的www更改为*就可以了。