BIND DNS 服务器搭建完全教程 / 第 02 章:安装与初始配置
本章概述
本章讲解 BIND 在主流 Linux 发行版上的安装方式(包管理与编译安装)、安装后的目录结构、初始配置验证,以及首次启动的完整流程。
2.1 通过包管理器安装
2.1.1 Ubuntu / Debian
# 更新包索引
sudo apt update
# 安装 BIND9(含服务器和工具)
sudo apt install -y bind9 bind9utils bind9-doc
# 验证安装
named -v
# 输出: BIND 9.18.x-...
# 查看已安装的包
dpkg -l | grep bind9
包说明:
| 包名 | 内容 |
|---|---|
bind9 | BIND 主程序(named 守护进程) |
bind9utils | 工具集(rndc, dig, nsupdate 等) |
bind9-doc | 文档和示例 |
dnsutils | 客户端工具(dig, nslookup, host) |
# 安装客户端查询工具(如果还没有)
sudo apt install -y dnsutils
2.1.2 RHEL / CentOS / Fedora
# RHEL/CentOS 8+ / Fedora
sudo dnf install -y bind bind-utils
# RHEL/CentOS 7
sudo yum install -y bind bind-utils
# 验证安装
named -v
# 查看已安装的包
rpm -qa | grep bind
包说明:
| 包名 | 内容 |
|---|---|
bind | BIND 主程序 |
bind-utils | 客户端工具(dig, nslookup, host, nsupdate) |
bind-chroot | chroot 环境(可选,增强安全) |
bind-libs | 运行时库 |
2.1.3 Alpine Linux
# 常用于 Docker 容器
apk add bind bind-tools
# 验证
named -v
2.1.4 Arch Linux
sudo pacman -S bind
2.2 编译安装
当需要特定编译选项(如自定义模块、最新特性)时,可以从源码编译。
2.2.1 安装编译依赖
# Ubuntu/Debian
sudo apt install -y build-essential libssl-dev libuv1-dev \
libnghttp2-dev libjemalloc-dev libfstrm-dev \
protobuf-c-compiler libprotobuf-c-dev \
libcap-dev libxml2-dev libkrb5-dev wget
# RHEL/CentOS
sudo dnf install -y gcc make openssl-devel libuv-devel \
nghttp2-devel jemalloc-devel fstrm-devel \
protobuf-c-devel libcap-devel libxml2-devel krb5-devel wget
2.2.2 下载并编译
# 定义版本(请替换为最新稳定版)
BIND_VERSION="9.20.0"
# 下载源码
cd /tmp
wget https://downloads.isc.org/isc/bind9/${BIND_VERSION}/bind-${BIND_VERSION}.tar.xz
tar xf bind-${BIND_VERSION}.tar.xz
cd bind-${BIND_VERSION}
# 配置(标准选项)
./configure \
--prefix=/usr/local/bind \
--sysconfdir=/etc/bind \
--localstatedir=/var \
--enable-full-report \
--with-openssl \
--with-libxml2 \
--with-jemalloc \
--enable-dnsrps
# 编译(使用所有 CPU 核心)
make -j$(nproc)
# 安装
sudo make install
configure 常用选项:
| 选项 | 说明 |
|---|---|
--prefix | 安装目录前缀 |
--sysconfdir | 配置文件目录 |
--with-openssl | 启用 OpenSSL/TLS 支持 |
--with-jemalloc | 使用 jemalloc 内存分配器(性能更好) |
--enable-dnsrps | 启用 DNS Response Policy Service |
--with-libxml2 | 启用 XML 统计输出 |
--with-geoip | 启用 GeoIP 支持(视图按地理位置分流) |
2.2.3 创建系统用户和服务文件
# 创建 named 用户
sudo useradd -r -s /usr/sbin/nologin -d /var/named named
# 创建必要目录
sudo mkdir -p /var/named/{primary,secondary,dynamic,data}
sudo mkdir -p /var/log/named
sudo mkdir -p /run/named
# 设置权限
sudo chown -R named:named /var/named
sudo chown -R named:named /var/log/named
sudo chown -R named:named /run/named
# 创建 systemd 服务文件
sudo tee /etc/systemd/system/named.service <<'EOF'
[Unit]
Description=BIND DNS Server
Documentation=man:named(8)
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
ExecStart=/usr/local/bind/sbin/named -u named -c /etc/bind/named.conf
ExecReload=/usr/local/bind/sbin/rndc reload
ExecStop=/usr/local/bind/sbin/rndc stop
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
# 重载 systemd
sudo systemctl daemon-reload
2.2.4 配置 PATH 环境变量
# 添加到 /etc/profile.d/bind.sh
sudo tee /etc/profile.d/bind.sh <<'EOF'
export PATH="/usr/local/bind/sbin:/usr/local/bind/bin:$PATH"
export MANPATH="/usr/local/bind/share/man:$MANPATH"
EOF
# 立即生效
source /etc/profile.d/bind.sh
# 验证
which named
which dig
2.3 安装后目录结构
2.3.1 Ubuntu/Debian 目录结构
/etc/bind/
├── named.conf # 主配置文件
├── named.conf.options # 选项配置(被 named.conf include)
├── named.conf.local # 本地区域配置(被 named.conf include)
├── named.conf.default-zones # 默认区域(被 named.conf include)
├── bind.keys # DNSSEC 信任锚
├── db.root # 根提示文件
├── db.0 # 反向区域 0.x.x.x
├── db.127 # 反向区域 127.x.x.x
├── db.255 # 反向区域 255.x.x.x
├── db.local # localhost 正向区域
└── db.empty # 空区域模板
/var/cache/bind/ # 区域文件默认存放位置
├── primary/ # 主区域文件(自建)
├── secondary/ # 辅助区域文件(自动生成)
└── dynamic/ # 动态更新区域
/var/log/named/ # 日志目录(需手动创建)
/run/named/ # 运行时文件
├── named.pid # PID 文件
└── named.session.key # 会话密钥
2.3.2 RHEL/CentOS 目录结构
/etc/
├── named.conf # 主配置文件
├── named.iscdlv.key # ISC DLV 密钥
└── named.root.key # 根区域密钥
/var/named/ # 区域文件存放目录
├── named.ca # 根提示文件
├── named.localhost # localhost 正向区域
├── named.loopback # 反向区域
├── named.empty # 空区域
├── primary/ # 主区域文件(自建)
├── secondary/ # 辅助区域文件
└── dynamic/ # 动态更新区域
/var/log/named/ # 日志目录
/run/named/ # 运行时文件
2.4 初始配置文件
2.4.1 Ubuntu/Debian 默认 named.conf
# 查看默认配置
cat /etc/bind/named.conf
// /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
2.4.2 named.conf.options 默认配置
cat /etc/bind/named.conf.options
// /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
// 如果本机不是递归服务器,禁用递归
recursion yes;
allow-recursion { localhost; };
// 隐藏版本号(安全)
version "not disclosed";
// 启用 DNSSEC 验证
dnssec-validation auto;
// 监听地址
listen-on { 127.0.0.1; };
listen-on-v6 { ::1; };
// 转发器(可选)
// forwarders {
// 8.8.8.8;
// 8.8.4.4;
// };
// PID 文件路径
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
2.4.3 RHEL/CentOS 默认 named.conf
// /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { localhost; };
recursion yes;
dnssec-validation auto;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
2.5 启动与验证
2.5.1 检查配置语法
# 检查 named.conf 语法
# Ubuntu/Debian
sudo named-checkconf /etc/bind/named.conf
# RHEL/CentOS
sudo named-checkconf /etc/named.conf
# 无输出 = 语法正确
# 有输出 = 显示错误位置和原因
2.5.2 启动 BIND 服务
# 启动
sudo systemctl start named # RHEL/CentOS
sudo systemctl start bind9 # Ubuntu/Debian
# 设置开机自启
sudo systemctl enable named # RHEL/CentOS
sudo systemctl enable bind9 # Ubuntu/Debian
# 查看状态
sudo systemctl status named
预期输出:
● named.service - BIND Domain Name Server
Loaded: loaded (/usr/lib/systemd/system/named.service; enabled)
Active: active (running) since ...
Docs: man:named(8)
Process: ... ExecStart=/usr/sbin/named -u named -c /etc/named.conf (code=exited, status=0/SUCCESS)
Main PID: 12345 (named)
Tasks: 8 (limit: 23072)
Memory: 25.0M
CPU: 120ms
CGroup: /system.slice/named.service
└─12345 /usr/sbin/named -u named -c /etc/named.conf
2.5.3 验证 DNS 解析
# 使用 dig 查询本地解析
dig @127.0.0.1 example.com A
# 预期输出:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
# ;; ANSWER SECTION:
# example.com. 86400 IN A 93.184.216.34
# 使用 nslookup
nslookup example.com 127.0.0.1
# 检查 BIND 版本
dig @127.0.0.1 version.bind txt chaos
2.5.4 开放防火墙端口
# firewalld (RHEL/CentOS)
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload
# 或手动添加端口
sudo firewall-cmd --permanent --add-port=53/tcp
sudo firewall-cmd --permanent --add-port=53/udp
sudo firewall-cmd --reload
# ufw (Ubuntu)
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw reload
# iptables(传统方式)
sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
2.6 rndc 远程管理工具
rndc(Remote Name Daemon Control)是 BIND 自带的管理工具,用于控制运行中的 named 进程。
2.6.1 生成 rndc 配置
# 生成 rndc 配置和密钥(包管理安装通常自动生成)
sudo rndc-confgen > /tmp/rndc.conf
# Ubuntu/Debian 自动生成的密钥和配置
cat /etc/bind/rndc.key
2.6.2 常用 rndc 命令
# 重载配置文件(不中断服务)
sudo rndc reload
# 重载特定区域
sudo rndc reload example.com
# 查看服务器状态
sudo rndc status
# 查看统计信息
sudo rndc stats
# 刷新缓存
sudo rndc flush
# 查询日志级别
sudo rndc querylog on # 开启查询日志
sudo rndc querylog off # 关闭查询日志
# 更改日志级别(调试用)
sudo rndc trace 3 # 设置调试级别为 3
# 冻结区域(防止动态更新)
sudo rndc freeze example.com
# 解冻区域
sudo rndc thaw example.com
# 停止服务
sudo rndc stop
2.6.3 rndc 命令速查表
| 命令 | 说明 |
|---|---|
rndc reload | 重载所有配置和区域 |
rndc reload <zone> | 重载指定区域 |
rndc refresh <zone> | 刷新辅助区域 |
rndc retransfer <zone> | 强制重新传输区域 |
rndc flush | 清除所有缓存 |
rndc flushname <name> | 清除指定域名缓存 |
rndc status | 显示服务器状态 |
rndc stats | 转储统计信息到文件 |
rndc querylog on/off | 开关查询日志 |
rndc trace <level> | 设置调试级别 |
rndc signing -list <zone> | 列出 DNSSEC 签名状态 |
2.7 配置开机自启与日志轮转
2.7.1 日志轮转配置
# 创建 logrotate 配置
sudo tee /etc/logrotate.d/named <<'EOF'
/var/log/named/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 named named
sharedscripts
postrotate
/usr/sbin/rndc reconfig > /dev/null 2>&1 || true
endscript
}
EOF
2.8 本章小结
| 操作 | Ubuntu/Debian | RHEL/CentOS |
|---|---|---|
| 安装 | apt install bind9 | dnf install bind |
| 主配置 | /etc/bind/named.conf | /etc/named.conf |
| 区域目录 | /var/cache/bind/ | /var/named/ |
| 服务名 | bind9 | named |
| 启动 | systemctl start bind9 | systemctl start named |
| 检查语法 | named-checkconf | named-checkconf |
| 管理工具 | rndc | rndc |
💡 小技巧
- 包管理安装优于编译安装,除非有特殊需求。包管理安装可以自动处理依赖、服务文件和安全更新。
- 安装后第一件事:运行
named-checkconf检查配置语法。 - 不要直接编辑
/var/named/下的区域文件,应该编辑源文件然后rndc reload。 rndc querylog on是调试 DNS 查询最方便的工具,用完记得关闭以避免日志膨胀。