动态 DNS

出自 ArchWiki

根据维基百科

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

对于 RFC2136,有来自 bindnsupdate(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 天手动确认其域名。增强型用户不需要域名确认。更多信息请访问 Why is My Hostname Pending Deletion?

使用外部网站确定 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 等工具自动化该过程。