简单自搭 DDNS 动态域名

看到有些朋友因为 DDNS 的设置而头疼。简单写一篇 DDNS 的傻瓜指南。

DDNS (Dynamic Domain Name System) 动态域名系统简介。

要从外网访问你自家的设备,譬如 NAS, 必须有一个公网地址。这个地址是一串 4 个字节的数字(本文仅讨论 ipv4,弄懂的话 ipv6 理解起来完全相同)。这四个字节的数字叫 IP 地址。

理论上任何公网上的设备都有 IP 地址。但你的宽带运营商有时会做出限制,让外网没法直接通过真实 IP 访问到你的设备,也就是你的宽带其实是在一个更大的局域网一部分(被 NAT 了)。如果遇到这种情况(一般可以通过查看路由器 WAN 口地址得知是否被 NAT ),建议直接致电运营商客服让他们给你个公网 IP。(一般都给,遇上不太懂的或犟的自己想想办法)

有了公网 IP 也就能从外网访问了。但这时我们会遇到另一个问题,就是家用宽带往往是一大群人公用一个 IP 池,也就是每次重启路由器你会发现公网地址变了。这是正常情况,但我们也不太可能每次重启路由器都进去配置页面看一眼公网 IP 是啥再出门。所以要想办法让我们用一个固定地址而不是每次都需要重新记的动态 IP 来连回家。

DDNS 就是为这个目的存在的。我们知道「域名」的作用是用一串好记的文本地址代替数字的 IP 地址。而 DDNS 就是让这串固定的域名永远指向真实的 IP。因为真实 IP 是动态的,所以取名「动态 DNS」。

怎么搭家用 DDNS

搭家用 DDNS 的硬性条件其实就两点:

  1. 有动态公网 IP;
  2. 有个域名

第一条前文讲过了。第二条「有个域名」指的是「有一个属于你的,且能自由改 DNS 解析的域名」。

也许有人会提问 DDNS 用的域名跟普通的域名是不是不一样。其实域名就是域名不分什么普通域名或 DDNS 域名。

之所以会出现「DDNS 需要用专用的域名」这种印象是因为很多「DDNS 供应商」,譬如阿里向日葵什么的,往往把他们的服务限定在了自己的子域名内。这样做一是让你可以「借用」他们的二级域名,譬如 <randstr>.oray.com 来解析,二是能方便它隐藏从 DDNS 客户端往域名解析服务器的请求方式。

DDNS 的运作原理其实非常简单:每隔固定一段时间把指向某个域名的 IP 地址更新成真实的公网 IP 。所以你在有了自己的域名和 IP 后,唯一要解决问题只有「定时更新 DNS 解析」这一条。

很多路由器,硬路由或软路由,自带 DDNS 应用。大多数免费的 DDNS 服务都是由厂商提供二级域名,然后用他们的专属 DDNS 应用往域名服务器定时发送更新地址请求。此类 DDNS 应用只需要按照软件的指引把该有的配置填好就能用,此文不多涉及。

而很多时候我们会遇到不适用专属 DDNS 的情况。譬如路由器不支持,或者厂商不做人等。像是 tplink 前阵子停了自己的 DDNS 解析,而向日葵的 DDNS 一向又难用又吃相难看。所以自搭 DDNS 就很有必要。况且也非常简单。

上文提过 DDNS 只需要定时更新域名解析地址即可。因此 DDNS 应用其实不必须部署在路由器上,完全可以交给 nas 甚至家用电脑。

先去注册一个域名,最便宜的那种。如果你原本已经有域名且用在了其他地方,那你也完全可以复用这个域名,只要添一条子域名的 A 记录指向你的家宽 IP 就行(譬如 ddns.<yourdomain>.<net>)。

然后就是利用域名商提供的 API 接口,譬如 cloudflare 的接口就是这样的,那我们只需要新建一个执行文件把文档里提供的 curl 命令填进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat << EOF | tee ~/updatedns.sh
curl https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID \
-X PATCH \
-H 'Content-Type: application/json' \
-H "X-Auth-Email: $CLOUDFLARE_EMAIL" \
-H "X-Auth-Key: $CLOUDFLARE_API_KEY" \
-d '{
"name": "example.com",
"ttl": 3600,
"type": "A",
"comment": "Domain verification record",
"content": "'$(curl -4 ip.sb)'",
"proxied": true
}'
EOF
chmod +x ~/updatedns.sh

上面命令里的 $ZONE_ID $DNS_RECORD_ID $CLOUDFLARE_EMAIL$CLOUDFLARE_API_KEY 分别都改成真实的域名、子域名、cf 邮箱和 api 密钥即可(最后一个在 这里 创建)

最后用 crontab 或 systemd timer 之类的定时任务工具定时执行这个脚本就好了

1
2
sudo crontab -e
@hourly /home/<user>/updatedns.sh

或者也可以用 ddclient 这样的工具, 按照文档把相关配置填上运行即可。如果你不喜欢自己写脚本。(个人认为用这些工具还不如自己弄个小脚本方便)

总结

以上就是在 nas 上自搭 ddns 应用的简单方法。可以看出只要有长期开着的机器,ddns 应用不限定在 nas 、路由器或者家用电脑上。因为 curl -4 ip.sb 这样的命令不管从你内网的那个机子上请求都能获取公网 ip. ip.sb 这个地址你可以完全可以换成 ifconfig.me 这些,只要提供 ip 识别服务的都行,哪个快用哪个。