跳转至内容

动态域名系统

来自 ArchWiki
(重定向自 Dyndns)

根据 Wikipedia

动态 DNS (DDNSDynDNS) 是一种自动更新 名称服务器域名系统 (DNS) 中,通常是实时更新其配置的主机名、地址或其他信息的活动 DDNS 配置的方法。
该术语用于描述两个不同的概念。第一个是“动态 DNS 更新”,它指的是用于在不手动编辑的情况下更新传统 DNS 记录的系统。这些机制在 RFC 2136 中进行了说明,并使用 TSIG 机制提供安全性。第二种动态 DNS 允许轻量级和即时更新,通常使用更新客户端,这些客户端不使用 RFC2136 标准来更新 DNS 记录。这些客户端为频繁更改其位置、配置或 IP 地址 的设备提供持久的寻址方法。

对于 RFC2136,可以使用 bind 中的 nsupdate(1)。对于动态 DNS 服务,有几种可用软件包,请参阅 #更新客户端

路由器

如果需要 DDNS 的设备位于路由器后面,您应该首先检查路由器本身是否可以更新任何 DDNS 服务。尽管服务选择可能有限,但使用路由器有几个优点:设置可能更简单,几乎不需要维护,并且不会有停机时间(如果路由器出现故障,您也不会有互联网连接)。

更新客户端

请注意,一些动态 DNS 提供商不需要专用客户端,可以使用 cURL 进行更新。

多服务客户端

  • ddclient — 更新多个动态 DNS 服务账户的动态 DNS 条目。
https://github.com/ddclient/ddclient || ddclient
  • inadyn — 支持 SSL/TLS 的动态 DNS 客户端。
https://troglobit.com/projects/inadyn/ || inadyn
  • inadyn-mt — 基于 inadyn 的小型简单动态 DNS 客户端。
https://inadyn-mt.sourceforge.net/ || inadyn-mtAUR
  • ndyndns — 支持 DynDNS 和 Namecheap。
https://github.com/niklata/ndyndns || ndyndnsAUR

单服务客户端

  • duckdns — 使用 systemd 从您的计算机更新 DuckDNS.org 条目。
https://www.duckdns.org/ || duckdnsAUR, duckdns-ipv6AUR
  • hetzner_ddns — Hetzner DNS 的动态 DNS 守护进程
https://github.com/filiparag/hetzner_ddns || hetzner_ddnsAUR
  • noip — no-ip.com 服务的动态 DNS 客户端更新器。
https://www.no-ip.com/downloads.php?page=linux || noipAUR

ddclient

ddclient 兼容许多 DDNS 服务,并且是当您的 路由器 不是一个选项时推荐的 DDNS 更新工具。它包括 systemd 支持。

安装后,编辑配置文件 /etc/ddclient/ddclient.conf 以设置您的 DDNS 提供商(其中包含许多示例)。然后 启用启动 ddclient.service

可以通过运行带有 -noquiet-debug 选项的 ddclient 来测试配置

# ddclient -daemon=0 -noquiet -debug

下面列出了一些兼容的服务,但您也可以查看 示例协议 以获取更多信息。

ddclient 兼容的服务
服务 配置说明
Now-DNS 示例
ChangeIP 示例
Duck DNS 示例
FreeDNS 示例
No-IP 使用协议 noip,服务器 dynupdate.no-ip.com
nsupdate.info 使用协议 dyndns2
Dyn DNS 示例
Namecheap 示例
Dynu 示例
注意:no-ip 的免费用户需要每 30 天手动确认其域名。但是,增强型用户不需要域名确认。更多信息请参阅 我的主机名为何待删除?

使用外部网站确定 IP 地址

如果 ddclient 无法检测到您的 IP 地址,您可以配置 ddclient 从外部网页(例如 checkip.dyndns.org)获取您的 IP。当指定 use=web 时,默认使用此地址。还建议增加检查间隔,以避免频繁请求 IP 检查服务。

/etc/ddclient/ddclient.conf
daemon=900
# obtain IP address from web status page
use=web

可以使用 web 键指定备用 IP 检查服务

/etc/ddclient/ddclient.conf
daemon=900
# obtain IP address from web status page
use=web, web=myonlineportal.net/checkip

使用本地脚本确定 IPv6 地址

ddclient 通常会获取错误的 IPv6 地址或根本不获取,但可以使用本地脚本而不是外部网站来确定 IPv6 地址。可以使用此脚本。

/usr/local/bin/get-ip
#!/bin/sh
ip -6 -o addr show scope global | awk -F '[ \t]+|/' '$4 ~ /^[23]/ {print $4}'

告诉 ddclient 使用脚本

/etc/ddclient/ddclient.conf
# obtain IP address from script
usev6=cmdv6,cmdv6='/usr/local/bin/get-ip'

使用 UPnP 或 NAT-PMP 确定外部 IPv4 地址

如果您的路由器支持 UPnP,请 安装 miniupnpc 并使用 external-ip 工具。

/etc/ddclient/ddclient.conf
# obtain IP address from script
usev4=cmdv4,cmdv4='/usr/bin/external-ip'

对于 NAT-PMP,请安装 libnatpmp 并创建一个包装 natpmpc 输出的脚本。

/usr/local/bin/get-ip
#!/bin/sh
natpmpc | grep -oP 'Public IP address : \K\S+'

使脚本 可执行 并告诉 ddclient 使用它

/etc/ddclient/ddclient.conf
# obtain IP address from script
usev4=cmdv4,cmdv4='/usr/local/bin/get-ip'

其他提供商

其他 DDNS 提供商不兼容 ddclient,因此使用它们更新您的 IP 可能需要特殊工具或一些自定义脚本。请记住,如果服务允许您使用命令行更新 IP,您可以使用 cronsystemd/Timers 等工具自动化该过程。