## 基础环境
```
操作系统:ubuntu 22.04
```
## 安装bind9
```
sudo apt update
sudo apt install bind9 bind9utils bind9-doc -y
```
## 配置文件详解
### 🧩 主配置片段(在 `/etc/bind/` 下)
这些文件通过 `include` 语句被主配置文件 `named.conf` 引用,共同构成完整的 BIND 配置。
| 文件名 | 作用 |
| :--------------------------- | :----------------------------------------------------------- |
| **named.conf** | BIND 的主配置文件。它本身通常只包含几个 `include` 行,用于引入其他配置文件片段。你可以把它看作是配置的入口。 |
| **named.conf.options** | **全局选项配置文件**。这里设置 BIND 的全局行为,例如监听哪些 IP 地址和端口(`listen-on`)、允许哪些客户端查询(`allow-query`)、是否开启递归(`recursion`)、指定转发器(`forwarders`)、DNSSEC 设置等。修改选项时主要编辑此文件。 |
| **named.conf.local** | **本地区域配置文件**。用于定义你自己添加的 DNS 区域(zone)。例如,当你需要为你的域名 `example.com` 添加权威解析时,就会在这个文件中添加相应的 `zone` 语句。 |
| **named.conf.default-zones** | **默认区域配置文件**。由 Debian/Ubuntu 的 BIND 软件包提供,它定义了系统正常运行所需的基本区域,如 `localhost`、`127.in-addr.arpa` 等。通常不需要也不应该修改此文件。 |
| **bind.keys** | **DNSSEC 信任锚文件**。包含用于验证 DNSKEY 记录的初始信任锚(trust anchors)。它由软件包维护,一般情况下无需手动修改,但如果你需要自定义 DNSSEC 信任链,可以在此调整(不推荐)。 |
------
### 📁 区域数据文件(也在 `/etc/bind/` 下)
这些文件是 DNS 区域的实际数据文件,存储了具体的域名和 IP 地址映射记录。
| 文件名 | 作用 |
| :---------------- | :----------------------------------------------------------- |
| **db.local** | **本地主机正向解析区域文件**。定义了 `localhost.` 这个域名对应的 IPv4 地址(`127.0.0.1`)和 IPv6 地址(`::1`)。 |
| **db.127** | **本地回环反向解析区域文件**。为 `127.0.0.0/8` 网络提供反向解析(PTR 记录),通常只包含一条记录将 `1.0.0.127.in-addr.arpa` 指向 `localhost.`。 |
| **db.0** | **`0.0.0.0/8` 网络的反向解析区域文件**。此网络通常用于特殊用途(如“本网络”),该文件中一般只有一条记录,将 `0.0.0.0` 的反向指向 `localhost.` 或留空。 |
| **db.255** | **`255.0.0.0/8` 网络的反向解析区域文件**。用于广播地址的反向查询,通常也只有一个指向 `localhost.` 的 PTR 记录,或者为空白。 |
| **db.empty** | **空的区域文件**。它是一个占位文件,在默认配置中用于某些不需要解析数据的区域。内容通常只有 SOA 和 NS 记录,没有任何实际的主机记录。 |
| **zones.rfc1918** | **私有地址反向区域声明文件**。该文件包含了 RFC 1918 定义的私有 IPv4 地址段(如 `10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`)的反向解析区域定义(`zone` 语句)。它被 `named.conf.default-zones` 引用,使 BIND 能够为这些私有地址提供反向查询(但实际数据通常为空)。 |
## 配置修改
named.conf.options
```
options {
directory "/var/cache/bind";
allow-query { 10.0.0.0/8; }; # 允许访问的ip地址
recursion yes; # 是否允许递归查询,如果要解析外网地址此项必须为yes
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
forwarders { # 上游服务器的地址,可以设置多个
223.5.5.5;
};
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
listen-on-v6 { any; };
};
```
named.conf.local
```
zone "tqsys.cn" {
type master; # 主dns
file "/etc/bind/db.tqsys.cn"; # 定义dns解析文件存放地址
};
```
db.tqsys.cn
```
;
; BIND data file for tqsys.cn
;
$TTL 604800 # time to live,默认生存时间 7天
@ IN SOA ns1.tqsys.cn. admin.tqsys.cn. ( # 主域名服务器,及管理员邮箱 @代表当前域名及tqsys.cn
2024031601 ; Serial (格式:YYYYMMDDNN) # 序列号。用于辅助 DNS 服务器判断区域数据是否更新。通常采用 YYYYMMDDNN 格式(年-月-日-修改次数),每次修改区域文件后必须增大该数字,否则从服务器不会同步。
604800 ; Refresh # 刷新间隔,从服务器每隔这个时间(秒)向主服务器查询区域是否有更新
86400 ; Retry # 重试间隔。如果从服务器在刷新时联系不上主服务器,它会每隔这个时间(秒)重试一次
2419200 ; Expire # 过期时间。如果从服务器连续 Expire 秒(此处 28 天)无法联系主服务器,它将丢弃该区域数据,不再提供权威应答,因为数据可能已过时。
604800 ) ; Negative Cache TTL # 否定缓存 TTL。其他 DNS 服务器对于该域中不存在的记录(NXDOMAIN 或 NODATA)的否定应答缓存时间。这里也是 7 天。
;
@ IN NS ns1.tqsys.cn. # 指定该域名的权威域名服务器,这里声明ns1.tqsys.cn是tqsys.cn的权威域名
@ IN A 10.2.8.20 # 将tqsys.cn本身解析到10.2.8.20 ns1 IN A 10.2.8.20 # 将ns1.tqsys.cn解析到10.2.8.20
www IN A 10.2.8.20 # 将www.tqsys.cn解析到10.2.8.20
aa IN A 10.7.8.99 # 将aa.tqsys.cn解析到10.7.8.99
```
## 检查配置并启动服务
```
sudo named-checkconf # 检查主配置语法
sudo named-checkzone tqsys.cn /etc/bind/db.tqsys.cn # 检查区域文件
sudo systemctl start named
sudo systemctl enable named # 设置开机自启
sudo systemctl reload named # 重新加载配置
sudo systemctl restart named # 重启named
```
## 测试验证域名解析是否生效
```
# 使用dig命令(Linux)
dig @10.2.8.20 www.tqsys.cn
# 或使用nslookup命令(Windows/Linux)
nslookup www.example.com 10.2.8.20
```
