1、命令简介
nsupdate:用于动态更新 DNS(Domain Name System)记录的工具。它通常与 BIND(Berkeley Internet Name Domain)服务器一起使用,允许管理员通过命令行接口执行 DNS 记录的动态修改。
2、命令语法
nsupdate [-d] [[-y keyname:secret] | [-k keyfile]] [-t timeout] [-u udptimeout] [-r udpretries] [-v] [filename]
3、命令描述
nsupdate
用于向名称服务器提交动态DNS更新请求,如RFC2136中所定义。这允许在不手动编辑区域文件的情况下添加或删除资源记录。单个更新请求可以包含添加或删除多个资源记录的请求。
通过nsupdate
或DHCP服务器进行动态控制的区域不应手动编辑。手动编辑可能与动态更新发生冲突并导致数据丢失。
使用nsupdate
动态添加或删除的资源记录必须位于同一区域。请求将发送到区域的主服务器,这由区域的SOA记录的MNAME字段确定。
使用-d选项使nsupdate
进入调试模式。这提供了有关所做的更新请求以及从名称服务器接收的响应的跟踪信息。
事务签名可用于对动态DNS更新进行身份验证。这些使用了RFC2845中描述的TSIG资源记录类型或RFC3535和RFC2931中描述的SIG(0)记录。TSIG依赖于一个共享密钥,只应该为nsupdate
和名称服务器所知。目前,TSIG支持的唯一加密算法是HMAC-MD5,这在RFC 2104中定义。一旦为TSIG定义了其他算法,应用程序将需要确保它们在使用TSIG身份验证时选择适当的算法以及密钥。例如,适当的key和server语句将被添加到/etc/named.conf
中,以便名称服务器可以将适当的秘密密钥和算法与将使用TSIG身份验证的客户端应用程序的IP地址关联起来。SIG(0)使用公钥加密。要使用SIG(0)密钥,公钥必须存储在由名称服务器提供服务的区域中的KEY记录中。nsupdate
不读取/etc/named.conf
。
nsupdate
使用-y
或-k
选项(带有HMAC-MD5密钥)来提供生成用于身份验证动态DNS更新请求的TSIG记录所需的共享密钥。这些选项是互斥的。对于-k选项,nsupdate从文件keyfile中读取共享密钥,其名称形式为K{name}.+157.+{random}.private
。由于历史原因,文件K{name}.+157.+{random}.key
也必须存在。使用-y
选项时,将从keyname:secret
生成签名。keyname
是密钥的名称,secret是Base64
编码的共享密钥。不建议使用-y
选项,因为共享密钥作为明文命令行参数提供。这可能会在ps(1)的输出中可见,或者在用户Shell维护的历史文件中。
-k
还可以用于指定用于身份验证动态DNS更新请求的SIG(0)密钥。在这种情况下,指定的密钥不是HMAC-MD5密钥。
默认情况下,nsupdate
使用UDP将更新请求发送到名称服务器,除非它们太大而无法适应UDP请求,否则将使用TCP。-v
选项使nsupdate
使用TCP连接。这在进行一批更新请求时可能更可取。
-t
选项设置更新请求在被中止之前的最长时间。默认值为300秒。可以使用零来禁用超时。
-u
选项设置UDP重试间隔。默认值为3
秒。如果为零,则间隔将根据超时间隔和UDP重试次数计算。
-r
选项设置UDP重试次数。默认值为3
。如果为零,将只进行一个更新请求。
4、命令选项
nsupdate
从文件名或标准输入中读取输入。每个命令只在一行输入中提供。有些命令用于管理目的。其他是更新指令或对区域内容的先决条件检查。这些检查设置了一些条件,即某些名称或一组资源记录(RRset)在区域中存在或不存在。如果要使整个更新请求成功,必须满足这些条件。如果对先决条件的测试失败,更新将被拒绝。
每个更新请求由零个或多个先决条件和零个或多个更新组成。如果区域中存在或缺少某些指定的资源记录,则允许进行适当身份验证的更新请求。空白输入行(或send
命令)导致将累积的命令作为一个动态DNS更新请求发送到名称服务器。
命令 | 描述 |
server {servername} [port] | 发送所有动态更新请求到名称服务器 servername。如果没有提供server 声明, nsupdate 将发送更新请求到正确区域的主服务器。 port 是 servername 上用于发送动态更新请求的端口号, 默认使用 DNS 的端口号 53。 |
local {address} [port] | 使用本地地址发送所有动态更新请求。 如果没有提供 local 声明, nsupdate 将使用系统选择的地址和端口发送更新请求。 port 可以用于指定请求来自特定端口。如果未指定端口号, 系统将分配一个。 |
zone {zonename} | 指定所有更新都要应用到区域 zonename 。如果未提供 zone 声明, nsupdate 将尝试根据输入的其余部分 确定要更新的正确区域。 |
class {classname} | 指定默认类别。如果未指定类别, 将使用默认类别 IN(互联网)。 |
key {name} {secret} | 指定所有更新都要使用 keyname 和 keysecret 对进行 TSIG 签名。 key命令会覆盖通过命令行选项 -y或-k指定的任何密钥。 |
prereq nxdomain {domain-name} | 要求不存在任何类型的名为 domain-name 的资源记录。 |
prereq yxdomain {domain-name} | 要求 domain-name 存在(至少有一个任何类型的资源记录)。 |
prereq nxrrset {domain-name} [class] {type} | 要求指定类型、类别和 domain-name 的资源记录不存在。如果省略了类别,将假定为 IN(互联网)。 |
prereq yxrrset {domain-name} [class] {type} | 要求指定类型、类别和 domain-name 的资源记录存在。如果省略了类别, 将假定为 IN(互联网)。 |
update delete {domain-name} [ttl] [class] [type [data...]] | 删除名为 domain-name 的任何资源记录。 如果提供了类型和数据,则仅删除匹配的资源记录。 如果未提供类别,默认为互联网类别。 ttl 将被忽略,仅为了兼容性而允许。 |
update add {domain-name} {ttl} [class] {type} {data...} | 添加具有指定ttl、类别和数据的新资源记录。 |
show | 显示当前消息, 包含自上次发送以来指定的所有先决条件和更新。 |
send | 发送当前消息,相当于输入一个空行。 |
answer | 显示应答。 |
以分号开头的行是注释,将被忽略。这些命令和选项用于配置和执行 nsupdate 命令,用于进行动态 DNS 更新。
选项 | 说明 |
-d | 以调试模式运行 nsupdate ,提供更新请求和名称服务器响应的跟踪信息。 |
-k keyfile | 指定用于进行 TSIG 签名的密钥文件。允许对更新请求进行身份验证。 |
-y keyname:secret | 使用指定的 TSIG 密钥对进行签名。 keyname 是密钥的名称, secret 是以 base64 编码的共享密钥。 请注意,此选项在命令行上以明文形式提供密钥, 可能对安全性构成风险。 |
-t timeout | 设置更新请求的最大超时时间(以秒为单位)。默认为 300 秒。 如果将超时时间设置为 0,则禁用超时。 |
-u retry-interval | 设置 UDP 重试间隔(以秒为单位)。默认为 3 秒。 如果将重试间隔设置为 0, 则系统将根据超时间隔和 UDP 重试次数来计算间隔。 |
-r retries | 设置 UDP 重试次数。默认为 3 次。 如果将重试次数设置为 0,则只会进行一次更新请求。 |
-v | 使用 TCP 连接发送更新请求,而不是默认的 UDP。 适用于批量更新请求。 |
5、使用示例
1)向域名 example.com 添加一个新的 A 记录
nsupdate -k /path/to/keyfile << EOF server dns.example.com zone example.com update add host1.example.com 86400 A 192.168.1.100 send
2)从域名 example.com 删除一个 MX 记录(邮件交换记录)
nsupdate -k /path/to/keyfile << EOF server dns.example.com zone example.com update delete mail.example.com MX send
3)设置资源记录的 TTL(生存时间)和类别
nsupdate -k /path/to/keyfile << EOF server dns.example.com zone example.com update add txtrecord.example.com 3600 CH TXT "This is a TXT record" send
4)多网卡可以使用 -l 选项来指定本地地址
nsupdate -l 192.168.1.10 << EOF server dns.example.com zone example.com update add host2.example.com 86400 A 192.168.1.200 send