Linux配置DNS服务

DNS 简介

- 什么是域名

域名(DomainName),简称域名、网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。具有独一无二,不可重复的特性。

- 域名的关系和组成

常见域名:www.baidu.com
完整域名:www.baidu.com.

注意com 后面有一点

1
. :根域,可省略不写。
1
com:顶级域,由ICANN组织指定和管理。
1
2
3
4
5
分类:
1、国家地区域名: (cn(中国)、hk(香港)、sg (新加坡)等。
2、通用项级域名: com (商业机构)、org (非营利组织)、edu (教育机构)等。
3、新通用顶级域名: red (红色、热情)、top (顶级、高端)等。
4、com.cn属于“二级域名”,是cn项级域的子域。
1
baidu:级域(注册域) ,可由·个人或组织申请注册。
1
www:三级域(子域),服务器网站名代表。(www.baidu.com)

image-20250402083329281

- 什么是DNS?

域名系统(Domain Name System,缩写: DNS)是互联网的一项服务。域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。可以理解为DNS就是翻译官。

正向解析:域名 --> IP地址。
反向解析:IP地址 --> 域名。

DNS 工作过程

image-20250402084707783

客户端在浏览器输入一个域名:www.baidu.com,浏览器自动补充域名:www.baidu.com:80。80端口是web服务器的端口

1.在从自己本机中查询host文件,是否有此域名的解析记录,如果有则返回给浏览器

2.如果host文件没有域名的解析记录,则会在本机上继续查询是否有DNS的解析缓存,如果有则返回给浏览器

3.如果本机没有DNS的解析记录,则会在网卡设置的DNS服务器上,查询域名的解析结果

4.如果DNS服务器上也没有查询到,则会从别人询问的结果的缓存中查找

5.就迭代查询,顶级域名,二级域名,三级域名

DNS 配置文件

  • / etc / named.conf :主配置文件

image-20250402090006154

  • / etc / named.rfc1912.zones:区域配置文件

image-20250402090420936

  • / var / named / :数据配置文件

named.ca:记录了13台根域服务器的位置
named.localhost:正向代理
named.loopback:反向代理

image-20250402092142493

类型 描述
A 地址记录,用来指定域名的 IPv4 地址的记录。
CNAME 将域名指向另一个域名,再由另一个域名提供 ip 地址,就需要添加 CNAME 记录。
TXT 可填写任何东西,长度限制 255。绝大多数的 TXT 记录是用来做 SPF 的(反垃圾邮件)。
NS 域名服务器记录,如果需要把子域名交给其他 DNS 服务商解析,就需要添加 NS 记录。
AAAA 地址记录,用来指定域名的 IPv6 地址的记录。
MX 邮件交换记录,如果需要设置邮箱,让邮箱能收到邮件,就需要添加 MX 记录。
  • 软件名称:bind
  • 服务名称:named
  • 软件端口:

UDP 53 数据通信(域名解析)
TCP 53 数据同步(主从同步)

DNS 服务搭建

配置DNS地址:/etc/resolv.conf

主机名 ip 内存 硬盘 cpu OS
master 192.168.48.101 2g 100g 2v Centos7
slave 192.168.48.102 2g 100g 2v Centos7
client 192.168.48.103 2g 100g 2v Centos7

前情提要:以下是三台机的网卡dns配置,自行设置

matser: DNS1=192.168.48.101

slave: DNS1=192.168.48.102

client: DNS1=192.168.48.101 , DNS2=192.168.48.102

服务端配置

一、安装

1
yum install -y bind bind-utils

二、配置文件

操作节点:[master]

1.配置主文件 vim /etc/named.conf

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

2、配置区域文件 vim /etc/named.rfc1912.zones

1
2
3
4
5
6
7
8
9
10
cat >> /etc/named.rfc1912.zones <<"EOF"
zone "aaa.com" IN {
type master;
file "aaa.com.zone";
};
zone "48.168.192.in-addr.arpa" IN {
type master;
file "aaa.loopback";
};
EOF

3、编辑正向解析数据文件 vim /var/named/aaa.com.zone

1
2
3
4
5
6
7
8
9
10
11
12
cat > /var/named/aaa.com.zone <<"EOF"
$TTL 1D
@ IN SOA aaa.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.aaa.com.
dns A 192.168.48.129
www A 192.168.48.128
EOF

4、编辑反向解析数据文件 vim /var/named/aaa.loopback

1
2
3
4
5
6
7
8
9
10
11
12
cat > /var/named/aaa.loopback <<"EOF"
$TTL 1D
@ IN SOA aaa.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.aaa.com.
129 PTR dns.aaa.com.
128 PTR www.aaa.com.
EOF

5.启动named服务

1
2
systemctl start named --now
systemctl restart named

客户端配置

操作节点:[client]

一、安装

1
yum install -y bind bind-utils

二、配置网卡dns

这是我的网卡名称是ens33你自己按你自己的改

1
vim /etc/sysconfig/network-scripts/ifcfg-ens33
1
DNS1=192.168.48.101

image-20250402093721868

重启网卡

1
systemctl restart network

三、 测试 nslookup

  • 正向解析测试
1
2
nslookup www.aaa.com
nslookup dns.aaa.com

image-20250402094701150

  • 反向解析测试
1
2
host 192.168.48.128
host 192.168.48.129

image-20250402094743914

主从DNS服务器搭建

减轻主服务器的压力,数据从 主服务器上复制到 从服务器上

主服务器配置

操作节点:[master]

1.配置主文件 vim /etc/named.conf

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

2、配置区域文件 vim /etc/named.rfc1912.zones

1
2
3
4
5
6
7
8
9
10
zone "aaa.com" IN {
type master;
file "aaa.com.zone";
allow-update { 192.168.48.102; }; //从服务器的IP
};
zone "48.168.192.in-addr.arpa" IN {
type master;
file "aaa.loopback";
allow-update { 192.168.48.102; }; //从服务器的IP
};

image-20250402100049594

3、编辑正向解析数据文件 vim /var/named/aaa.com.zone

1
2
3
4
5
6
7
8
9
10
11
12
cat > /var/named/aaa.com.zone <<"EOF"
$TTL 1D
@ IN SOA aaa.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.aaa.com.
dns A 192.168.48.129
www A 192.168.48.128
EOF

4、编辑反向解析数据文件 vim /var/named/aaa.loopback

1
2
3
4
5
6
7
8
9
10
11
12
cat > /var/named/aaa.loopback <<"EOF"
$TTL 1D
@ IN SOA aaa.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.aaa.com.
129 PTR dns.aaa.com.
128 PTR www.aaa.com.
EOF

从服务器配置

操作节点:[slave]

1.配置主文件 vim /etc/named.conf

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

2、配置区域文件 vim /etc/named.rfc1912.zones

1
2
3
4
5
6
7
8
9
10
zone "aaa.com" IN {
type slave;
file "slaves/aaa.com.zone";
masters { 192.168.48.101; }; //主服务器的IP
};
zone "48.168.192.in-addr.arpa" IN {
type slave;
file "slaves/aaa.loopback";
masters { 192.168.48.101; }; //主服务器的IP
};

image-20250402100911225

如果主从同步之后区域数据文件会同步到/var/named/slaves这个目录下,现在还是空的

1
2
3
[root@slave ~]# ll /var/named/slaves
total 0
[root@slave ~]#

slave指定域名服务器为自己

1
echo "nameserver 192.168.48.102" > /etc/resolv.conf

两台重启named服务

操作节点:[master,slave]

1
systemctl restart named

这时候经过两台服务器重启named之后,master里的两个文件就已经同步到slave的/var/named/slaves这个目录下

image-20250402100935884

测试正反向解析

  • 正向解析测试
1
2
nslookup www.aaa.com
nslookup dns.aaa.com

image-20250402101152907

  • 反向解析测试
1
2
host 192.168.48.128
host 192.168.48.129

image-20250402101204461

客户端配置

修改网卡dns添加一个从服务器的ip

1
vim /etc/sysconfig/network-scripts/ifcfg-ens33

image-20250402101403809

重启网卡

1
systemctl restart network

测试主从服务

当我们给master模拟named服务故障时,由从服务器进行接管

测试前,是由master提供服务

1
2
nslookup www.aaa.com
nslookup dns.aaa.com

image-20250402101611671

断开master的named的服务

1
2
[root@master ~]# systemctl stop named
[root@master ~]#

再次进行测试

1
2
nslookup www.aaa.com
nslookup dns.aaa.com
1
2
host 192.168.48.128
host 192.168.48.129

image-20250402102110369

image-20250402102339217

这时重启master的named,客户机又从主服务器查询域名了

1
systemctl start named

image-20250402102221795

image-20250402102355960

自动主从同步

我们已经配置了主从服务器了,如果这时主服务器的区域数据文件中又添加了新的解析条目,怎么实现从服务器也能自动同步这个数据呢?很简单

操作节点:[matser]

1.在区域配置文件vim /etc/named.rfc1912.zones

1
2
notify yes;
also-notify { 192.168.48.102; };

image-20250402102940010

2、在主服务器的区域数据文件中添加新的条目的同时将序列号修改一个比之前更大的数值,序列号最大10位,也可以小于10位

2.1、配置正向区域数据文件

vim /var/named/aaa.com.zone

顺便添加一条新的解析

image-20250402103624647

2.2、配置反向区域数据文件

vim /var/named/aaa.loopback

image-20250402103754780

3、测试

测试前查看slave数据的文件时间

image-20250402103413907

重启master的named的服务

1
systemctl restart named

image-20250402103830941

这时候已经更新了,再次进行测试

1
2
3
4
5
6
7
8
[root@slave ~]# nslookup abc.aaa.com
Server: 192.168.48.102
Address: 192.168.48.102#53

Name: abc.aaa.com
Address: 192.168.48.130
[root@slave ~]# host 192.168.48.130
130.48.168.192.in-addr.arpa domain name pointer abc.aaa.com.

都能成功进行解析,主从自动同步成功

我有测试没修改序号就添加数据顺便重启,是没有同步成功的

image-20250402104220815

image-20250402104232912

重启之后

1
2
[root@master ~]# systemctl restart named
[root@master ~]#

slave下的文件还是和原来一样

1
2
3
4
5
[root@slave ~]# ll /var/named/slaves/
total 8
-rw-r--r-- 1 named named 260 Apr 2 10:38 aaa.com.zone
-rw-r--r-- 1 named named 367 Apr 2 10:38 aaa.loopback
[root@slave ~]#

而且slave是解析不到我新添加的

image-20250402104409869

只有当我修改序号为2时,再进行重启,才能进行同步

image-20250402104543824

ssh免密

此步骤是为了方便以下自动脚本

操作节点:【三台服务器】

这是我的ip和主机名,你根据需要自行修改

1
2
3
4
5
cat >> /etc/hosts << "EOF"
192.168.48.101 master
192.168.48.102 slave
192.168.48.103 client
EOF

操作节点:【master】

脚本里password="123456"是我三台机的密码,我三台都一样,如何你是不一样,你自己自行进行手动免密了

[master] yum install -y sshpass

[master] ssh-keygen -t rsa -N “” -f ~/.ssh/id_rsa

以下这个命令的主机名,三个主机名都要输一遍,也就是三条命令了

[master] sshpass -p “密码” ssh-copy-id -o StrictHostKeyChecking=no “主机名”

测试免密,三个主机名都要输一遍,也就是三条命令了

[master] sshpass -p “密码” ssh -o StrictHostKeyChecking=no “主机名” “echo ‘免密登录成功’”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
yum install -y sshpass 
cat > sshmianmi.sh << "EOF"
#!/bin/bash
# 目标主机列表
hosts=("master" "slave" "client")
# 密码
password="123456"
# 生成 SSH 密钥对
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

# 循环遍历目标主机
for host in "${hosts[@]}"
do
# 复制公钥到目标主机
sshpass -p "$password" ssh-copy-id -o StrictHostKeyChecking=no "$host"

# 验证免密登录
sshpass -p "$password" ssh -o StrictHostKeyChecking=no "$host" "echo '免密登录成功'"
done
EOF

sh sshmianmi.sh

自动添加解析脚本

你要做的就是修改脚本中的SLAVE_IP="192.168.48.102"这是我的从节点的ip

你要把你的主从节点做好免密之后,才可以进行以下操作

操作节点:[master]

1
vim jx.sh
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/bin/bash

# 检查参数数量
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <IP_ADDRESS> <DOMAIN>"
exit 1
fi

IP="$1"
DOMAIN="$2"
# 获取本机 IP 地址(假设主机只有一个有效 IP)
MASTER_IP=$(hostname -I | awk '{print $1}')
# 从服务器的 IP 地址
SLAVE_IP="192.168.48.102"

# 解析域名和反向 IP
BASE_DOMAIN=$(echo "$DOMAIN" | awk -F. '{print $(NF-1)"."$NF}')
ZONE_FILE="/var/named/$BASE_DOMAIN.zone"
REV_ZONE_FILE="/var/named/$(echo $IP | awk -F. '{print $3"."$2"."$1".in-addr.arpa"}').zone"
ZONE_CONFIG="/etc/named.rfc1912.zones"

# 解析反向 IP 和主机名
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
REV_HOST=$(echo $IP | awk -F. '{print $4}')
SHORT_NAME=$(echo "$DOMAIN" | awk -F. '{print $1}')

# 确保 /var/named 目录存在
mkdir -p /var/named/
touch "$ZONE_FILE" "$REV_ZONE_FILE"
chown named:named "$ZONE_FILE" "$REV_ZONE_FILE"
chmod 644 "$ZONE_FILE" "$REV_ZONE_FILE"

# 检查是否已存在相同的解析记录
if grep -q "^$SHORT_NAME[[:space:]]*A[[:space:]]*$IP" "$ZONE_FILE"; then
echo "记录 $DOMAIN -> $IP 已存在,无需添加"
exit 0
fi

# **递增 serial 号**
increment_serial() {
# 提取当前 serial 值
current_serial=$(awk '/serial/{print $1}' "$1")

if [[ -z "$current_serial" ]]; then
# 如果没有找到 serial(空),初始化为 1
current_serial=1
fi

# 递增 serial
new_serial=$((current_serial + 1))

# 替换 serial 行,保留前导空格和注释
sed -i "s/\([[:space:]]*\)\([0-9]\+\)\([[:space:]]*; serial\)/\1$new_serial\3/" "$1"
}



# 添加正向解析区域配置(如果不存在)
if ! grep -q "zone \"$BASE_DOMAIN\" IN" "$ZONE_CONFIG"; then
cat >> "$ZONE_CONFIG" <<EOF
zone "$BASE_DOMAIN" IN {
type master;
file "$ZONE_FILE";
notify yes;
also-notify { $SLAVE_IP; };
allow-update { $SLAVE_IP; };
};
EOF
fi

# 添加反向解析区域配置(如果不存在)
if ! grep -q "zone \"$REV_IP.in-addr.arpa\" IN" "$ZONE_CONFIG"; then
cat >> "$ZONE_CONFIG" <<EOF
zone "$REV_IP.in-addr.arpa" IN {
type master;
file "$REV_ZONE_FILE";
notify yes;
also-notify { $SLAVE_IP; };
allow-update { $SLAVE_IP; };
};
EOF
fi

# **初始化 Zone 文件(正向解析)**
if [ ! -s "$ZONE_FILE" ]; then
cat > "$ZONE_FILE" <<EOF
\$TTL 1D
@ IN SOA $BASE_DOMAIN rname.invalid. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS $BASE_DOMAIN
$BASE_DOMAIN A $MASTER_IP

EOF
increment_serial "$ZONE_FILE" # 初始化时递增 serial
fi

# **追加 A 记录(使用短名)**
if ! grep -q "^$SHORT_NAME[[:space:]]*A[[:space:]]*$IP" "$ZONE_FILE"; then
echo "$SHORT_NAME A $IP" >> "$ZONE_FILE"
increment_serial "$ZONE_FILE" # 追加记录后递增 serial
fi

# **初始化 Zone 文件(反向解析)**
if [ ! -s "$REV_ZONE_FILE" ]; then
cat > "$REV_ZONE_FILE" <<EOF
\$TTL 1D
@ IN SOA $BASE_DOMAIN rname.invalid. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS $BASE_DOMAIN
$BASE_DOMAIN A $MASTER_IP

EOF
increment_serial "$REV_ZONE_FILE" # 初始化时递增 serial
fi

# **追加 PTR 记录**
if ! grep -q "^$REV_HOST[[:space:]]*PTR[[:space:]]*$SHORT_NAME.$BASE_DOMAIN." "$REV_ZONE_FILE"; then
echo "$REV_HOST PTR $SHORT_NAME.$BASE_DOMAIN." >> "$REV_ZONE_FILE"
increment_serial "$REV_ZONE_FILE" # 追加记录后递增 serial
fi

# 在从服务器上追加主从同步配置
ssh -T root@$SLAVE_IP <<EOF
# 检查从服务器配置文件是否已存在主从同步区域
if ! grep -q "zone \"$BASE_DOMAIN\" IN" "$ZONE_CONFIG"; then
cat >> "$ZONE_CONFIG" <<EOT
zone "$BASE_DOMAIN" IN {
type slave;
file "slaves/$BASE_DOMAIN.zone";
masters { $MASTER_IP; }; # 主服务器的IP
};
EOT
fi

# 检查反向解析的从服务器配置
if ! grep -q "zone \"$REV_IP.in-addr.arpa\" IN" "$ZONE_CONFIG"; then
cat >> "$ZONE_CONFIG" <<EOT
zone "$REV_IP.in-addr.arpa" IN {
type slave;
file "slaves/$REV_IP.loopback";
masters { $MASTER_IP; }; # 主服务器的IP
};
EOT
fi
EOF

# 重新加载主服务器的 Bind 配置
systemctl restart named
echo "✅ DNS 记录已添加并重新加载 Bind 服务"

# 重新加载从服务器上的 Bind 配置
ssh -T root@$SLAVE_IP <<EOF
systemctl restart named
echo "✅ 从服务器 $SLAVE_IP 配置已更新并重新加载 Bind 服务"
EOF

echo "✅ 主从同步配置已成功添加到从服务器 $SLAVE_IP"


systemctl restart named
1
2
3
bash jx.sh 192.168.111.201 bs.qianyios12.top
bash jx.sh 192.168.123.202 bs1.qianyios1245.top
bash jx.sh 192.168.236.203 bs3.qianyios22224.top

image-20250402132308000

接下来进行测试,三台机都可以进行测试

1
2
3
4
5
6
nslookup bs.qianyios12.top
nslookup bs1.qianyios1245.top
nslookup bs3.qianyios22224.top
host 192.168.111.201
host 192.168.123.202
host 192.168.236.203

master

image-20250402132443227

slave

image-20250402132517976

client

image-20250402132543331

特别声明
千屹博客旗下的所有文章,是通过本人课堂学习和课外自学所精心整理的知识巨著
难免会有出错的地方
如果细心的你发现了小失误,可以在下方评论区告诉我,或者私信我!
非常感谢大家的热烈支持!