rndc (Remote Name Domain Controller) 是一个用于管理 BIND (Berkeley Internet Name Domain) DNS 服务器的命令行工具,它允许系统管理员在不重启 DNS 服务的情况下,安全地控制和查询服务器状态。

rndc 就是你远程控制 BIND DNS 服务器的“遥控器”。
rndc 的工作原理
rndc 通过一个加密的 TCP 连接(默认端口 953)与 DNS 服务器通信,这个过程需要以下几个关键组件协同工作:
rndc客户端:你用来执行命令的程序(rndc reload)。named服务器:正在运行的 BIND DNS 服务器进程。rndc.key或rndc.conf:包含共享密钥的配置文件,用于验证客户端和服务器的身份,确保通信安全。没有这个密钥,rndc命令将无法连接到服务器。
核心配置文件
rndc 的行为由两个主要文件控制:
a. rndc.conf
这是 rndc 客户端的配置文件,它告诉 rndc 命令如何连接到 DNS 服务器,它定义了:

- 默认的服务器地址和端口。
- 连接时使用的密钥名称。
- 可用的服务器和密钥。
在大多数现代 Linux 发行版中,这个文件可能不存在,或者是一个非常简单的模板。rndc 会自动去寻找 /etc/rndc.key 或 /etc/bind/rndc.key。
b. named.conf 或 rndc.key
这是 BIND 服务器的配置文件,它必须包含一个与 rndc.conf 中相匹配的配置块,通常位于 options 或 controls 语句中。
controls 语句示例 (在 named.conf 中):
controls {
inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; };
};
这个语句告诉 named 服务器:

- 监听在
0.0.1的953端口上。 - 只允许来自
0.0.1的连接。 - 使用名为
"rndc-key"的密钥进行认证。
key 语句示例 (在 named.conf 中):
key "rndc-key" {
algorithm hmac-sha256;
secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYSBzZWNyZXQ=";
};
这个语句定义了密钥的名称、加密算法和Base64 编码的密钥字符串,这个密钥必须和客户端 rndc.key 文件中的完全一致。
c. /etc/rndc.key
这是一个简化的配置,它将密钥直接存储在一个文件中,同时被 rndc 客户端和 named 服务器(通过 include 指令)使用。
示例:**
key "rndc-key" {
algorithm hmac-sha256;
secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYSBzZWNyZXQ=";
};
在 named.conf 中,你只需要用一行来包含它:
include "/etc/rndc.key";
注意: 此文件的权限通常设置为 640,所有者为 root 和 bind 组,以增强安全性。
常用 rndc 命令
以下是 rndc 最常用的一些命令:
| 命令 | 描述 | 示例 |
|---|---|---|
reload |
重新加载主配置文件 (named.conf) 和区域文件,如果配置有误,服务器会继续使用旧配置运行。 |
rndc reload |
reconfig |
仅重新加载主配置文件 (named.conf),而不重新加载区域文件,用于添加或删除新的区域。 |
rndc reconfig |
refresh |
强制所有区域重新检查其 SOA 记录中的刷新时间,并开始与主服务器同步。 | rndc refresh example.com |
retransfer |
强制指定区域从主服务器重新进行区域传输。 | rndc retransfer example.com |
stats |
将服务器的统计信息打印到 /var/named/named.stats(或日志中)。 |
rndc stats |
querylog |
开启或关闭查询日志记录。 | rndc querylog on rndc querylog off |
trace |
增加调试级别,可以多次使用以获取更详细的日志。 | rndc trace 5 |
notrace |
将调试级别设置为 0,关闭调试日志。 | rndc notrace |
status |
显示服务器的基本状态信息,包括版本号、运行时间、内存使用情况等。 | rndc status |
stop |
优雅地停止 DNS 服务器,完成当前处理的所有查询后关闭。 | rndc stop |
halt |
立即停止 DNS 服务器,不完成正在处理的查询。 | rndc halt |
flush |
清空服务器的缓存。 | rndc flush |
flushname name |
从缓存中移除特定名称的所有记录。 | rndc flushname www.example.com |
tsig-verify keyname |
验证 TSIG 密钥。 | rndc tsig-verify my-tsig-key |
实际操作示例
场景 1:更新区域文件后,让服务器重新加载
假设你修改了 example.com 的区域文件 /var/named/example.com.zone。
-
修改区域文件
vim /var/named/example.com.zone # 修改 A 记录或其他内容
-
检查语法错误 在重新加载之前,最好先检查配置文件和区域文件的语法是否正确。
named-checkconf /etc/named.conf # 检查主配置文件 named-checkzone example.com /var/named/example.com.zone # 检查区域文件
-
使用
rndc reload重新加载rndc reload
如果成功,你会看到类似
server reload successful的输出。
场景 2:添加一个新的区域
-
在
named.conf中添加新的区域配置zone "newzone.com" { type master; file "/var/named/newzone.com.zone"; }; -
使用
rndc reconfig重新加载配置rndc reconfig
这个命令会告诉
named读取新的named.conf配置,并加载newzone.com区域,而不会影响其他已经加载的区域。
场景 3:清空 DNS 缓存
当 DNS 记录已更改,但客户端仍在获取旧记录时,可以清空服务器缓存。
rndc flush
常见问题排查
问题 1:rndc: connect failed: 127.0.0.1#953: connection refused
- 原因:
named服务器没有在监听 953 端口。 - 解决方案:
- 检查
named是否正在运行:systemctl status named或ps aux | grep named。 - 检查
named.conf中是否有controls语句,并且配置正确。 - 检查防火墙(如
firewalld或iptables)是否阻止了 953 端口。
- 检查
问题 2:rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
- 原因:
rndc找不到它的配置文件。 - 解决方案:
- 如果你已经配置了
named.conf中的controls和key,可以忽略此警告(如果命令能执行成功)。 - 如果没有,可以生成一个默认的
rndc.key文件:rndc-confgen -a -r /dev/urandom
这会自动创建
/etc/rndc.key文件,并设置正确的权限,然后你需要将这个key的内容复制到named.conf中。
- 如果你已经配置了
问题 3:rndc: incorrect key for server
- 原因:
rndc.key或named.conf中定义的密钥不匹配。 - 解决方案:仔细比较
rndc.key文件和named.conf中key语句的secret值,确保它们完全相同。
rndc 是 BIND DNS 服务器管理的核心工具,它提供了安全、高效的远程管理能力,是任何 BIND 管理员必须掌握的命令,理解其背后的密钥认证机制和常用命令,对于维护一个稳定可靠的 DNS 服务至关重要。
