自建DNS服务器(基于Bind9)
发表于:2025-11-26 12:07:58浏览:18次
作为程序员+新手父亲,自建DNS服务器可用于家庭网络加速、广告过滤、隐私保护(避免ISP劫持),或开发/测试环境的域名解析管理。
Bind9是互联网主流的DNS服务器软件,支持A记录、CNAME、MX、TXT等所有DNS记录类型,适合需要自定义复杂解析规则的开发/测试环境(如本地域名 dev、test 指向开发机)。
1. 安装Bind9(Ubuntu)
# 安装Bind9及管理工具
sudo apt update && sudo apt install -y bind9 bind9utils bind9-doc
# 验证安装成功
sudo systemctl status named # 输出 active (running) 即为成功
2. 核心配置(3个关键文件)
Bind9配置文件路径:/etc/bind/,核心文件如下:
(1)主配置文件:named.conf.options(DNS全局设置)
sudo nano /etc/bind/named.conf.options
添加以下配置(启用递归查询、允许内网访问、设置上游DNS):
options {
directory "/var/cache/bind";
recursion yes; # 允许递归查询(客户端获取DNS解析结果)
allow-recursion { 192.168.1.0/24; 127.0.0.1; }; # 仅允许内网和本地访问(避免被滥用)
listen-on { 192.168.1.100; 127.0.0.1; }; # 监听服务器IP(替换为你的服务器内网IP)
forwarders { # 上游DNS服务器(推荐Cloudflare)
1.1.1.1;
1.0.0.1;
};
dnssec-validation auto; # 自动DNSSEC验证(增强安全性)
auth-nxdomain no; # 禁用无效域名响应
listen-on-v6 { any; };
};
(2)区域配置文件:named.conf.local(添加自定义域名区域)
sudo nano /etc/bind/named.conf.local
添加本地域名区域(如 dev 域,指向开发环境):
# 正向解析区域:将域名转换为IP
zone "dev" {
type master;
file "/etc/bind/zones/db.dev"; # 解析记录文件路径
};
# 反向解析区域(可选):将IP转换为域名
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.192.168.1";
};
(3)解析记录文件:创建正向/反向解析文件
创建区域文件目录:
sudo mkdir -p /etc/bind/zones正向解析文件(
db.dev):sudo nano /etc/bind/zones/db.dev添加以下内容(自定义域名→IP映射):
$TTL 604800 # 缓存时间(7天) @ IN SOA ns.dev. admin.dev. ( 2024050101 ; Serial(版本号,修改后递增) 604800 ; Refresh(刷新时间) 86400 ; Retry(重试时间) 2419200 ; Expire(过期时间) 604800 ) ; Negative Cache TTL(否定缓存时间) ; @ IN NS ns.dev. # 名称服务器记录 ns IN A 192.168.1.100 # ns.dev 指向DNS服务器IP test IN A 192.168.1.200 # test.dev 指向开发机IP api IN A 192.168.1.201 # api.dev 指向API服务器IP www IN CNAME test.dev. # www.dev 别名指向 test.dev反向解析文件(
db.192.168.1,可选):sudo nano /etc/bind/zones/db.192.168.1添加以下内容(IP→域名映射):
$TTL 604800 @ IN SOA ns.dev. admin.dev. ( 2024050101 604800 86400 2419200 604800 ) ; @ IN NS ns.dev. 100 IN PTR ns.dev. # 192.168.1.100 → ns.dev 200 IN PTR test.dev. # 192.168.1.200 → test.dev
3. 验证配置并启动服务
# 检查配置文件语法错误
sudo named-checkconf /etc/bind/named.conf.local
sudo named-checkzone dev /etc/bind/zones/db.dev # 验证正向区域
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1 # 验证反向区域
# 重启Bind9服务
sudo systemctl restart named
# 设置开机自启
sudo systemctl enable named
4. 测试DNS解析(关键步骤)
在客户端(开发机或本地电脑)执行以下命令,验证解析是否生效:
# 测试自定义域名解析(替换为你的服务器IP和域名)
nslookup test.dev 192.168.1.100
# 预期输出:Address: 192.168.1.200(与配置文件一致)
# 测试公网域名解析(验证上游DNS是否正常)
nslookup www.baidu.com 192.168.1.100
# 预期输出:百度的IP地址
5. 运维要点
- 查看日志:
sudo tail -f /var/log/syslog | grep named(排查解析错误) - 新增域名:修改
db.dev文件,递增Serial版本号,执行sudo rndc reload重载配置 - 备份配置:定期备份
/etc/bind/目录(避免配置丢失) - 防火墙开放:如果启用UFW,需允许53端口(DNS默认端口):
sudo ufw allow 53/tcp sudo ufw allow 53/udp sudo ufw reload
四、关键注意事项
安全性:
- 禁止公网访问递归查询(Bind9已通过
allow-recursion限制内网,Pi-hole默认仅允许内网) - 定期更新系统和DNS软件(
sudo apt update && sudo apt upgrade) - 家庭网络使用时,避免将服务器IP暴露到公网(仅用内网静态IP)
- 禁止公网访问递归查询(Bind9已通过
稳定性:
- 服务器建议开启开机自启(Pi-hole和Bind9默认已配置)
- 上游DNS选择2个以上(避免单点故障)
- 家庭网络可搭配路由器DHCP,自动分配DNS服务器IP给设备
儿童网络保护扩展:
- Pi-hole可安装
pihole-FTL插件,支持按设备分组过滤(如儿童设备单独应用严格过滤规则) - 推荐添加家长控制列表:
https://raw.githubusercontent.com/AdguardTeam/AdGuardSDNSFilter/master/Filters/filter.txt
- Pi-hole可安装
五、常见问题排查
客户端无法解析域名:
- 检查服务器防火墙是否开放53端口(TCP/UDP)
- 验证Bind9/Pi-hole服务是否运行(
sudo systemctl status named或sudo systemctl status pihole-FTL) - 客户端是否正确设置DNS为服务器IP(可通过
ipconfig /all(Windows)或cat /etc/resolv.conf(Linux)查看)
公网域名解析失败:
- 检查上游DNS是否可达(
ping 1.1.1.1测试) - 查看日志排查是否被防火墙拦截
- 检查上游DNS是否可达(
按以上方案部署后,即可实现自定义域名解析(开发/测试用)和家庭网络广告过滤(儿童保护),兼顾技术需求和家庭使用场景。如果需要更复杂的配置(如DNS负载均衡、主从复制),可随时补充需求!
TIPS:若更多的是考虑家庭广告拦截或者儿童保护,可考虑使用另一个软件:Pi-hole(家庭首选,广告过滤+简单DNS),以下是使用安装教程
Pi-hole是基于DNS的广告拦截工具,同时具备DNS服务器功能,支持Web界面管理,适合家庭网络(可过滤儿童视频/网站广告、恶意域名)。
1. 一键安装(Ubuntu)
# 更新系统并安装依赖
sudo apt update && sudo apt install -y curl
# 一键安装Pi-hole(全程中文引导)
curl -sSL https://install.pi-hole.net | bash
2. 安装引导配置(关键步骤)
- 选择DNS上游服务器(推荐:Cloudflare DNS
1.1.1.1或 Google DNS8.8.8.8) - 选择阻塞列表(默认即可,后续可在Web面板添加儿童专用过滤列表)
- 同意安装Web管理面板(必须选,方便后续配置)
- 同意安装lighttpd(Web服务器,无需额外配置)
- 记录安装完成后的 管理员密码(用于登录Web面板)
3. 核心配置(Web面板操作)
- 访问Web面板:浏览器输入
http://服务器IP/admin(如http://192.168.1.100/admin) - 登录:输入安装时记录的密码
- 关键配置:
- 添加自定义域名解析(开发/测试用):
- 进入
Local DNS→DNS Records - 新增记录:
域名(如test.dev)→目标IP(如开发机IP192.168.1.200)
- 进入
- 添加儿童广告过滤列表:
- 进入
Group Management→Adlists - 新增列表:
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts(通用广告过滤) - 新增儿童专用列表:
https://raw.githubusercontent.com/CHN-CERT-CC/ChildSafeHosts/master/childsafe.hosts(过滤不良网站)
- 进入
- 修改管理员密码(可选):
- 进入
Settings→System→Password重置
- 进入
- 添加自定义域名解析(开发/测试用):
4. 客户端使用DNS服务器
让家庭设备(手机、电脑、电视、婴儿监控器等)使用自建DNS:
- 方法1:路由器全局配置(推荐)→ 在路由器DNS设置中,将首选DNS改为Pi-hole服务器IP(如
192.168.1.100),备用DNS留空或填1.1.1.1 - 方法2:单设备配置 → 手机/电脑网络设置中,手动设置DNS为服务器IP
5. 运维要点
- 重启Pi-hole:
sudo pihole restartdns - 更新阻塞列表:
sudo pihole -g - 查看查询日志:Web面板 →
Query Log(可监控儿童设备访问的域名) - 重置密码:
sudo pihole -a -p
6. 常见问题排查
- Pi-hole Web面板无法访问:
- 检查lighttpd服务是否运行(
sudo systemctl status lighttpd) - 重新安装Web面板:
sudo pihole -r(选择Repair修复)
- 检查lighttpd服务是否运行(
如果需要更复杂的配置(如DNS负载均衡、主从复制),可自行google
推荐文章
- Bandizip去除广告,注册图标,状态栏文本
- centos7 安装gitlab并修改端口、目录
- 自建DNS服务器(基于Bind9)
- ESXi 虚拟机 Linux CentOS VMware Tools
- 解决GITLAB无法启动runsv no running,手动重启又卡住的情况
- 如何彻底禁用谷歌浏览器的更新
- node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28‘ not found (required by node)解决方案
- THINKPHP5整合workerman+gateway
- 网络攻击防护经验分享
- CentOS 挂载超4TB的硬盘的方法
