强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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

包说明

包名内容
bind9BIND 主程序(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

包说明

包名内容
bindBIND 主程序
bind-utils客户端工具(dig, nslookup, host, nsupdate)
bind-chrootchroot 环境(可选,增强安全)
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/DebianRHEL/CentOS
安装apt install bind9dnf install bind
主配置/etc/bind/named.conf/etc/named.conf
区域目录/var/cache/bind//var/named/
服务名bind9named
启动systemctl start bind9systemctl start named
检查语法named-checkconfnamed-checkconf
管理工具rndcrndc

💡 小技巧

  1. 包管理安装优于编译安装,除非有特殊需求。包管理安装可以自动处理依赖、服务文件和安全更新。
  2. 安装后第一件事:运行 named-checkconf 检查配置语法。
  3. 不要直接编辑 /var/named/ 下的区域文件,应该编辑源文件然后 rndc reload
  4. rndc querylog on 是调试 DNS 查询最方便的工具,用完记得关闭以避免日志膨胀。

📖 扩展阅读