服务器搭建私有DNS:零基础在服务器上搭建私有DNS,秒懂配
零基础在服务器上搭建私有DNS,秒懂配置与排错
假设你有一台 Linux 服务器(本文以 Ubuntu 22.04 为例),希望在内网里通过自定义域名访问其他设备,或者想为本地开发环境提供稳定的域名解析。
最直接的方法就是自己在服务器搭建私有 DNS,不用依赖外部 DNS 服务商。
这篇教程会让你从头到尾跑通流程。
适用场景与准备工作
- 适用场景:公司内网、家庭实验室、开发测试环境,需要将
dev.mycompany.local之类的域名解析到内网 IP。 - 准备条件:
- 一台运行 Ubuntu/CentOS 的服务器(IP 假设为
192.168.1.100,后面会用到)。 - root 或 sudo 权限。
- 系统已开通对外 UDP 53 端口(防火墙允许)。
- 核心工具:BIND(Berkeley Internet Name Domain)——最流行的开源 DNS 服务器软件。
安装 BIND9 与基本配置
1. 安装 BIND9
sudo apt update
sudo apt install bind9 -y安装完成后,BIND 会自动启动。
检查状态:
sudo systemctl status bind9如果看到 active (running) 说明安装成功。
2. 修改主配置文件 named.conf.options
编辑 /etc/bind/named.conf.options,在 options 块中增加监听任意地址并允许局域网内所有机器查询:
options {
directory "/var/cache/bind";
listen-on { any; }; # 监听所有网卡
listen-on-v6 { any; };
allow-query { 192.168.1.0/24; }; # 只允许内网段,可按需修改
recursion yes; # 开启递归查询(也可转发到上游)
forwarders { 8.8.8.8; 114.114.114.114; }; # 外部DNS转发
dnssec-validation auto;
}; 避坑:如果不设置 allow-query,默认只允许本机查询;内网其他机器无法使用。3. 添加我们自己域名解析的区域
编辑 /etc/bind/named.conf.local,追加以下内容:
zone "example.local" {
type master;
file "/etc/bind/db.example.local";
};然后创建区域文件 /etc/bind/db.example.local:
$TTL 604800
@ IN SOA ns1.example.local. admin.example.local. (
20250101 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.example.local.
ns1 IN A 192.168.1.100
www IN A 192.168.1.101说明:example.local 是你自定义域名(别用真实一级域名);ns1 是这台 DNS 服务器的主机名;www 是一条 A 记录,指向内网另一台机器。
4. 检查配置并重启 BIND
sudo named-checkconf
sudo named-checkzone example.local /etc/bind/db.example.local
sudo systemctl restart bind9如果没有任何错误输出,配置就生效了。
客户端测试与注意事项
测试本机解析
在服务器上执行:
dig @127.0.0.1 www.example.local应该能看到 www.example.local. 60480 IN A 192.168.1.101 的结果。
其他内网机器使用这台 DNS
把客户端的 DNS 服务器改为 192.168.1.100。
在 Linux 上可以修改 /etc/resolv.conf:
nameserver 192.168.1.100或在路由器 DHCP 选项中设置。
之后 ping www.example.local 就能 ping 通。
高频问题排解
Q1:客户端无法解析,但服务器可以?
- 防火墙:确认服务器 UDP 53 端口已放行(
sudo ufw allow 53)。 - allow-query:检查 named.conf.options 里是否包含了客户端所在网段。
Q2:重启 BIND 后提示 permission denied?
通常是因为区域文件的权限不正确。
区域文件属于 bind 用户:
sudo chown bind:bind /etc/bind/db.example.local
sudo chmod 644 /etc/bind/db.example.localQ3:与系统自带的 systemd-resolved 冲突怎么办?
Ubuntu 默认会监听 53 端口。
要避免冲突,可以关闭 systemd-resolved:
sudo systemctl disable --now systemd-resolved然后修改 /etc/resolv.conf 指向本机 BIND 或外部 DNS。
Q4:本机能解析,但无法上互联网?
检查 forwarders 是否填写了公网 DNS(如 8.8.8.8)。
如果写了转发器,BIND 会帮你递归解析外部域名。
如果没写,记得开启 recursion yes。
总结
现在你已经成功在服务器搭建私有 DNS,并且可以自定义内网域名。
整个流程的核心是:安装 BIND → 配置监听与查询权限 → 添加区域 → 创建解析记录 → 验证。
遇到问题优先检查防火墙、权限和配置文件语法。
如果你正在处理服务器搭建私有 DNS 的需求,建议按本文步骤完整执行,再根据自己的环境微调。