在虚拟机终端里安装DNS服务器,核心就两步:先给虚拟机配好静态IP,再装BIND9(Ubuntu/Debian系)或bind(CentOS系)并修改配置文件。整个过程不复杂,但坑不少,尤其是网络模式和防火墙,下面按实际踩坑顺序一步步来。
安装前的准备工作:别急着敲命令
很多教程直接让你 apt install bind9,结果装完发现解析不生效,问题多半出在虚拟机网络环境没理顺。
确认虚拟机的网络模式
虚拟机终端安装DNS服务器,首先得搞清楚网络连接方式,多数情况下,你用的是NAT模式或仅主机(Host-Only)模式。
- NAT模式:虚拟机通过宿主机上网,DNS服务可以对外提供解析,但需要做端口转发,否则外部机器访问不到。
- 桥接模式:虚拟机直接占用局域网IP,最接近真实服务器场景,推荐练习用。
- 仅主机模式:只能和宿主机通信,适合测试内部解析,不需要对外。
行业共识认为,学习阶段用桥接模式最省心,IP和宿主机在同一网段,后续调试不用折腾端口映射,你可以在虚拟机设置里把网络改成桥接,然后重启网络服务。
配置静态IP而不是DHCP
DNS服务器必须有一个固定的IP,否则客户端没法填,这是虚拟机装DNS服务器和物理机区别最大的一点,物理机网卡配置一般固定不动,虚拟机如果不做设置,重启后IP可能变。
在终端里编辑网络配置文件,Ubuntu 22.04及以上用netplan:
sudo vim /etc/netplan/01-netcfg.yaml
IP按你的实际网段改):
network:
version: 2
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 192.168.1.1
- 223.5.5.5
保存后执行:
sudo netplan apply
CentOS/RHEL系则修改 /etc/sysconfig/network-scripts/ifcfg-ens33,把 BOOTPROTO=dhcp 改成 BOOTPROTO=static,并追加IP、网关和DNS,然后重启网络:
sudo systemctl restart network
这时候用 ip addr 确认一下IP,顺便 ping baidu.com 测通外网,很多人在这一步卡住,虚拟机DNS服务器配置不上怎么办?先检查IP和网关,再翻下面的排查段。
核心安装步骤:Ubuntu与CentOS双版本
这里给出两个主流系统在虚拟机终端里的完整安装路径,选你正在用的那一个,这也是百度上搜索量最大的疑问:虚拟机安装DNS服务器教程里,命令错一个就全盘崩,所以务必逐行确认。
基于Ubuntu/Debian的BIND9安装
先更新软件包索引:
sudo apt update
然后安装BIND9:
sudo apt install bind9 bind9-utils bind9-doc -y
安装完成后,BIND9的主配置文件在 /etc/bind/,先看目录结构:
ls /etc/bind/
你会看到 named.conf、named.conf.options、named.conf.local 等文件。named.conf 是主入口,一般不动,我们改的是剩下两个。
启动服务并设开机自启:
sudo systemctl enable --now named
检查运行状态:
sudo systemctl status named
如果显示 active (running),说明安装成功,这一步是很多新手最容易忽略的,装完不自启,重启虚拟机DNS服务器就失联了。
基于CentOS/RHEL的bind安装
CentOS系用yum/dnf安装:
sudo yum install bind bind-utils -y
装完后主配置文件在 /etc/named.conf,同样先启动:
sudo systemctl start named sudo systemctl enable named
CentOS上有个额外步骤,很多人会栽跟头:selinux,如果SELinux是 enforcing 状态,可能会拦截BIND9的某些文件访问,临时测试可以关掉:
sudo setenforce 0
但生产环境不建议,正确做法是调整SELinux布尔值,具体看后面故障排查。
验证安装版本和语法
装完别急着配,先确认版本对不对:
named -v
显示类似 BIND 9.18.x 就说明OK。
接着检查配置文件语法:
sudo named-checkconf
没有输出就是没错误,如果有报错,会提示哪一行有问题,按提示改就行。
配置正向DNS解析:修改named.conf文件
安装只是万里长征第一步,核心重头戏在配置里,我们要实现的效果是:客户端把虚拟机的IP填为DNS服务器后,能通过域名解析到内网Web服务器。
编辑named.conf.options
打开 /etc/bind/named.conf.options(Ubuntu)或 /etc/named.conf(CentOS):
sudo vim /etc/bind/named.conf.options
在options块内,修改监听地址和允许查询范围:
options {
directory "/var/cache/bind";
recursion yes;
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
allow-query { any; };
forwarders {
223.5.5.5;
114.114.114.114;
};
dnssec-validation auto;
};
这里的关键点是:
- listen-on:让BIND9监听所有接口的53端口,否则虚拟机终端里服务可能只监听127.0.0.1,外部访问必然失败。
- allow-query:允许所有客户端发起查询,如果你只想特定网段访问,可以改成
{ 192.168.1.0/24; }。 - forwarders:当内网没有对应解析记录时,会把请求转发给上游DNS,这里填了阿里和114的公共DNS,效果不错。
CentOS用户注意,listen-on port 53 这行在named.conf里可能默认是 { 127.0.0.1; },必须改成 any,否则局域网其他机器无法使用你的DNS。
编辑named.conf.local定义区域
在 /etc/bind/named.conf.local(Ubuntu)或直接在 named.conf 末尾(CentOS)追加一个zone:
zone "lab.local" {
type master;
file "/etc/bind/db.lab.local";
};
表示我们要负责维护 lab.local 这个域的权威解析,文件名可以随便起,但路径要对。
创建正向解析数据库文件
把系统的模板拷贝一份来改:
sudo cp /etc/bind/db.local /etc/bind/db.lab.local
然后编辑:
sudo vim /etc/bind/db.lab.local
大致如下:
$TTL 604800
@ IN SOA lab.local. admin.lab.local. (

2026012001 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns.lab.local.
ns IN A 192.168.1.100
www IN A 192.168.1.101
db IN A 192.168.1.102
解释一下:
- SOA:起始授权记录,域名、管理员邮箱(用点代替@)。
- NS:声明该域的DNS服务器主机名。
- A记录:把
www.lab.local解析到168.1.101,把db.lab.local解析到168.1.102。
保存后检查语法:
sudo named-checkzone lab.local /etc/bind/db.lab.local
输出 OK 就过关,然后重载配置:
sudo systemctl reload named
配置反向DNS解析:提供PTR记录
反向解析不是必须的,但如果你的内网有邮件服务器或者业务依赖IP反查域名,就需要配,这里以 168.1.0/24 网段为例。
在 named.conf.local 中追加:
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
};
注意网段写法要反着来,接着创建文件:
sudo cp /etc/bind/db.127 /etc/bind/db.192.168.1
$TTL 604800
@ IN SOA lab.local. admin.lab.local. (
2026012001
604800
86400
2419200
604800 )
;
@ IN NS ns.lab.local.
100 IN PTR ns.lab.local.
101 IN PTR www.lab.local.
102 IN PTR db.lab.local.
这里 100 对应IP 168.1.100,解析出其主机名。
再次检查并重载:
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1 sudo systemctl reload named
防火墙放行53端口:虚拟机终端里的硬门槛
就算BIND9配置全对,防火墙一拦,客户端照样无法用,这一步在虚拟机环境中特别容易漏。
Ubuntu的UFW:
sudo ufw allow 53/tcp sudo ufw allow 53/udp sudo ufw reload
CentOS的firewalld:
sudo firewall-cmd --permanent --add-port=53/tcp sudo firewall-cmd --permanent --add-port=53/udp sudo firewall-cmd --reload
如果不放行,你会在客户端上看到 dig 超时的提示,或者 ping 域名报 server can't find。
测试监听状态:
sudo ss -lnp | grep :53
看到 0.0.1:53 和 168.1.100:53 都在监听,说明防火墙和设备层面都OK了。
客户端验证和常见故障排查
配置全完成后,在另一台虚拟机或宿主机终端里,把DNS改成你新建的服务器IP,然后测试。
nslookup www.lab.local 192.168.1.100
或者用dig:
dig @192.168.1.100 www.lab.local
返回 status: NOERROR 且A记录正确,说明你的内网DNS服务已经生效。
虚拟机DNS服务器配置不上怎么办
如果dig返回 connection timed out,按顺序排查:
- 先
ping 192.168.1.100,不通就去检查虚拟机网络模式和防火墙。 - 通了但超时,去虚拟机上运行
named-checkconf,看看语法有没有错。 - 语法没错,看
systemctl status named,如果服务挂了,查日志:
sudo journalctl -u named -f
或看 /var/log/syslog(Ubuntu)、/var/log/messages(CentOS)。
实际案例中,相当一部分问题出在SELinux,CentOS上如果日志里有 Permission denied,试一下:
sudo setsebool -P named_write_master_zones 1
这个命令允许BIND9写主zone文件,是我见过的高频修复项之一,不过这只是众多解法中的一种,具体还是以错误日志为准。
虚拟机装DNS服务器和物理机区别
练习用的虚拟机性能和物理机没法比,但在DNS这个场景下,区别不在性能,而在IP稳定性,物理机IP基本固定,虚拟机如果你不小心把网络模式从桥接改回NAT,或者重启后DHCP分配了新IP,客户端那边需要跟着改,行业共识,把虚拟机的IP在路由器上做静态绑定,是解决这个对比场景里最有用的手段。
几个实用建议
内存分配:BIND9占用的内存不大,但也不是不吃内存,虚拟机至少分配512MB给DNS专用,如果同时跑Web服务,1GB起步,在虚拟机设置里调整内存后,记得重启。
配置备份:在改动 named.conf.local 前,养成备份习惯:
sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.bak
这个习惯在测试环境无所谓,一旦你在公司或生产机上操作,救命的概率很大。
常见问题Q&A
问:内网DNS服务器搭建价格高吗,商用和自建怎么选?
自建的话,成本只有虚拟机的硬件资源,内存、CPU带宽共享宿主机,基本是零额外花费,如果买商业内网DNS软件或云服务,视功能和节点数不同,价格从每年几百元到数千元不等,自建能学到完整的解析流程和控制权,但维护成本高,需自己处理高可用和安全问题;商用方案省心但花钱,对多数中小企业来说,先自建一台BIND9撑起内网解析是主流路线,后续规模大了再考虑冗余或商业化产品。
问:虚拟机里的DNS服务器重启后总是失效,怎么解决?
先确认你设置了静态IP而不是DHCP,这是重启后失效的主要原因,其次确认named服务已设为开机自启,Ubuntu用 systemctl enable named,CentOS用 systemctl enable named,最后打开/etc/resolv.conf看看,如果里面被NetworkManager自动改写了,可以在netplan或ifcfg文件里配置DNS,或者用 nmcli 把它设为manual。
问:BIND9和dnsmasq在虚拟机上选哪个更适合内网环境?
如果只做单纯的域名解析、客户端数量不多,dnsmasq更轻量,配置也简单,但如果涉及多区域、子域授权、增量传输这类复杂需求,BIND9更合适,选择依据是需求复杂度:测试学习用dnsmasq足够,正式环境或未来要扩展的场景建议直接用BIND9,免得后续迁移成本高。
虚拟机终端里折腾DNS服务器,最大的成就感不是敲完命令,而是当你从宿主机或另一台虚拟机用 dig 查到域名成功解析时,概念终于落地了,先按上面步骤把基础跑通,再去研究主从同步、动态更新、日志切割这些进阶玩法,会顺畅得多。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/711684.html




