DNS
前置准备
设置主机名
hostnamectl set-hostname ns1.yourdomain.com
端口占用
Ubuntu 默认的 systemd-resolved 会占用 53 端口,导致 BIND9 无法启动,关闭该服务后,需手动创建 /etc/resolv.conf 实现域名解析
# Ubuntu 上执行
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
服务安装
Ubuntu
sudo apt update
sudo apt install -y bind9 bind9-utils bind9-doc dnsutils
sudo systemctl status bind9
Rocky
sudo dnf install -y bind bind-utils
全局选项
Ubuntu
/etc/bind/named.conf.options
options {
directory "/var/cache/bind";
// 监听所有接口,以便公网访问
listen-on { any; };
listen-on-v6 { any; };
// 只允许查询本服务器负责的域名(权威服务器不应为他人做递归)
allow-query { any; };
// 禁用递归,防止被利用为 DNS 放大攻击源
recursion no;
// 仅放通从 DNS 服务器 IP
allow-transfer { 10.0.0.50; };
// 推荐添加 notify,让主服务器变更时主动通知从服务器
notify yes;
also-notify { 10.0.0.50; };
forwarders {
223.5.5.5;
8.8.8.8;
};
// 两种模式,only 强制走转发,first 先转发失败走根查询
forward first;
// DNSSEC 验证(权威服务器通常可关闭或设置为 no)
dnssec-validation no;
// 日志记录查询(调试时可开启,生产环境注意磁盘空间)
// querylog yes;
};
提示
服务器是否应该开启转发功能呢?
- 转发功能默认是关闭的,是否开启转发取决于其角色定位。
- 权威服务器通常关闭递归,不开启转发,只负责特定的域名解析;
- 内网 DNS 服务器负责解析公网域名,开启转发省去 root hits 递归解析的开销。
Rocky
/etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory "/var/named";
allow-query { any; };
recursion no;
allow-transfer { none; };
dnssec-validation no;
};
区域定义
Ubuntu
/etc/bind/named.conf.local
// 正向区域
zone "example1.com" {
type primary;
file "/etc/bind/zones/db.example1.com";
};
zone "example2.com" {
type primary;
file "/etc/bind/zones/db.example2.com";
};
zone "example3.com" {
type primary;
file "/etc/bind/zones/db.example3.com";
};
Rocky
/etc/named.rfc1912.zones
zone "example1.com" IN {
type primary;
file "db.example1.com";
};
zone "example2.com" IN {
type primary;
file "db.example2.com";
};
zone "example3.com" IN {
type primary;
file "db.example3.com";
};
从 DNS 服务器
/etc/bind/named.conf.local
zone "example1.com" {
type secondary;
primaries { 10.0.0.40;}; // 主 DNS 服务器 IP
allow-transfer {none;}; // 不允许再传送出去
};
从服务器会自动拉取区域文件,无需手动创建从服务器的区域文件
区域文件
- 某个域名其对应的区域文件的文件名必须与 zone 中的
file字段一致 - 每次修改区域文件,必须变更序列号
Ubuntu
/etc/bind/zones/db.example1.com
$TTL 86400
@ IN SOA ns1.example1.com. admin.example1.com. (
2025010101 ; 序列号,每次修改配置必须修改序列号
3600 ; Refresh,从服务器请求
1800 ; Retry,从服务器重试
604800 ; Expire,主从失联
86400 ; Minimum TTL, 缓存时间
)
@ IN NS ns1.example1.com.
@ IN NS ns2.example1.com. ; 域名服务器的主机名
ns1 IN A 203.0.113.10 ; NS 记录指向的 IP
ns2 IN A 203.0.113.11
www IN A 203.0.113.10
- 以
@开头的行为 SOA(Start of Authority,起始授权)记录 @相当于区域定义中zone字段的内容IN表示 Internetns1.example1.com.主域名服务器的域名,需要解析到服务器IPadmin.example1.com.邮箱,因SOA不能出现@, 所有用.代替
备注
rndc zonestatus example1.com
验证一下是否能正常加载该区域文件,如提示rndc: 'zonestatus' failed: zone not loaded,则检查区域定义的 file 路径
Rocky
/var/named/db.example1.com
与 ubuntu 一致
目录权限的属主/属组均为 named, 且权限设为 640
语法检查
named-checkconf
named-checkzone example1.com /var/named/db.example1.com
# 重新加载区域文件,如 db.example1.com
rndc reload
# 重新加载主配置文件,如 named.conf
rndc reconfig
访问验证
# 客户端刷新缓存
resolvectl flush-caches
dig @223.5.5.5 hsieh.top