搭建 DNS 服务器是云主机的常见用途之一,主要用于内网域名解析(如公司内部服务gitlab.company.internal)或搭建公共递归/权威 DNS(如缓存加速、自建根服务器),下面我会分两种场景,给出最简洁、常用的 Ubuntu/Debian 系统操作步骤(CentOS 类似,包名改为bind)。
场景一:搭建一个简单的缓存 + 递归 DNS**(用于上网加速或内网转发)
这是最常见的用法,云主机充当“DNS 代理”,把所有查询转发到上游 DNS(如114.114.114.114 或8.8.8.8),并缓存结果,提升局域网内设备的解析速度。
1、一台云主机(CentOS 7/8 或 Ubuntu 20.04+)
2、开放防火墙的UDP 53 端口(协议: UDP, 端口: 53)
- 阿里云/腾讯云:安全组 → 添加入方向规则,允许 UDP 53
3、确保云主机本身能访问公网
使用dnsmasq 搭建(最轻量,推荐)
1. 安装 sudo apt update && sudo apt install dnsmasq -y # Ubuntu sudo yum install dnsmasq -y # CentOS 2. 编辑配置 /etc/dnsmasq.conf sudo vim /etc/dnsmasq.conf
修改或添加以下关键行:
监听所有网络接口(也可以指定内网IP,如 listen-address=10.0.0.1) bind-interfaces listen-address=0.0.0.0 不读取 /etc/hosts 中的本地域名(可选,防止干扰) no-hosts 上游 DNS 服务器(可以写多个,用空格隔开) server=114.114.114.114 server=8.8.8.8 启用缓存,默认 150 条,这里设为 1000 条 cache-size=1000 允许哪些网段使用此 DNS(重要安全配置,防止被外部滥用) 建议只允许内网段(如 192.168.0.0/16, 10.0.0.0/8)或本机 如果只用内网,此行可不用;若需要公网访问,务必指定 allowed 网段 except-interface=eth0 ## 禁止公网接口
3. 启动并设置开机自启 sudo systemctl restart dnsmasq sudo systemctl enable dnsmasq 4. 验证服务是否正常 sudo ss -tunlp | grep :53 # 应看到 dnsmasq 在 53 端口 dig @localhost baidu.com # 测试本机查询,应返回正确结果 或远程测试: dig @云主机公网IP baidu.com (需确保防火墙放行 UDP 53)
>安全提示:dnsmasq 默认不限制来源 IP。务必在配置中通过interface= 或except-interface= 限制只允许内网使用,否则你的云主机可能变成“开放 DNS 解析器”,被用于 DDoS 放大攻击,导致云厂商封禁或高额账单。
场景二:搭建权威 DNS**(管理自己的域名,如example.com)
如果你想用这台云主机作为自己域名的NS 服务器(ns1.example.com),让全球用户通过这台机器查询你的域名解析,需要用BIND 9。
1. 安装 BIND9 sudo apt update && sudo apt install bind9 bind9utils bind9-doc -y 2. 配置主文件 /etc/bind/named.conf.options sudo vim /etc/bind/named.conf.options参考:
options {
directory "/var/cache/bind";
listen-on { any; }; // 监听所有IP
listen-on-v6 { any; };
recursion no; // 权威DNS不处理递归查询
allow-query { any; }; // 允许所有人查询(因为你要公开服务)
allow-transfer { 从DNS服务器IP; }; // 禁止区域传送,除非有从DNS
dnssec-validation auto;
};注意:recursion no 和allow-query { any; } 同时设置时,你的服务器成为开放权威服务器,只回答它知道自己授权的域名(比如example.com),不转发其他域名查询,这样相对安全。
3. 定义区域(zone)/etc/bind/named.conf.local sudo vim /etc/bind/named.conf.local
添加你自己的域名区域:
zone "example.com" {
type master;
file "/etc/bind/db.example.com"; // 区域文件路径
allow-update { none; };
};4. 创建区域文件(DNS 记录) sudo vim /etc/bind/db.example.com参考(SOA + 记录):
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025032001 ; 序列号 (YYYYMMDDnn)
3600 ; 刷新时间
1800 ; 重试时间
604800 ; 过期时间
86400 ) ; 最小 TTL
;
; 名称服务器
@ IN NS ns1.example.com.
ns1 IN A 云主机公网IP
;
; A 记录(解析 www 等)
www IN A 123.123.123.123
api IN A 123.123.123.1245. 检查配置语法并重启 sudo named-checkconf sudo named-checkzone example.com /etc/bind/db.example.com sudo systemctl restart bind9 sudo systemctl enable bind9 6. 防火墙放行 UDP 53 7. 在你的域名注册商(如阿里云、GoDaddy)将域名的 NS 记录改为 ns1.example.com,并添加对应的 A 记录指向云主机 IP 8. 等待全球 DNS 缓存更新(24-48 小时)
| 你的需求 | 推荐方案 | 特点 |
| 内网/局域网域名解析,上网加速 | dnsmasq | 轻量、简单、一键启用 |
| 公开管理自己的域名(权威服务器) | BIND9 | 功能强大,标准协议 |
| 高性能递归/缓存,替代公共DNS | unbound | 安全、支持 DNSSEC |
| 不想自己维护,纯内网转发 | CoreDNS (K8s 常用) | 灵活,但学习曲线稍高 |
1、永远不要开放一个没有限制的递归 DNS 到公网(即recursion yes +allow-query { any; }),这会被 DDoS 放大攻击滥用,几分钟内你的云主机流量就会打满,并收到云厂商的封禁通知。
2、如果只是内网使用,务必在安全组中将入方向 UDP 53 的来源 IP 设置为内网段(如10.0.0.0/8 或你的 VPC CIDR)。
3、定期更新软件包,防止已知漏洞。
4、监控 DNS 查询量(dnsmasq 可通过日志或iptables 统计)。
内网用:装dnsmasq,限制来源 IP,配上游 DNS。
自建 NS:装bind9,写区域文件,关闭递归,只开放 UDP 53。
如果你能告诉我你的具体场景(内网加速 / 公开权威解析)、云厂商和操作系统,我可以帮你进一步优化配置。
文章摘自:https://idc.huochengrm.cn/zj/25320.html
评论