自己搭建域名解析服务器,核心步骤是:选系统装BIND、写配置、加记录、设防火墙、改上游转发,最后用dig和nslookup验证生效。这件事没想象中那么神秘,但确实需要动一番手脚。
动手前必须想清楚的三件事
你到底要解决什么问题
很多人来找我,说想自己搞DNS服务器,我先泼盆冷水:你得先搞清楚自己属于哪种场景。
- 场景A:内网加速,公司几十台电脑,平时访问内部系统每次都要记IP,麻烦,你想让内网机器通过域名互相访问,这属于内网DNS解析需求。
- 场景B:省钱替代,你手里有几个域名,觉得简米云或Cloudflare的解析太贵,想自己控制,这属于自建公网权威DNS。
- 场景C:网络加速,你觉得运营商自带的DNS解析慢,想搞个本地缓存加速,这叫递归DNS服务器。
这三种场景的搭建方法完全不同,下文我会重点拆解场景A和场景C,因为场景B涉及公网权威托管,需要固定IP和备案,个人玩起来门槛高且容易出安全问题。
你需要的硬件和心理准备
业内专家指出,自建DNS服务器对硬件要求低到令人发指,随便一台1核1G的云服务器或者树莓派就能扛住小规模流量,系统建议选Debian 11/12或Ubuntu 22.04 LTS,别用CentOS了,它已经停止维护了。
你需要提前准备好:
- 一个固定的内网IP(比如192.168.1.10)
- 一个干净的域名(内网场景可以用假域名如
home.local,公网场景必须是备案过的真域名) - 基本的Linux命令行操作能力,会
vim或者nano编辑文件
核心安装与配置全流程
第一步:装好BIND9
BIND9是Linux世界最老牌的DNS软件,没有之一,它的配置逻辑非常简单:先安装,再改配置文件,然后重启服务。
sudo apt update sudo apt install bind9 bind9utils bind9-doc -y
装完之后,顺便检查一下版本,确保装的是9.16以上的版本。
named -v
在Ubuntu上,BIND9的配置文件放在/etc/bind/目录下,核心文件是named.conf,但它会把其他配置include进来,我们只需要关注下面这几个:
named.conf.options全局选项,比如监听地址、转发器
named.conf.local定义你需要解析的zone区域named.conf.default-zones默认的本地解析区,一般不用动
第二步:修改监听地址和转发器(这是重头戏)
我用vim编辑named.conf.options,先把监听地址从0.0.1改成本机IP,让局域网其他电脑也能访问,同时允许局域网网段查询。
sudo vim /etc/bind/named.conf.options
把listen-on那几行反注释并改成:
listen-on port 53 { 127.0.0.1; 192.168.1.10; };
allow-query { localhost; 192.168.1.0/24; };
关键点是转发器,如果你只做了权威解析,不设置转发器,那么这台DNS服务器无法帮你解析任何外部网站,设置转发器就能实现“内网域名自己解析,外部域名转发给上游”。
forwarders {
223.5.5.5;
119.29.29.29;
};
这里用了两个国内公共DNS作为上游,比直接用8.8.8.8快且稳,行业共识认为,给国内的服务器配国内的转发器,解析速度能有肉眼可见的提升。
保存退出后,用named-checkconf检查语法,这个命令会用一行行输出提示你哪里写错了。
sudo named-checkconf
如果没有任何输出,说明配置正确,继续下一步。
第三步:创建自己的解析区域文件
这一步就是让DNS服务器“认识”你的内网域名,编辑named.conf.local:
sudo vim /etc/bind/named.conf.local
在文件末尾追加如下内容,定义home.local这个内网域名的解析区:
zone "home.local" {
type master;
file "/etc/bind/db.home.local";
};
然后创建一个新的区域文件,最快捷的方法是把默认的db.local复制一份再改:
sudo cp /etc/bind/db.local /etc/bind/db.home.local sudo vim /etc/bind/db.home.local
修改成类似这样:
$TTL 604800
@ IN SOA ns.home.local. admin.home.local. (
2 ; Serial
604800 ; Refresh

86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns.home.local.
ns IN A 192.168.1.10
router IN A 192.168.1.1
nas IN A 192.168.1.20
printer IN A 192.168.1.30
这个文件很好懂:ns.home.local就是这台DNS服务器自己,router是你的路由器IP,nas是群晖的IP,printer是打印机的IP,以后你直接在浏览器里输入nas.home.local就能进群晖后台了。
改完后,用named-checkzone验证一下区域文件:
sudo named-checkzone home.local /etc/bind/db.home.local
看到OK就说明没问题,重启BIND9服务使配置生效:
sudo systemctl restart bind9 sudo systemctl enable bind9
第四步:防火墙千万别忘了
大多数云服务器的防火墙默认是关闭UDP 53端口的,如果只改配置不开放端口,局域网其他电脑根本连不上来。
sudo ufw allow 53/tcp sudo ufw allow 53/udp sudo ufw reload
如果是云服务器,还需要去云控制台的安全组里把入站规则放行UDP 53和TCP 53端口,这一步经常有人卡住,排错时记得先查这边。
验证你的配置是否真的生效
本机测试是检验真理的唯一标准
先在DNS服务器本机上测试,用dig命令查看nas.home.local是否能解析出IP:
dig nas.home.local @127.0.0.1
输出的ANSWER SECTION里如果出现了168.1.20,说明权威解析成功,再测试一下外网解析是否正常:
dig baidu.com @127.0.0.1
如果能看到百度的IP,说明转发器配置成功。
局域网客户端接入测试
在Windows电脑上,打开网络适配器设置,把DNS服务器改成本机IP,比如168.1.10,然后打开命令行工具,输入:
nslookup printer.home.local
如果系统返回IP地址,就大功告成了,不过你还需要把路由器DHCP里的DNS分配地址改成我们搭建的服务器IP,这样局域网内所有设备自动获得的DNS就是它了,不需要每台电脑手动改。
你以为这就完了?别忘了这些坑
系统更新和持久化
BIND9是随系统启动的,但你的系统防火墙规则可能会在重启后全丢,建议把ufw规则持久化保存:
sudo sh -c "echo '@reboot /usr/sbin/ufw reload' >> /var/spool/cron/crontabs/root"
日志排错不丢人
碰到问题看日志最快:
sudo tail -f /var/log/syslog | grep named
如果显示permission denied,看看/etc/bind目录的权限;如果显示no server could be reached,先ping网关再ping上游DNS。
家用场景的功耗与噪音
如果你用树莓派或者旧笔记本当DNS服务器,一年电费大约几十块钱,比买专业DNS设备划算得多,但需要注意SD卡的寿命,建议把系统装在外接硬盘或固态U盘上。
与云解析相比怎么选
内网DNS服务器搭建教程虽然看起来步骤多,但整体下来只需要一小时左右,而如果你只是想给公网域名做解析,其实直接用云服务商提供的免费解析就能解决问题,不需要自建,自建公网解析还要考虑域名解析服务器价格,比如一台入门级云服务器一年大概几百元,加上域名续费,总成本并不比云解析便宜多少。
家用DNS服务器配置方法更适合那些有内网加速需求、或者想彻底掌控日志和黑名单的玩家,只要你的计算机基础操作没问题,按上面步骤操作基本不会翻车。
常见问题速查手册
为什么其他电脑无法解析我的域名?
先去检查防火墙是否开放了UDP 53端口,然后确认named.conf.options里的allow-query是否包含客户端网段,如果这两个都没问题,再看客户端电脑的DNS设置是否真的指向了你的服务器IP。
配置了内网解析,但外网域名解析不了?
优先检查forwarders配置是否生效,用dig baidu.com @你的服务器IP测试一下,如果报status: SERVFAIL,说明转发器那行没写对,或者上游DNS拒绝递归查询,可以尝试把转发器改成5.5.5。
每次重启服务器后,配置就丢了?
用systemctl enable bind9确保服务开机自启,同时检查你用的系统是不是云服务器镜像,有些镜像会有还原机制,需要把配置文件同步备份到挂载的数据盘里。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/757495.html





