安装BIND,编辑配置文件,定义正向/反向解析记录,重启服务
简易DNS服务器搭建指南
DNS基础概念
什么是DNS?
DNS(Domain Name System)是互联网的核心服务之一,负责将人类可读的域名(如www.example.com)转换为计算机可识别的IP地址(如192.168.1.1),它通过分布式数据库实现全球域名解析。
DNS工作原理
| 组件 | 功能 |
|---|---|
| 客户端 | 发起域名解析请求 |
| 递归 resolver | 逐级查询并返回结果 |
| 权威服务器 | 存储特定域名的权威记录 |
| 缓存服务器 | 临时存储解析结果加速查询 |
常见DNS记录类型
| 记录类型 | 用途 | 示例 |
|---|---|---|
| A | 域名→IPv4地址 | example.com → 192.168.1.1 |
| AAAA | 域名→IPv6地址 | example.com → 2001:db8::1 |
| CNAME | 别名指向 | www.example.com → example.com |
| MX | 邮件交换 | 指定邮件服务器优先级 |
| NS | 命名服务器 | 指定域名权威服务器 |
| TXT | 文本记录 | 存储任意字符串信息 |
搭建前准备
系统要求
- 推荐Linux系统(CentOS/Ubuntu/Debian)
- 最低配置:1核CPU/512MB内存/1GB存储空间
- 固定公网IP(非必须但推荐)
软件选择
| 软件名称 | 特点 | 适用场景 |
|---|---|---|
| BIND | 开源标准DNS软件 | 生产环境首选 |
| dnsmasq | 轻量级DNS+DHCP | 小型网络/开发测试 |
| Unbound | 高性能验证型DNS | 安全敏感环境 |
网络拓扑建议
[客户端] > [DNS服务器] > [上游DNS]
| |
局域网设备 公网解析
使用BIND搭建DNS服务器
安装BIND
Ubuntu/Debian系
sudo apt update sudo apt install bind9 bind9utils bind9doc y
CentOS/RHEL系
sudo yum install bind bindutils y
配置文件结构
/etc/bind/ # 主配置文件目录
├── named.conf # 主配置文件
├── db.* # 区域文件(ZONE文件)
└── keys/ # TSIG密钥目录
配置正向解析区
编辑/etc/bind/named.conf.local:
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
allowupdate { none; };
};
创建区域文件/etc/bind/db.example.com:
$TTL 86400 ; 默认生存时间(秒)
@ IN SOA ns1.example.com. admin.example.com. (
2023100101 ; 序列号
3600 ; 刷新间隔
1800 ; 重试间隔
1209600 ; 过期时间
86400 ) ; 最小TTL
IN NS ns1.example.com.
IN NS ns2.example.com.
ns1 IN A 192.168.1.1
ns2 IN A 192.168.1.2
www IN A 192.168.1.100
配置反向解析区
编辑/etc/bind/named.conf.local追加:

zone "1.168.192.inaddr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
allowupdate { none; };
};
创建反向区域文件/etc/bind/db.192.168.1:
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2023100101 ; 序列号
3600 ; 刷新间隔
1800 ; 重试间隔
1209600 ; 过期时间
86400 ) ; 最小TTL
IN NS ns1.example.com.
IN NS ns2.example.com.
1 IN PTR ns1.example.com.
100 IN PTR www.example.com.
启动与测试
# 检查配置文件语法 sudo namedcheckconf /etc/bind/named.conf sudo namedcheckzone example.com /etc/bind/db.example.com # 启动服务 sudo systemctl restart bind9 # 测试解析 dig @localhost example.com nslookup www.example.com 127.0.0.1
高级配置选项
缓存设置
在named.conf中配置:
options {
forwarders {
8.8.8.8; # Google公共DNS
8.8.4.4; # Google备用DNS
};
querycachesize 10000; # 缓存条目数
};
访问控制
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
allowquery { 192.168.1.0/24; }; # 仅允许内网查询
};
TSIG签名认证
生成密钥:

sudo tsigkeygen a hmacmd5 b example.com c secret.key
配置named.conf:
keys {
"examplekey" {
algorithm hmacmd5;
secret "yourgeneratedsecretkey";
};
};
常见问题排查
无法解析的排查步骤
| 检查项 | 操作命令 | 预期结果 |
|---|---|---|
| 服务状态 | systemctl status bind9 | active (running) |
| 配置文件 | namedcheckconf | 无语法错误 |
| 日志查看 | journalctl u bind9 | 无报错信息 |
| 防火墙规则 | sudo ufw status | 53端口开放 |
| 递归查询 | dig +trace example.com | 显示完整解析路径 |
性能优化建议
- 启用查询缓存(默认开启)
- 调整
maxcachesize参数(默认1M) - 使用
allowqueryonzone限制查询范围 - 部署分离视图(splithorizon)实现内外网分离
安全加固措施
最小化安装原则
移除不必要的功能模块:
sudo apt remove bind9doc bind9host y
限制递归查询
编辑named.conf.options:

options {
recursion yes; # 允许递归查询(内部网络)
allowrecursion { 192.168.1.0/24; }; # 仅内网可递归
};
签名验证配置
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
inlinesigning yes; # 启用DNSSEC签名
autodnssec maintain; # 自动维护NSEC记录
};
Q&A问答专栏
Q1:为什么配置了反向解析区但PTR查询仍然失败?
A:常见原因包括:
- 反向区域文件命名不符合规范(应为
db.<网络>,如db.192.168.1) - PTR记录未正确对应IP地址(需注意IP段与区域声明匹配)
- SOA记录中的NS记录与正向区域不一致
- BIND未加载反向区域配置(检查
named.conf.local是否生效)
Q2:如何为新子域名添加A记录?
操作步骤:
- 编辑主区域文件
/etc/bind/db.example.com,添加:subdomain IN A 192.168.1.200
- 更新SOA记录中的序列号(如从2023100101改为2023100102)
- 重新加载配置:
sudo systemctl reload bind9
- 验证新增记录:
dig subdomain.example.com @localhost
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/205113.html