FreeBSD 15 搭建 DNS 服务器详细教程

在 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 服务器。以下是完成的主要工作:

✅ 已完成项目

  1. 安装 BIND DNS 服务器
  2. 配置主配置文件和区域文件
  3. 设置防火墙规则
  4. 启动和配置服务
  5. 测试 DNS 解析功能
  6. 设置日志轮转
  7. 配置性能优化
  8. 创建备份脚本
  9. 配置故障排除工具

🚀 下一步建议

  1. 监控服务状态:定期检查 DNS 服务运行状态
  2. 更新记录:随着网站和服务变化,及时更新 DNS 记录
  3. 安全加固:考虑启用 DNSSEC 和其他安全措施
  4. 负载均衡:如果有多个 DNS 服务器,配置负载均衡
  5. 自动化监控:设置自动监控和报警系统

📚 参考资源


🎉 祝您使用愉快! 如果遇到任何问题,请参考故障排除部分或联系技术支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容