跳到主要内容

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 表示 Internet
  • ns1.example1.com. 主域名服务器的域名,需要解析到服务器IP
  • admin.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