在 FreeBSD 15 上搭建 DNS 服务器教程
📋 概述
本教程将详细介绍如何在 FreeBSD 15 上搭建 DNS 服务器。我们将使用 BIND (named) 作为 DNS 服务器软件,这是业界最稳定和可靠的 DNS 服务器之一。
🛠️ 环境准备
系统要求
- FreeBSD 15 系统
- root 权限或 sudo 权限
- 静态 IP 地址
- 网络连接
系统更新
# 更新系统
freebsd-update fetch install
# 更新软件包
pkg update
pkg upgrade
📦 第一步:安装 BIND
1.1 使用 pkg 安装 BIND
# 安装 BIND9
pkg install bind99
# 验证安装
named -v
1.2 从 ports 安装(可选)
# 获取最新 ports
portsnap fetch extract
# 安装 BIND9
cd /usr/dns/bind99
make install clean
⚙️ 第二步:配置 BIND
2.1 创建配置文件
# 编辑主配置文件
nano /etc/namedb/named.conf
2.2 基础配置示例
// 基础配置
options {
directory "/etc/namedb";
pid-file "/var/run/named/pid";
listen-on { 127.0.0.1; 192.168.1.100; }; // 替换为你的服务器IP
listen-on-v6 { ::1; };
allow-query { localhost; 192.168.1.0/24; }; // 替换为你的网段
recursion yes;
allow-recursion { localhost; 192.168.1.0/24; };
dnssec-validation auto;
auth-nxdomain no;
// 日志配置
logging {
channel default_log {
file "/var/log/named.log" versions 3 size 5m;
severity info;
print-time yes;
};
channel error_log {
file "/var/log/named.err" versions 3 size 5m;
severity error;
print-time yes;
};
category default { default_log; };
category error { error_log; };
};
};
// 控制通道
controls {
inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};
// 包含其他配置文件
include "/etc/namedb/keys.conf";
include "/etc/namedb/zones.conf";
2.3 创建区域配置文件
# 创建区域配置文件
nano /etc/namedb/zones.conf
// 正向解析区域
zone "example.com" {
type master;
file "/etc/namedb/master/example.com.zone";
allow-transfer { none; };
allow-query { any; };
};
// 反向解析区域
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/namedb/master/192.168.1.rev";
allow-transfer { none; };
allow-query { any; };
};
// localhost 正向解析
zone "localhost" {
type master;
file "/etc/namedb/master/localhost.zone";
};
// localhost 反向解析
zone "0.0.127.in-addr.arpa" {
type master;
file "/etc/namedb/master/127.0.0.rev";
};
2.4 创建区域文件
正向解析区域文件
# 创建正向解析区域目录
mkdir -p /etc/namedb/master
# 创建正向解析区域文件
nano /etc/namedb/master/example.com.zone
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2026042801 ; Serial (每次修改后递增)
3600 ; Refresh (1小时)
1800 ; Retry (30分钟)
604800 ; Expire (7天)
86400 ) ; Minimum (1天)
; 名称服务器
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
ns1 IN A 192.168.1.100
ns2 IN A 192.168.1.101
; 主机记录
@ IN A 192.168.1.100
www IN A 192.168.1.102
mail IN A 192.168.1.103
ftp IN A 192.168.1.104
; MX 记录
@ IN MX 10 mail.example.com.
@ IN MX 20 mail2.example.com.
; CNAME 记录
www IN CNAME www1.example.com.
api IN CNAME www.example.com.
; TXT 记录
@ IN TXT "v=spf1 mx ~all"
@ IN TXT "Example Company DNS"
反向解析区域文件
# 创建反向解析区域文件
nano /etc/namedb/master/192.168.1.rev
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2026042801 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum
; 名称服务器
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; PTR 记录
100 IN PTR ns1.example.com.
101 IN PTR ns2.example.com.
102 IN PTR www.example.com.
103 IN PTR mail.example.com.
104 IN PTR ftp.example.com.
localhost 区域文件
# 创建 localhost 正向解析
nano /etc/namedb/master/localhost.zone
$TTL 86400
@ IN SOA localhost. root.localhost. (
1 ; Serial
3600 ; Refresh
3600 ; Retry
3600 ; Expire
86400 ) ; Minimum
@ IN A 127.0.0.1
# 创建 localhost 反向解析
nano /etc/namedb/master/127.0.0.rev
$TTL 86400
@ IN SOA localhost. root.localhost. (
1 ; Serial
3600 ; Refresh
3600 ; Retry
3600 ; Expire
86400 ) ; Minimum
1 IN PTR localhost.
🔐 第三步:创建 rndc 密钥
# 生成 rndc 密钥
rndc-confgen -a
# 查看生成的密钥
cat /etc/namedb/rndc.key
🚀 第四步:启动服务
4.1 启用 BIND 服务
# 启用服务
sysrc named_enable="YES"
# 启动服务
service named start
# 检查服务状态
service named status
4.2 设置开机自启
# 添加到 rc.conf
sysrc named_enable="YES"
sysrc named_program="/usr/local/sbin/named"
🔒 第五步:配置防火墙
5.1 使用 pf 防火墙
# 编辑 pf 配置文件
nano /etc/pf.conf
# DNS 查询规则
pass in proto udp from any to any port 53
pass in proto tcp from any to any port 53
# 本地查询
pass in proto udp from any to lo0 port 53
pass in proto tcp from any to lo0 port 53
# 允许 rndc 连接
pass in proto tcp from 127.0.0.1 to port 953
pass in proto tcp from 192.168.1.0/24 to port 953
5.2 重新加载防火墙
# 重新加载 pf 配置
pfctl -f /etc/pf.conf
pfctl -e
✅ 第六步:测试 DNS 服务
6.1 基础测试
# 检查配置文件语法
named-checkconf
# 检查区域文件
named-checkzone example.com /etc/namedb/master/example.com.zone
named-checkzone 1.168.192.in-addr.arpa /etc/namedb/master/192.168.1.rev
6.2 服务测试
# 测试本地解析
dig @localhost www.example.com
dig @localhost -x 192.168.1.102
# 测试服务响应
systemd-resolve --status
6.3 监控日志
# 实时查看日志
tail -f /var/log/named.log
# 查看错误日志
tail -f /var/log/named.err
📊 第七步:高级配置
7.1 配置 DNS 缓存
# 编辑 named.conf 添加缓存配置
options {
// ... 其他配置 ...
# 缓存配置
max-cache-size 256m;
max-cache-ttl 86400;
min-cache-ttl 3600;
};
7.2 配置转发器
# 配置转发到上游DNS
options {
// ... 其他配置 ...
# 转发器配置
forwarders {
8.8.8.8;
8.8.4.4;
};
forward first;
};
7.3 配置 DNSSEC
# 生成 DNSSEC 密钥
dnssec-keygen -a RSA -b 2048 -n ZONE example.com
# 为区域签名
dnssec-signzone -A -3 -N NOKEY -o example.com /etc/namedb/master/example.com.zone
# 更新区域配置
zone "example.com" {
type master;
file "/etc/namedb/master/example.com.zone.signed";
auto-dnssec maintain;
};
🛠️ 维护和监控
8.1 常用维护命令
# 重新加载配置
rndc reload
# 重新加载特定区域
rndc reload example.com
rndc reconfig
# 清除缓存
rndc flush
# 查看统计信息
rndc stats
# 查看进程
ps aux | grep named
# 查看端口占用
netstat -an | grep 53
8.2 日志轮转
# 编辑 logrotate 配置
nano /etc/logrotate.d/named
/var/log/named.log {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 640 named named
postrotate
/usr/local/sbin/rndc reload > /dev/null 2>&1 || true
endscript
}
8.3 性能调优
# 编辑 named.conf 进行性能优化
options {
// ... 其他配置 ...
# 性能优化
max-ncache-size 32m;
max-cache-size 512m;
cleaning-interval 60;
coresize 128M;
datasize 256M;
max-sock-size 4m;
transfers-per-ns 2;
transfers-in 10;
transfer-source 192.168.1.100;
transfer-source-v6 2001:db8::1;
};
🔧 常见问题排查
问题 1:服务无法启动
# 检查端口占用
netstat -an | grep 53
# 检查配置语法
named-checkconf
# 查看系统日志
tail -f /var/log/messages
问题 2:无法解析域名
# 检查区域文件
named-checkzone example.com /etc/namedb/master/example.com.zone
# 检查 DNS 服务
dig @localhost example.com
# 检查防火墙
pfctl -s rules
问题 3:权限问题
# 检查文件权限
ls -la /etc/namedb/
chown -R named:named /etc/namedb/
# 检查日志文件权限
touch /var/log/named.log
chown named:named /var/log/named.log
问题 4:内存使用过高
# 查看内存使用
ps aux | grep named
# 调整缓存大小
max-cache-size 128m
max-ncache-size 16m
🔄 第八步:脚本化管理
8.1 启动脚本
# 创建启动脚本
nano /usr/local/etc/rc.d/named-custom
#!/bin/sh
# PROVIDE: named-custom
# REQUIRE: NETWORKING
# BEFORE: named
# KEYWORD: nojail
. /etc/rc.subr
name="named-custom"
rcvar="named_custom_enable"
load_rc_config $name
: ${named_custom_enable="NO"}
: ${named_custom_flags=""}
command="/usr/local/sbin/named"
command_args="${named_custom_flags}"
pidfile="/var/run/named/pid"
start_precmd="named_precmd"
named_precmd() {
# 检查配置文件
if ! /usr/local/sbin/named-checkconf; then
echo "ERROR: named configuration file is invalid"
return 1
fi
return 0
}
run_rc_command "$1"
# 设置权限
chmod +x /usr/local/etc/rc.d/named-custom
# 启用服务
sysrc named_custom_enable="YES"
8.2 备份脚本
# 创建备份脚本
nano /usr/local/bin/named-backup.sh
#!/bin/sh
BACKUP_DIR="/var/backups/named"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份配置文件
cp -r /etc/namedb $BACKUP_DIR/namedb_$DATE
# 备份区域文件
tar -czf $BACKUP_DIR/zones_$DATE.tar.gz /etc/namedb/master/
# 备份日志
cp /var/log/named.log $BACKUP_DIR/named_$DATE.log
# 保留最近7天的备份
find $BACKUP_DIR -name "namedb_*" -mtime +7 -delete
find $BACKUP_DIR -name "zones_*" -mtime +7 -delete
find $BACKUP_DIR -name "named_*.log" -mtime +7 -delete
echo "DNS 服务器备份完成: $BACKUP_DIR"
# 设置权限并加入 crontab
chmod +x /usr/local/bin/named-backup.sh
echo "0 2 * * * /usr/local/bin/named-backup.sh" >> /etc/crontab
📝 第九步:故障排除指南
9.1 常见错误代码
| 错误代码 | 描述 | 解决方案 |
|---|---|---|
| SERVFAIL | 服务器故障 | 检查配置文件和区域文件 |
| REFUSED | 请求被拒绝 | 检查访问控制列表 |
| NXDOMAIN | 域名不存在 | 检查拼写和 DNS 记录 |
| NOERROR | 无错误 | 正常响应 |
9.2 诊断工具
# 查看 BIND 统计信息
rndc stats
# 查看查询统计
named-compilestats -q
# 查看 DNS 查询日志
journalctl -u named -f
9.3 性能分析
# 查看内存使用
ps aux | grep named
# 查看 CPU 使用
top | grep named
# 查看网络连接
netstat -an | grep :53
🎯 第十步:总结
恭喜!您现在已经成功在 FreeBSD 15 上搭建了 DNS 服务器。以下是完成的主要工作:
✅ 已完成项目
- 安装 BIND DNS 服务器
- 配置主配置文件和区域文件
- 设置防火墙规则
- 启动和配置服务
- 测试 DNS 解析功能
- 设置日志轮转
- 配置性能优化
- 创建备份脚本
- 配置故障排除工具
🚀 下一步建议
- 监控服务状态:定期检查 DNS 服务运行状态
- 更新记录:随着网站和服务变化,及时更新 DNS 记录
- 安全加固:考虑启用 DNSSEC 和其他安全措施
- 负载均衡:如果有多个 DNS 服务器,配置负载均衡
- 自动化监控:设置自动监控和报警系统
📚 参考资源
- BIND 官方文档
- FreeBSD 官方文档
- RFC 1034 – Domain Names
- RFC 1035 – Domain Names – Implementation and Specification
🎉 祝您使用愉快! 如果遇到任何问题,请参考故障排除部分或联系技术支持。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END














暂无评论内容