服务器搭建私有DNS:手把手实战:在服务器上搭建私有DNS服
如果你正在寻找一份可直接落地的服务器搭建私有DNS教程,这篇文章就是为你准备的。
我会用BIND9这套经典软件,从零开始,把安装、配置、启动到验证的每个步骤写清楚,连报错怎么处理也一并说明。
前置准备
- 一台Linux服务器(推荐CentOS 7/8或Ubuntu 20.04以上)。
- root权限或具备sudo权限的用户。
- 安全组/防火墙提前放行UDP 53端口和TCP 53端口。
- 固定的公网或内网IP(假设你的服务器IP是
192.168.1.100)。 - 了解DNS基本概念:域名解析就是把
example.com这样的名字翻译成IP地址。
如果你用的是宝塔面板,请先通过SSH登录服务器操作,宝塔后台暂不提供BIND9一键安装。
分步操作
1. 安装BIND9
CentOS/RHEL系:
sudo yum install -y bind bind-utilsUbuntu/Debian系:
sudo apt update
sudo apt install -y bind9 bind9utils2. 编辑主配置文件
BIND9主配置文件在 /etc/named.conf(CentOS)或 /etc/bind/named.conf(Ubuntu)。
用vim打开:
sudo vim /etc/named.conf在 options 段内修改或添加以下内容(注意替换IP):
options {
listen-on port 53 { any; }; # 监听所有网卡
listen-on-v6 port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
allow-query { any; }; # 允许所有客户端查询
recursion yes; # 开启递归(如需转发上游DNS需额外配置)
};在文件末尾添加一个正向解析区声明(假设你要解析 mydomain.local):
zone "mydomain.local" IN {
type master;
file "mydomain.local.zone";
allow-update { none; };
};3. 创建区域文件
进入工作目录并创建区域文件:
cd /var/named
sudo vim mydomain.local.zone写入以下内容(请将IP替换为你的服务器IP和实际域名):
$TTL 1H
@ IN SOA ns1.mydomain.local. admin.mydomain.local. (
2025022701 ; serial
1H ; refresh
15M ; retry
1W ; expire
1H ) ; minimum
IN NS ns1.mydomain.local.
ns1 IN A 192.168.1.100
www IN A 192.168.1.100
test IN A 192.168.1.101
- SOA记录中的序列号(serial)每次修改文件都要递增,否则从服务器可能不更新。
- 这里我们只做了正向解析,反向解析(PTR)暂不涉及。
4. 检查配置文件语法
sudo named-checkconf /etc/named.conf
sudo named-checkzone mydomain.local /var/named/mydomain.local.zone无输出即正确;
有错误则根据提示修正。
5. 启动并设置开机自启
sudo systemctl start named
sudo systemctl enable named
sudo systemctl status named如果看到 active (running) 表示启动成功。
6. 配置防火墙(放行DNS端口)
CentOS 7+ / firewalld:
sudo firewall-cmd --add-port=53/udp --permanent
sudo firewall-cmd --add-port=53/tcp --permanent
sudo firewall-cmd --reloadUbuntu / ufw:
sudo ufw allow 53/udp
sudo ufw allow 53/tcp
sudo ufw reload避坑指南
- 权限问题:区域文件
mydomain.local.zone所有者和组必须是named,权限640。如果权限不对,BIND9无法读取:
sudo chown named:named /var/named/mydomain.local.zone
sudo chmod 640 /var/named/mydomain.local.zone- SELinux拦截:CentOS默认开启SELinux,可能导致BIND9无法读取区域文件。可以先临时关闭测试:
sudo setenforce 0若正常工作,再要么永久关闭(不推荐)要么正确设置上下文:
sudo semanage fcontext -a -t named_zone_t "/var/named/mydomain.local.zone"
sudo restorecon -v /var/named/mydomain.local.zone- 端口被占用:检查53端口是否被systemd-resolved或dnsmasq占用,执行
sudo lsof -i :53查看,若冲突则先停用冲突服务。
高频问题解答
Q1:客户端怎么用我的私有DNS?
A:在客户端网络设置中,将首选DNS服务器修改为你的服务器IP(如 192.168.1.100)。Windows:控制面板→网络和Internet→网络连接→右键属性→IPv4→使用下列DNS服务器地址。
Q2:想添加更多域名或记录怎么办?
A:编辑区域文件 /var/named/mydomain.local.zone,添加类似 newhost IN A 192.168.1.102 的行,然后递增SOA序列号,再执行 sudo rndc reload 重新加载配置即可。
Q3:BIND9启动失败,日志提示 permission denied?
A:参照上述权限与SELinux解决方法。可以查看日志 journalctl -u named -n 20 获取具体报错。
Q4:我已经配置了转发,为什么不能解析外网域名?
A:需要在 named.conf 的 options 段中添加 forwarders { 8.8.8.8; 114.114.114.114; }; 并删除或注释掉 forward only;(如果只做权威解析则不需要)。同时确保 recursion yes;。
效果验证
在服务器本机或者任意一台配置了私有DNS的客户端执行:
nslookup www.mydomain.local 192.168.1.100或者使用dig:
dig @192.168.1.100 www.mydomain.local如果返回 192.168.1.100 则解析成功。
你也可以用 ping www.mydomain.local 测试连通性。
完成以上步骤,你就成功在服务器上搭建了私有DNS。
后续可以根据需要增加更多记录或配置反向解析。
如果你在操作中遇到本文未提及的问题,欢迎在评论区留言,我会第一时间帮你排查。