第一部分:环境准备
在开始之前,请确保您的虚拟机环境满足以下条件:

- 操作系统: 一台安装好的 Linux 虚拟机,本教程以 Ubuntu 22.04 LTS 为例,但同样适用于 Debian、CentOS/RHEL 等其他发行版(命令可能略有不同)。
- 网络配置: 虚拟机必须拥有一个静态 IP 地址,因为 DNS 服务器需要一个固定的地址,客户端才能持续找到它。
- 我们设定虚拟机的 IP 地址为
168.1.100,子网掩码为255.255.0,网关为168.1.1。
- 我们设定虚拟机的 IP 地址为
- 主机名: 为虚拟机设置一个有意义的主机名,
dns-server。 - 权限: 您需要拥有
sudo或root权限来安装软件和修改系统文件。
第二部分:安装和基础配置
步骤 1: 更新系统并安装 BIND9
登录到您的 Linux 虚拟机,打开终端。
# 更新软件包列表 sudo apt update # 安装 BIND9 DNS 服务器软件包 sudo apt install bind9 -y
安装完成后,BIND9 服务会自动启动,我们可以检查其状态:
sudo systemctl status bind9
如果看到 active (running),则表示安装成功。
步骤 2: 配置静态 IP 地址
这一步至关重要,以 Ubuntu 为例,编辑 Netplan 的网络配置文件,文件通常位于 /etc/netplan/ 目录下,01-netcfg.yaml。

sudo nano /etc/netplan/01-netcfg.yaml
可能如下,请根据您的网络环境进行修改:
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
version: 2
renderer: networkd
ethernets:
# 将 enp0s3 替换为您自己的网卡名称,可以使用 ip a 命令查看
enp0s3:
dhcp4: no
addresses:
- 192.168.1.100/24 # 您的静态IP地址和子网掩码
gateway4: 192.168.1.1 # 您的网络网关
nameservers:
addresses: [8.8.8.8, 1.1.1.1] # 临时使用公共DNS,后面会改成本地DNS
保存文件后,应用新的网络配置:
sudo netplan apply
验证 IP 地址是否已更改:
ip a # 或者 ip addr show
您应该能看到 enp0s3 接口已经分配了您设定的静态 IP 168.1.100。

