前言
最近在测试环境做实验的时候发现有的环境需要复用,但是每个机器都写hosts
的方式实在是不太优雅,看了一下关于DNS的资料,这里记录一下DNS的原理搭建和如何使用。
DNS原理
首先我们来说说DNS的工作原理,像是你正在看我的这个博客https://www.yafa.moe 这个就是从DNS服务器上获取到了我服务器所在地址,浏览器再去请求对应的服务器,并且将网页下载缓存到你的浏览器中,然后再交给电脑做显示。
为啥要有DNS?
DNS实际上简化了上网的工作,因为像是IP资源是很多的如果你想要购物干嘛的,像是:https://jd.com 你愿意输入一段很难记忆的ip吗?上网体验肯定会让人感觉到很糟心,于是就有了DNS的诞生。这个就是用于管理和解析域名以及对应IP的技术,简单来说就是当我们在浏览器输入域名的时候,然后自动查找与之匹配的IP地址或域名,将域名解析为IP地址(正向解析),或者是将IP地址解析为域名(反向解析)。
像是目前的互联网域名以及对应的IP数据库实在是太过于庞大,DNS服务采用了类似目录树的层级结构用于记录域名和IP之间的关系每个层级在不同的服务器上从而形成一个分布式的数据库系统。
域名的后缀一般分为国际域名和国内域名,域名的后缀都有其定义,但是使用的时候不一定需要严格遵守。
像是我们比较常见的有 .com
(商业组织)、.org
(非盈利组织)、.gov
(政府部门)、.edu
(教育组织)、.moe
二次元域名等等。
为了能够更好的理解DNS的解析可以参考这张图:

环境
这里我准备了2台虚拟机作为本地环境的dns服务器:
主机名 | ip | os | firewalld | selinux |
---|
dns1 | 192.168.56.3 | CentOS7 | enable | enforcing |
dns2 | 192.168.56.4 | CentOS7 | enable | enforcing |
使用的网络如下:
- hostonly (192.168.56.0/24) 用于hostonly网络通讯
- NAT network (10.0.2.0/24)用于链接外网
这次将会在实验内网里面创建一个nil.ml
的域名,作为日常实验的域名
配置虚拟机的ip和主机名
dns1
1
2
3
4
5
6
| hostnamectl set-hostname dns1.nil.ml
nmcli con mod enp0s8 ipv4.method auto connection.autoconnect yes
nmcli con mod enp0s3 ipv4.method manual ipv4.addresses 192.168.56.3/24 connection.autoconnect yes
nmcli con mod enp0s8 ipv4.method manual ipv4.addresses "10.0.2.3/24" ipv4.dns 114.114.114.114 ipv4.gateway 10.0.2.1 connection.autoconnect yes
nmcli connection up enp0s3
nmcli connection up enp0s8
|
dns2
1
2
3
4
5
6
| hostnamectl set-hostname dns2.nil.ml
nmcli con mod enp0s8 ipv4.method auto connection.autoconnect yes
nmcli con mod enp0s3 ipv4.method manual ipv4.addresses 192.168.56.4/24 connection.autoconnect yes
nmcli con mod enp0s8 ipv4.method manual ipv4.addresses "10.0.2.4/24" ipv4.dns 114.114.114.114 ipv4.gateway 10.0.2.1 connection.autoconnect yes
nmcli connection up enp0s3
nmcli connection up enp0s8
|
设置NTP服务器,这里我使用的dns服务器是内网的dns服务器,具体搭建可以参考我这篇文章NTP时间同步服务器:
安装:
配置:
1
2
| vi /etc/ntp.conf
server ntp.aliyun.com iburst
|
加入开机启动项并启动:
1
| systemctl enable ntpd --now
|
安装和配置
1
| yum install -y bind bind-utils bind-chroot
|
防火墙放行NTP服务:
1
2
| firewall-cmd --add-service=dns --permane
firewall-cmd --reload
|
在修改配置文件之前我们做一份备份:
1
| cp -vp /etc/named.conf{,.bak}
|
修改配置文件:
修改主配置文件如下:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| options {
listen-on port 53 { any; };
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";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
// recursion no;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
bindkeys-file "/etc/named.iscdlv.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;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "nil.ml" IN {
type master;
file "/var/named/nil.ml";
};
zone "3.56.168.192.in-addr.arpa" IN {
type master;
file "/var/named/everse.nil.ml";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
|
创建并编辑nil.ml
zone的配置文件:
内容如下 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| $TTL 1d
@ IN SOA dns1.nil.ml. hostmaster.nil.ml. (
1 ; serial
6h ; refresh after 6 hours
1h ; retry after 1 hour
1w ; expire after 1 week
1d ) ; minimum TTL of 1 day
;
;
;Name Server Information
@ IN NS ns1.nil.ml.
ns1 IN A 192.168.56.3
;
;Additional A Records:
www IN A 192.168.56.8
ns2 IN A 192.168.56.4
;
;
;Additional CNAME Records:
slave IN CNAME ns2.nil.ml.
|
配置文件参数说明:
加入反向查询的配置文件:
1
| vi /var/named/everse.nil.ml
|
内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $TTL 1d
@ IN SOA dns1.nil.ml. hostmaster.nil.ml. (
1 ; serial
6h ; refresh after 6 hours
1h ; retry after 1 hour
1w ; expire after 1 week
1d ) ; minimum TTL of 1 day
;
;
;Name Server Information
@ IN NS ns1.nil.ml.
ns1 IN A 192.168.56.3
;
;
;Reverse IP Information
3.56.168.192.in-addr.arpa. IN PTR ns1.nil.ml.
8.56.168.192.in-addr.arpa. IN PTR www.nil.ml.
|
从DNS
在从节点DNS安装bind:
1
| yum install -y bind bind-utils bind-chroot
|
添加防火墙规则:
1
2
| firewall-cmd --add-service=dns --permane
firewall-cmd --reload
|
配置主DNS配置文件:
添加内容如下:
1
| allow-transfer { localhost; 192.168.56.4;};
|
允许传输配置zone文件到特定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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| options {
listen-on port 53 { any; };
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";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
// recursion no;
// 递归 不开启就没办法帮忙解析不在设置的zone里面的内容
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
bindkeys-file "/etc/named.iscdlv.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;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "nil.ml" IN {
type slave;
masters { 192.168.56.3; };
file "slaves/nil.ml";
notify no;
};
zone "3.56.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.56.3; };
file "slaves/everse.nil.ml";
notify no;
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
|
将named加入开机启动并启动:
1
| systemctl enable named --now
|
验证
创建一台虚拟机,将其dns更改为192.168.56.3
使用nslookup
查看对应的记录:
1
2
3
4
5
6
| nslookup ns1.nil.ml
Server: 192.168.56.3
Address: 192.168.56.3#53
Name: ns1.nil.ml
Address: 192.168.56.3
|
配置成功~
结束语
在这篇文章中我们配置了dns服务器,在之后的实验里面就不用再去加每个机器的hosts了,同时也可以做一些不一样的服务了,比如说服务发现。
可以期待一下后面的文章ww~
参考资料
一张图看懂DNS域名解析全过程