之前的文章中曾提到我使用HE.NET的DDNS以及路由器的NAT功能来实现任何地方都可以访问到家里的局域网,非常方便。
(图源 :pixabay)
但其实有不止一种方式来实现DDNS功能,本文将逐一为你介绍。
直接编辑文件
所谓的DDNS本质就是动态更新域名的解析记录,而域名解析记录,本质上就是DNS(Domain Name Server)上的一条文本记录。
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025043001 ; Serial (YYYYMMDDnn)
3600 ; Refresh (1 hour)
1800 ; Retry (30 minutes)
1209600 ; Expire (14 days)
86400 ) ; Minimum TTL (1 day)
; NS 记录
IN NS ns1.example.com.
IN NS ns2.example.com.
; A 记录
ns1 IN A 192.0.2.1
ns2 IN A 192.0.2.2
www IN A 192.0.2.100
mail IN A 192.0.2.200
home IN A 192.0.2.123
; CNAME 记录
ftp IN CNAME www.example.com.
; MX 记录
IN MX 10 mail.example.com.
; TXT 记录
@ IN TXT "v=spf1 a mx ~all"
所以原则上,我们可以直接编辑上述文件中的解析内容,来实现某条记录(比如www.example.com的A记录)的更新。
但是这样前提是自己运行DNS(域名服务器)比如Bind,而且手工编辑就失去了动态的意义了。所以这里介绍这种方式,仅仅是为了说明以下各种操作的基本原理。
使用脚本编辑 Zone 文件
有了上边的基础知识,我们就可以考虑使用脚本来更新相关域名的Zone File中的指定记录了。
一般来讲,我们要使用DDNS更新记录(一般来讲都是A记录)基本都是本地机器(为了世界各地都可以访问),而DNS通常都是公网上的服务器,所以我们需要两部分脚本。
一部分运行在本地机器上,获取本地机器在公网上的IP(可以在公网HTTP服务器上放置回显IP的脚本),并将IP值传递给DNS上的接收脚本。
DNS服务器上的接收脚本接收到IP更新请求后,判断IP值是否有所变化,如有变化则更新域名Zone File中的相应解析记录,并Reload相应的Zone.
虽然这里对原理的介绍看上去不过三五句话,很是简单,但要实现稳定可靠的脚本且要考虑安全性等因素,实践起来还是很麻烦的。所以十几年前,虽然自己在运行一些DNS,但还是没使用这个方案。
(咦,想了一下,其实接收脚本就可以获取本地机器的公网IP,所以步骤还可以简化,不过先获取IP也没毛病)
使用nsupdate 实现动态更新
使用nsupdate
可以简化并加固上述脚本编辑Zone文件的过程,当然一些前置的工作也不能少,比如:
- 给对应的zone添加 allow-update 权限
- 生成用于认证的密钥
这样之后,就可以使用nsupdate
命令对指定的域名的Zone文件进行操作了,比如增加、删除、修改相应的解析记录。
再之后,在脚本中先获取本地机器的外网IP,在使用nsupdate
命令更新DNS上的Zone文件,就可实现完整的DDNS功能呢。
这样做的好处是显而易见的,我们无需在DNS服务器上增加接收、更新脚本了,而且也不用我们自己设计、实现安全机制,相对要靠谱许多。
使用第三方DDNS服务
尽管上述机制都能实现DDNS服务,但是不难看出要想实现相应的功能,我们必须运行自己的DNS服务器,虽然我运行几台DNS服务器长达十数年,但是我并不觉得这是一件简单的事情,而且还需要耗费大把的Money!
所以使用第三方的DDNS服务无疑是个非常明智的选择。
据我所知有很多提供免费DDNS服务的服务商,比如No-IP、Cloudflare等等(国内以前似乎还有个叫花生壳的,也是做这个的,不知道现在还在不在)。
但这些服务商我基本都没尝试过,我觉得He.net就很好用,没错,He.net大概也可以算作提供第三方DDNS服务。
使用He.net的DDNS关键步骤如下:
将要解析的域名DNS设置为HE.NET的DNS
在HE.NET的DNS面板中添加域名
添加对应的解析记录(比如A记录),并选取“Enable entry for dynamic dns”
生成用于DDNS客户端的密码(Generate the key used for dynamic DNS updates)
在主机上使用DDNS client。(设置定时任务)
因为具体操作不是本文的重点,所以就不一一赘述了。
Linode、Godaddy等解析服务商
之所以想到这个话题,是因为这两天我突发奇想,如果不自己运行DNS服务器,又不使用第三方的DDNS服务,仅使用Linode或者Godaddy的解析服务,那么是否可以实现DDNS功能呢?
答案还真是可以的。
简单来讲,就是Linode、Godaddy这些解析服务商都提供了API访问 (读写功能),所以我们开启相应的API功能,并实现相应的更新脚本,就可以啦。
具体如何实现,这里就不过多阐述了,毕竟HE.NET的DDNS服务我用得非常好,没必要瞎折腾啦。
而且Linode、Godaddy等服务商没法针对单个域名或者单个记录进行权限设置,比如Linode,设置一个允许对域名读写的API,那么就可以对所有域名的所有记录进行读写。
相比之下,HE.NET的DDNS为每个记录分配一个密码(KEY),无疑安全性要高得多。
结论
通过学习我们了解到可以用N多种方式来实现DDNS功能,这大概就是十八般武器,甚至枝条、树叶都可以用来杀敌。
但是无论是用小刀看大树还是用电锯削铅笔,都是脑残的行为,所以选择最便捷最适合自己的方式还是很重要的。嗯,没错,我还是坚定地选择HE.NET。😀