手把手教你用云主机搭建专属DNS服务器:从入门到实战
你有没有遇到过这种情况?自己管理的几个网站或者内部服务,域名解析总是依赖第三方DNS服务商,每次添加一条记录都要登录繁琐的后台,甚至还要等待几分钟才能生效,又或者,你只是想在家里或公司内部搭建一个纯净无广告的DNS解析环境,让家人或同事上网更快更安全,这些需求用一台云主机就能轻松搞定——自己动手搭建一个专属DNS服务器,不仅完全可控,还能学到很多网络知识。
今天这篇文章,我就以一台最便宜的云主机为例,从零开始,手把手教你如何把一台普通云主机变成一台功能完整的DNS服务器,整个过程不需要你精通Linux内核,也不需要你背诵复杂的命令参数,只要跟着步骤走,半小时内就能跑起来。
一、准备工作:选一台合适的云主机
首先要明确一点:DNS服务并不需要很高的计算资源,哪怕是1核1GB内存的入门级云主机也绰绰有余,如果你已经在使用某云厂商的服务器,直接拿它来搭建即可,如果没有,建议选择离你主要用户群体较近的机房,比如你在国内服务国内用户,就选华东或华北节点。
操作系统方面,推荐使用Ubuntu 20.04或Debian 11,这两个系统的软件源里自带了最成熟的DNS软件BIND(Berkeley Internet Name Domain),安装起来非常方便,CentOS虽然也可以用,但它的默认防火墙策略和yum源配置稍麻烦一些,新手更容易踩坑。
提前记好你的云主机公网IP和内网IP,后面配置的时候会反复用到,确保云主机的安全组或防火墙入方向放行了TCP和UDP的53端口(DNS默认端口),以及SSH的22端口,如果安全组默认是拒绝所有入站,那记得先把这两条规则加进去,否则后面怎么测都连不上。
二、安装BIND9:核心步骤
登录到你的云主机(通过SSH工具,比如Windows自带的PowerShell或者Mac的终端),然后执行以下命令:
sudo apt update sudo apt install bind9 bind9utils bind9-doc -y
安装过程中系统会自动下载并配置BIND9的几个核心组件:named守护进程、rndc控制工具、配置文件模板等,安装完成后,BIND9会自动启动,你可以用以下命令检查它的状态:
sudo systemctl status named
看到绿色的“active (running)”就说明安装成功了,如果没启动,手动执行sudo systemctl start named 即可。
三、理解BIND9的配置文件结构
BIND9的主要配置文件在/etc/bind/ 目录下,最重要的几个文件是:
named.conf:主配置文件,它通过include 语句引用了其他几个配置文件。
named.conf.options:全局选项,比如监听的IP地址、允许哪些客户端递归查询等。
named.conf.local:声明你自己定义的DNS区域(zone),比如你要解析example.com,就在这里定义。
named.conf.default-zones:系统默认的根区、本地回环区等,一般不用动。
初次接触BIND的人最容易被它的语法吓到——花括号、分号、注释风格都是C语言风格的,别怕,你只需要记住:每个配置语句以分号结尾,大括号要成对出现,多复制粘贴几次就熟练了。
四、配置一个简单的正向解析区域
假设你有一个域名mydomain.com,想用这台云主机来解析它的A记录,首先编辑named.conf.local:
sudo nano /etc/bind/named.conf.local
在文件末尾添加如下内容:
zone "mydomain.com" {
type master;
file "/etc/bind/db.mydomain.com";
};这告诉BIND:我负责管理mydomain.com 这个域,并且该域的数据存放在/etc/bind/db.mydomain.com 文件中,接下来我们就创建这个区域文件。
复制BIND自带的模板文件,省得手写太累:
sudo cp /etc/bind/db.local /etc/bind/db.mydomain.com
然后编辑它:
sudo nano /etc/bind/db.mydomain.com
默认模板长这样:
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
@ IN AAAA ::1请把它修改成你自己的内容,比如你的云主机公网IP是123.123.123.123,你想让www.mydomain.com 指向这个IP,同时让主域名mydomain.com 也指向同一个IP:
$TTL 604800
@ IN SOA ns1.mydomain.com. admin.mydomain.com. (
2025032001 ; Serial (格式: YYYYMMDDNN)
604800
86400
2419200
604800 )
;
@ IN NS ns1.mydomain.com.
@ IN A 123.123.123.123
www IN A 123.123.123.123注意几个要点:
- SOA记录中的ns1.mydomain.com. 是这台DNS服务器的名称,必须写全域名(末尾有原点),而且要跟后面NS记录一致。
- Serial号码每次修改文件都要加1,从者从属服务器才能知道有更新。
- 每条记录的第一个字段是主机名称,不带域名后缀,比如www 就代表www.mydomain.com;@ 代表域名本身。
保存文件后,检查配置文件语法:
sudo named-checkconf
如果没有任何输出,说明语法通过,接着检查区域文件:
sudo named-checkzone mydomain.com /etc/bind/db.mydomain.com
看到OK 字样就没问题,最后重启BIND使配置生效:
sudo systemctl restart named
五、测试解析是否正常
你可以使用dig 或nslookup 命令在本地或另一台机器上测试,先在自己云主机上验证:
dig @localhost www.mydomain.com
如果返回了123.123.123.123 的A记录,说明正向解析成功,同理,你也可以在本地电脑上设置这台云主机为DNS服务器来测试——把你的电脑网络设置里的DNS改成云主机的公网IP,然后访问www.mydomain.com 看看能否打开(前提是你已经在云主机上开启了Web服务,或者至少确保防火墙允许了HTTP访问)。
如果你是给自己的局域网搭建DNS,那么内部客户端可以直接使用云主机的内网IP,速度更快且不占用公网带宽。
六、进阶:添加反向解析(PTR记录)
有些场景下需要根据IP查询域名(比如邮件服务器反垃圾校验),那就得配置反向解析区域,假设你的云主机公网IP是123.123.123.123,那么IP对应的反向区域名为123.123.123.in-addr.arpa。
在named.conf.local中添加:
zone "123.123.123.in-addr.arpa" {
type master;
file "/etc/bind/db.123.123.123";
};同样复制模板:
sudo cp /etc/bind/db.127 /etc/bind/db.123.123.123
$TTL 604800
@ IN SOA ns1.mydomain.com. admin.mydomain.com. (
2025032001
604800
86400
2419200
604800 )
;
@ IN NS ns1.mydomain.com.
123 IN PTR ns1.mydomain.com.这里123 代表IP最后一段,PTR 指向你希望解析出的域名,重启BIND后,用dig -x 123.123.123.123 @localhost 就可以验证。
七、安全加固:别让你的DNS变成别人攻击的跳板
搭建DNS后最忌讳的一件事就是:未加任何限制,直接暴露在公网上,很多新手把BIND默认配置直接丢到公网,结果被黑客利用做DNS反射放大攻击,导致云主机被封IP甚至被清退,所以下面几条安全措施必须做:
1、限制递归查询范围:编辑/etc/bind/named.conf.options,在options 块中添加:
allow-query { any; }; // 允许任何人查询你的权威数据
recursion yes; // 开启递归
allow-recursion { 127.0.0.1; 192.168.0.0/16; }; // 只允许本机和内网递归如果你只想做权威DNS(仅解析你自己管理的域名),也可以直接关闭递归:
recursion no;
2、限制区域传输:默认情况下,其他DNS服务器可以请求你的整个区域数据,这可能会泄露内部信息,添加:
allow-transfer { none; }; // 不允许任何主机进行区域传输3、启用DNSSEC:虽然配置稍复杂,但能防止DNS劫持,BIND9默认支持,你可以通过dnssec-enable yes; 和dnssec-validation yes; 开启,同时生成密钥对,新手可以先不急着做,等基础功能稳定后再研究。
4、配置防火墙:除了云厂商的安全组,在云主机内部再加固一层,用ufw或iptables只允许UDP/TCP 53端口来自你信任的IP段。
八、常见问题与排错
无法解析:先用dig @8.8.8.8 www.mydomain.com 确认外部DNS能解析吗?如果外部正常,内部不行,检查你客户端设置的DNS是否指向了正确的IP,以及安全组是否放行。
服务启动失败:查看日志journalctl -u named -n 50 或/var/log/syslog,大部分错误是语法问题,比如漏了分号、花括号不匹配、Serial号码重复。
解析后无法访问网站:你的云主机上是否有Web服务器监听80端口?域名解析只是第一步,HTTP服务需要另外配置。
公网查询返回拒绝:检查allow-query 和listen-on 配置,默认BIND只监听127.0.0.1,需要改成listen-on { any; }; 才能响应公网查询。
九、写在最后
自己用云主机搭建DNS服务器,最大的好处就是自由,你可以为内网设备自定义域名(比如让nas.home 指向你的NAS),可以屏蔽广告域名,还可以免去第三方DNS服务商的费用和限制,对于生产环境的关键业务,还是建议使用成熟的商业DNS服务或者至少做好多节点冗余,毕竟单台云主机挂了会影响所有依赖它的客户端。
但作为学习和家庭/个人项目,这套方案完全够用,我自己的几个域名就是用阿里云上一台99元一年的轻量应用服务器搭建的,跑了快两年没出过问题,如果你在搭建过程中遇到任何奇葩问题,欢迎在评论区留言,我们一起探讨,毕竟,折腾这东西,本身就是乐趣所在。
文章摘自:https://idc.huochengrm.cn/zj/25745.html
评论
羿向秋
回复使用云主机搭建DNS服务器,需先选择云服务提供商,配置网络、安装DNS软件(如BIND或PowerDNS),设置区域文件和转发器,确保安全性与可靠性。
孟姣妍
回复本文详细介绍了如何使用云主机搭建专属DNS服务器,包括准备工作、安装BIND9、配置正向解析、反向解析、安全加固等步骤,适合入门级用户学习。