昨日(2016-04-04)突然地脑抽,买下了一个域名 aircheese.me
然后我就呆(meng)了,有了域名怎么连接到家里的树莓派呢。我什么都不懂买这个域名干啥子。
再然后,我查了一下

.ME域名是欧洲西南部的国家黑山共和国(Montenegro,原为南斯拉夫社会主义联邦共和国的一部分,2006年宣布独立)的国家域名。[1]

我还能说啥。。瞬间小众了起来,就像用了typecho一样

------ 废话不多说 ------

0 空
得知 HE DNS (https://dns.he.net/) 是因为我在香蕉派的群里面吐槽上面那个域名的时候,顺带问的。好心的群友们向我推荐了好几个动态域名解析服务,比如 dnspod 和 dnsimple;宅猫和EFS 推荐了HE DNS。其中dnspod是国内的,我只是注册了一下,并不了解,就不多说了,好像有国际版?。。然后 dnsimple 是付费服务,HE DNS 是免费的动态DNS。上了HE DNS 的主页看了一下,发现操作什么的都非常简单,除了官网严重简陋,还算很不错的。

1 相关教程
当然,我为了偷懒,一般遇到不懂的,第一反应不是去翻文档,而是直接上百度谷歌搜教程
于是,找到了一篇看起来很全面的[2]:
推荐稳定的国外免费DNS he.net DNS操作图文教程
http://www.jb51.net/yunying/88426.html

于是我就很开心地按照他的指导,做啊做啊。直到最后一步,坑爹了,说好的动态域名服务去哪了?!

教程只教了一半,不过好在DDNS 与 DNS设置上并不冲突。

2 HE DNS 的 DDNS 设置

先说说设置 DDNS 之前的工作,先按照之前教程提到的教材设置,流程大概如下:
首先,需要在 https://dns.he.net 注册一个账号,信息除了电子邮箱以外都可以乱填,因为他们会通过邮箱发初始密码给你。
然后添加你购买的域名(add a new domain)到 he.net 里面。
再然后,到你的域名供应商(我的是 name.com)处,把你的域名的 name severs(NS 或者叫域名服务器) 全部修改成 he的域名服务器。(第二次进去就找不到了,不想吐槽he的官网了)

ns1.he.net
ns2.he.net
ns3.he.net
ns4.he.net
ns5.he.net

这样你的域名就能被 he 的 dns 解析了。

做完以上步骤,就可以开始 DDNS 的设置。接下来坑不少,多亏了宅猫昨日热心地手把手教我才能完成。

坑0
HE DNS 只支持1个域名的 A 记录上传。这意味着其他域名需要使用 CNAME 来转到那个唯一的能更新地址的域名。
坑1
HE DNS 的手册里面的上传地址的 API 不知道是给什么系统用的,是不能直接复制到树莓派里面使用的。
坑2
想找手册?没门!实在找不到官网上手册的链接,我是直接打地址进去的。手册就1页。
https://dns.he.net/docs.html

开始之前先说说 HE DNS 的动态更新地址的流程:
第一次,需要先登录 HE DNS 的网站,生成或者设置一个密匙。然后就可以使用 HE DNS 提供的 API 使用你喜欢的方式之一(直接访问,post,get都可以,请参照坑2的文档)上传或者让他自动识别你的ip即可。然后把这个 API 放入树莓派的定时任务,crontab 里面,让它每隔5分钟,调用一次 API 即可实现 DDNS。再简单点说,API 就是个 url, 相当于让树莓派每隔5分钟访问一次这个地址,服务器便会自动记录下你的新IP。

好吧,吐槽了那么多,要开始了
登录之后,就是这个样子的了,你们还没设置 A 或者 CNAME 的话会没有最下面那两列。没关系,现在开始设置。

找到 “NEW A” 点它,会出来这个界面

以 aircheese.me 来做示范,你可以在 Name 那里填写 aircheese.me 或者 www.aircheese.me 区别并没有太大,后面的上传 IP 的 API 会需要这个地址。API 和这个地方设置的保持一致就可以了。

然后,勾上允许动态更新的勾勾,TTL (Time-To-Live)就会自动帮你设置成5分钟,这意味着你的地址有效时间在DDNS服务器上持续保留五分钟。这个意味着你上传了IP之后,可能会延迟最长5分钟才会生效 (当然也取决于你当地的DNS缓冲),并不意味着你5分钟之内不上传你的IP,DNS就没办法找到你,五分钟之后如果没有新的 IP 被上传,DNS会维持上一个地址。

点 Submit 保存配置。

接着找到 “NEW CNAME” 会出来这个界面

Host Name 是指我们在上一步设置的那个地址,我们希望在访问 Name 里面指定的那个地址时,也能访问到上一步设置的那个网址。

CNAME 的定义,大概是指别名[3],在访问 CNAME 的时候,DNS 会返回上面那个步骤的域名的 IP,而不是一个新的IP,相当于两个域名指向同一个 IP。 一般,我们希望 www.aircheese.me 和 aircheese.me 都能访问我的博客主页。于是其中一个被在上一步设置成 A Record,另一个就会被设置成别名 (CNAME)。其他的用途,比如ftp服务器等等,都需要CNAME来设置。

设置已经完成大部分!在接下来,我们要生成一个用于上传 IP 的密匙了!
手册里面,

Dynamic records will be denoted with a pale blue row background as well as the generate icon (generate).[4]

请先别看下图,往前翻到第一张图,请告诉我:What the f is the generate icon looks like?!!

好吧,我知道你肯定还是直接往下看了,左下角那个不知道是什么循环意义的标识,就是那个生成密码的按钮。

点它,然后出来下面的这个窗口,点generate a key, 或者你直接输入两个一样的看着顺眼的key。这个key之后在上传 API 用。
点完之后千万别关了窗口,你需要先复制它出来。保存在地址栏,剪切板,或者手抄下来都行。
然后继续千万别关了窗口,你需要点一下submit,提交这个key。
以上,不想吐槽了。

至此,你已经拿到最关键的key了。
接下来测试 API 是否工作。
API文档[4] 在这 https://dns.he.net/docs.html
或者这

curl -4 http://aircheese.me:9X5dz0Vrpv24ysmo@dyn.dns.he.net/nic/update?hostname=aircheese.me

因为我新建 A record 用的是 aircheese.me 所以API的首尾,需要填上 aircheese.me。如果你用的是带 www 的,就要填上 www 的完整地址,比如我需要填 www.aircheese.me

然后,你可以看到中间乱七八糟的一串,这便是上面辛辛苦苦生成的密匙。你把这串替换成你生成的,即可做成了你自己的上传IP的API (url)。这里用的是让HE DNS自动识别的方法,如需手动设置,请参考的API文档。

要注意,如果使用 https 出错,就改成 http 就好。(大坑)
curl -4 的 -4 参数是代表用ipv4访问。如果你的是ipv6 这里需要改成 -6,然后在上面新建 A Record的时候,需要改成新建 AAAA record。看不懂说明你用不到,请忽略。

如果你的不是raspbian,没有内置 curl 的话,就 sudo apt-get install curl

然后可以测试了,复制你改好的这一长串,

curl -4 http://aircheese.me:9X5dz0Vrpv24ysmo@dyn.dns.he.net/nic/update?hostname=aircheese.me

粘贴到终端,回车后,应该返会类似修改成功的或者IP没变的意思,然后还有你的IP,如果没有你的 IP 而是badauth 之类的。请从生成 KEY 的步骤开始再做一遍。

这时候重新登录 dns.he.net, 你就能看到像第一张图片一样的,蓝色底的 aircheese.me 后面的 IP 地址变成了你外网的IP。然后五分钟之后,你随便找一个DNS测试的网站,输入你的网址,就可以看到 DNS 已经更新,他们已经记录你的 IP 地址了

DNS 测试工具:
http://tool.chinaz.com/dns/

如果你不知道什么样子是正常,什么样子是悲剧,你可以输入百度,谷歌,或者我的 aircheese.me 做对比
你会很悲剧的发现,很多DNS还没收录你的网址,还有很多DNS的TTL比你设置的大很多,没关系。。。这需要时间。。

以上。。整个 IP 上传过程就是这样了。接下来我们来实现 D-DNS 的前面那个D
接下来。。
还有接下来,要让 API 每五分钟跑一次,需要把 API 加入 Raspbian 的定时运行任务 crontab。
使用如下命令打开, 参数 -e 代表编辑, -l代表查看

crontab -e

第一次打开,会让你选择使用什么文本编辑器,我是炒鸡linux新手只会 nano。打开后,按照格式把你的 API 填进去

#for he dns to update ip
*/5 * * * * curl -4 http://aircheese.me:9X5dz0Vrpv24ysmo@dyn.dns.he.net/nic/update?hostname=aircheese.me

/5 代表每五分钟更新一次,详细的设置,请自行百度 crontab 的用法
保存退出后,这个服务就自动运行了。

不出意外的话,你的 DDNS 设置完成了!

你可以这么测试,回到 dns.he.net, 手动设置一下 A 的IP到一个不知名的地方,坐等五分钟,看看是否能变回来。。。。


References:

[1]‘me域名_百度百科’. [Online]. Available: http://baike.baidu.com/link?url=XumyfppzLNrG6ZbWwjXQ9kJqm_JB3HnB1NgezvCXpF0hDjSmS0ICG7DJUJ_yegPcwXNxLKxfOWQ9dRDEViFzwK. [Accessed: 05-Apr-2016].

[2]‘推荐稳定的国外免费DNS he.net DNS操作图文教程_alexa域名_网站运营_脚本之家’. [Online]. Available: http://www.jb51.net/yunying/88426.html. [Accessed: 05-Apr-2016].

[3]‘CNAME record’, Wikipedia, the free encyclopedia. 02-Apr-2016.

[4] [Online]. Available: https://dns.he.net/docs.html. [Accessed: 04-Apr-2016].