第三部分:核心 BIND9 配置
BIND9 的主要配置文件是 /etc/bind/named.conf,它包含了其他配置文件的引用,我们主要需要修改以下文件:
- 主配置文件:
/etc/bind/named.conf - 区域配置文件:
/etc/bind/named.conf.local(我们在这里定义要管理的域名) - 区域数据文件: 存储具体 DNS 记录的文件 (
db.example.com)
步骤 3: 编辑主区域配置
编辑 /etc/bind/named.conf.local 文件,这是我们添加自己域名区域的地方。
sudo nano /etc/bind/named.conf.local
在文件末尾添加以下内容,这里我们创建一个名为 example.com 的正向区域和一个对应的反向区域。
#
# 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 "example.com" {
type master;
file "/etc/bind/db.example.com"; # 区域数据文件路径
allow-update { none; };
};
# --- 反向区域配置 ---
# 注意:1.168.192.in-addr.arpa 是 192.168.1.0/24 网络的反向表示
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1"; # 反向区域数据文件路径
allow-update { none; };
};
保存并关闭文件。
步骤 4: 创建正向区域数据文件
BIND9 提供了模板文件,我们可以基于它来创建自己的文件。
# 复制模板文件 sudo cp /etc/bind/db.local /etc/bind/db.example.com # 编辑新文件 sudo nano /etc/bind/db.example.com
修改如下,请务必将 ns1.example.com 和 mail.example.com 修改为您自己的主机名,168.1.100 是您的 DNS 服务器 IP。
; BIND data file for example.com
;
$TTL 604800
@ IN SOA ns1.example.com. admin.example.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.example.com.
@ IN A 192.168.1.100
@ IN AAAA ::1
; --- 添加您的 A 记录 ---
ns1 IN A 192.168.1.100
www IN A 192.168.1.100
dev IN A 192.168.1.101 # 假设另一台服务器的IP
mail IN A 192.168.1.100
; --- 添加 CNAME 记录 (别名) ---
www2 IN CNAME www.example.com.
解释:
$TTL: 生存时间,604800 秒 = 7 天。- 代表当前区域名
example.com。 SOA: 起始授权机构,包含域的管理信息。NS: 域名服务器记录,指定此域由哪个 DNS 服务器解析。A: 地址记录,将域名映射到 IPv4 地址。AAAA: 地址记录,将域名映射到 IPv6 地址。CNAME: 规范名称记录,为域名创建别名。
保存并关闭文件。
步骤 5: 创建反向区域数据文件
同样,复制反向区域的模板文件。
# 复制模板文件 sudo cp /etc/bind/db.127 /etc/bind/db.192.168.1 # 编辑新文件 sudo nano /etc/bind/db.192.168.1
修改如下,将 168.1.100 替换为您的 DNS 服务器 IP。
; BIND reverse data file for 192.168.1.0/24
;
$TTL 604800
@ IN SOA ns1.example.com. admin.example.com. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.example.com.
; --- 添加 PTR 记录 (指针记录) ---
100 IN PTR ns1.example.com.
100 IN PTR www.example.com.
100 IN PTR mail.example.com.
101 IN PTR dev.example.com.
解释:
PTR: 指针记录,将 IP 地址反向解析为域名,这是反向区域的核心。100对应 IP 地址168.1.100。
重要提示: 正向区域数据文件中的 Serial (序列号) 必须是一个递增的数字,每次修改了区域文件后,都必须增加这个数字,否则 DNS 服务器不会重新加载区域数据。
第四部分:启动和测试
步骤 6: 检查配置语法并重启服务
在重启 BIND9 服务之前,务必检查配置文件是否有语法错误。
# 检查主配置文件 sudo named-checkconf # 检查正向区域 sudo named-checkzone example.com /etc/bind/db.example.com # 检查反向区域 sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1
如果没有任何输出,说明语法正确,如果有错误,请根据提示返回修改文件。
配置无误后,重启 BIND9 服务使其加载新配置:
sudo systemctl restart bind9
步骤 7: 在虚拟机内部测试
我们需要将虚拟机自身的 DNS 查询请求指向我们刚刚创建的 DNS 服务器。
编辑 /etc/resolv.conf 文件:
sudo nano /etc/resolv.conf
修改为:
nameserver 127.0.0.1 # 或者 nameserver 192.168.1.100 # search example.com
注意: 在现代的 systemd-resolved 系统中,直接修改 /etc/resolv.conf 可能是临时的,要永久修改,需要配置 Netplan 或 systemd-resolved,但为了快速测试,这样修改是可行的。
使用 dig 或 nslookup 命令进行测试。
# 安装 dig (如果还没有) sudo apt install dnsutils # 测试正向解析 dig @192.168.1.100 www.example.com # 测试反向解析 dig @192.168.1.100 -x 192.168.1.100 # 简单测试 nslookup www.example.com
如果一切正常,您应该能看到 www.example.com 解析到 168.1.100,168.1.100 反向解析到 www.example.com。
第五部分:在局域网内使用
要让局域网内的其他计算机(如您的物理主机)也能使用这台虚拟机作为 DNS 服务器,您需要:
- 在客户端设置 DNS 服务器: 将您物理机或另一台客户端的 DNS 设置为虚拟机的 IP 地址
168.1.100。 - 配置虚拟机的网络: 确保虚拟机的网络模式设置为 “桥接模式” (Bridged Mode),这样虚拟机就会在您的局域网中获得一个独立的 IP,与您的物理机在同一网段,其他设备才能直接访问它。
第六部分:安全加固(可选但推荐)
默认情况下,您的 DNS 服务器可能被用于 DNS 放大攻击等恶意活动,为了安全,应该限制它只响应来自您局域网内部或特定客户端的查询。
编辑 BIND9 的主配置文件 /etc/bind/named.conf.options:
sudo nano /etc/bind/named.conf.options
在 options 块中添加 allow-recursion 和 listen-on 指令:
options {
directory "/var/cache/bind";
// 只允许来自 192.168.1.0/24 网络的递归查询
allow-recursion { 192.168.1.0/24; localhost; };
// 只在 192.168.1.100 和本地回环地址上监听
listen-on { 127.0.0.1; 192.168.1.100; };
// 如果不需要 IPv6,可以禁用
// listen-on-v6 { any; };
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
保存文件后,重启 BIND9 服务:
sudo systemctl restart bind9
只有您授权的客户端才能使用这台 DNS 服务器进行递归查询,大大提高了安全性。
