在虚拟机里安装DNS服务器,核心就三步:选对系统、配好虚拟网络、把正向和反向解析区文件写对。 下面按实操顺序拆开讲,命令和路径都能直接照抄。
虚拟机里安装DNS服务器之前,先把网络想明白
很多人装完BIND或者Windows DNS角色,本机dig能通,换台机器就解析失败,问题九成不在DNS软件,而在虚拟机网络模式。
三种网络模式的实际差别
- 桥接模式:虚拟机和宿主机在同一网段,局域网内其他电脑可以直接把DNS指向虚拟机IP,适合真实内网环境。
- NAT模式:虚拟机对外访问正常,但外部机器访问不进来,需要做端口转发,适合单机练手。
- 仅主机模式:只有宿主机和虚拟机互通,搭实验环境最安全,不会污染公司现网。
IP必须固定
DNS服务器地址一旦变化,所有客户端的解析都会断,Linux下用netplan或nmcli配静态IP,Windows在网卡属性里手动填,顺手把网关和DNS本身配好,比如Ubuntu的/etc/netplan/01-netcfg.yaml里写:
network:
version: 2
ethernets:
ens33:
addresses: [10.10.10.53/24]
routes:
- to: default
via: 10.10.10.1
nameservers:
addresses: [223.5.5.5]
改完执行sudo netplan apply,再用ip addr确认地址生效。
虚拟机里装DNS服务器,Windows Server和Linux哪个更省事
这是搜索量很高的对比问题,答案取决于你用不用Windows域环境。
| 对比维度 | Linux + BIND9 | Windows Server DNS |
|---|---|---|
| 软件成本 | 开源免费 | 需Windows Server授权,按核心计费 |
| 配置方式 | 手写配置文件 | 图形界面为主,也有PowerShell |
| 与AD集成 | 不支持 | 原生支持动态更新 |
| 资源占用 | 内存占用低,1核1G可跑 | 建议2核4G以上 |
| 学习曲线 | 前期陡,后面稳定 | 上手快,排错依赖事件查看器 |
业内专家指出,纯内网域名解析、分流广告域名、做测试环境,BIND足够;如果公司已经在跑Active Directory,直接用Windows DNS角色能省掉大量手工同步工作。
Linux虚拟机搭建DNS服务器详细步骤(以Ubuntu 22.04为例)
安装BIND9
sudo apt update sudo apt install bind9 bind9utils bind9-doc -y
装完先看服务状态:systemctl status named。
改主配置
在/etc/bind/named.conf.options里设转发器,让内网查不到的公网域名交给上游:
options {
directory "/var/cache/bind";
recursion yes;
allow-query { 10.10.10.0/24; 127.0.0.1; };
forwarders { 223.5.5.5; 8.8.8.8; };
dnssec-validation auto;
listen-on { 127.0.0.1; 10.10.10.53; };
};
在/etc/bind/named.conf.local声明区域:
zone "lab.local" {
type master;
file "/etc/bind/db.lab.local";
};
zone "10.10.10.in-addr.arpa" {
type master;
file "/etc/bind/db.10.10.10";
};
写正向解析文件
复制模板sudo cp /etc/bind/db.local /etc/bind/db.lab.local,再改成:
$TTL 604800
@ IN SOA ns.lab.local. admin.lab.local. (
2 604800 86400 2419200 604800 )
@ IN NS ns.lab.local.
ns IN A 10.10.10.53
www IN A 10.10.10.20
写反向解析文件
$TTL 604800
@ IN SOA ns.lab.local. admin.lab.local. (
2 604800 86400 2419200 604800 )
@ IN NS ns.lab.local.
53 IN PTR ns.lab.local.
20 IN PTR www.lab.local.
校验并重启
sudo named-checkconf sudo named-checkzone lab.local /etc/bind/db.lab.local sudo systemctl restart named ss -tulnp | grep :53
防火墙放行
sudo ufw allow 53/tcp && sudo ufw allow 53/udp,云主机还要在安全组里开53端口。
客户端验证
在另一台机器上执行nslookup www.lab.local 10.10.10.53,返回10.10.10.20就算成功,反向查询用nslookup 10.10.10.20。
Windows Server虚拟机怎么做
打开服务器管理器,添加角色和功能,勾选DNS服务器,一路下一步,命令行等价操作是:
Install-WindowsFeature -Name DNS -IncludeManagementTools
安装完在DNS管理器里右键正向查找区域,新建主要区域,选“主要区域”并允许安全动态更新,然后在区域里新建主机记录,填www对应10.10.20,反向区域按网段建,输入网络ID10.10即可自动生成。
转发器在DNS管理器服务器属性里配置,填上游公共DNS,客户端把网卡的首选DNS改成虚拟机IP,用ipconfig /flushdns清缓存后测试。
虚拟机搭建内网DNS服务器最容易踩的五个坑
- 53端口被systemd-resolved占用:Ubuntu桌面版常见,执行
sudo systemctl disable --now systemd-resolved,或把它改成监听127.0.0.53之外的地址。 - 序列号没加导致不生效:改区域文件后,SOA里的Serial必须递增,否则从服务器不拉新数据。
- 忘了开递归限制:对外暴露的DNS如果允许任意查询,容易被拿去做DNS放大攻击。
allow-query和allow-recursion都要收紧到内网段。 - 客户端还指着旧DNS:Windows用
ipconfig /all确认实际使用的DNS,Linux看/etc/resolv.conf,被NetworkManager覆盖就改/etc/systemd/resolved.conf。 - 区域传送没做限制:
allow-transfer { none; };在主从上加白名单,避免域名列表被陌生人拉走。
自建DNS服务器的成本大概是多少
软件本身不花钱,BIND、Unbound、PowerDNS都是开源项目,真正的成本在别处:一台常开的虚拟机或小主机,电费按月算;要对外提供解析,得占用公网IP并做端口映射,Windows Server方案则涉及授权费用,具体价格随版本和采购渠道浮动,中小企业通常按用户数或核心数评估,行业共识认为,纯粹的内网解析需求没必要上商业DNS产品,BIND的性能足够撑住几千台终端。
关于虚拟机里安装DNS服务器的常见疑问
虚拟机里安装DNS服务器会影响宿主机上网吗
只要宿主机的网卡DNS没有指到虚拟机,就不会,风险点在于虚拟机网络模式选错,比如桥接后把公司DHCP分配的地址冲突了,建议实验阶段用仅主机模式,DNS只服务虚拟网段。
虚拟机里的DNS服务器能解析公网域名吗
能,靠转发器实现,BIND的forwarders把非本地区域请求转给上游DNS,返回结果会缓存,第二次查询更快,前提是虚拟机自身能上网,且recursion开着、allow-recursion包含内网网段。
装完DNS服务器为什么ping域名不通
按顺序排查:ss -tulnp | grep :53看服务是否监听;nslookup 域名 DNS服务器IP绕过本机配置直连测试;检查区域文件名与named.conf.local里写的是否一致;最后看防火墙和SELinux,多数情况下问题出在区域文件的Serial没改或者客户端缓存没清。
虚拟机里安装DNS服务器的本质,是把一台机器变成内网的名字翻译官,网络配置和区域文件这两处写对了,后面基本不会再折腾。先把IP固定、端口放行、Serial递增这三件事做扎实,比反复重装系统有效得多。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/797174.html


