这两天在家里用树莓派折腾了一个家用服务器,主要用来做 mac 的 Time Machine ,还有就是当做下载机和 nas ,想着平时上班时间家里没人用网络,空着也是空着,就可以利用空闲带宽下个美剧啥的。所以在服务器上装了个远程迅雷和 transmission ,这些网上教程一大把,跟着教程做很快就能搞好。
但是我遇到的问题就是,家用的宽带不是固定 IP 的,如果路由器断个网重新连接就会被分配到不同的 ip ,一旦 ip 换了那就没办法通过外网连接到服务器上了。之前也尝试过在路由器上绑定花生壳,但是实际使用效果不是很好,不是很清楚花生壳的动态更新机制,好几次家里网络已经更新了 ip 但是花生壳那边没有及时更新。
花生壳的方案不行,那就只有找别的方法了。同时我顺便了解了下花生壳能够动态解析域名的原因,原来使用的是 DDNS 服务,关于 DDNS ,网上的解释是:
DDNS ( Dynamic Domain Name Server )是动态域名服务的缩写。
DDNS 是将用户的动态 IP 地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态 IP 地址传送给位于服务商主机上的服务器程序,服务器程序负责提供 DNS 服务并实现动态域名解析。 --百度百科
这不正是我需要的功能么,正好我自己也有域名,我的域名是在阿里云上注册的,所以我就去阿里云上看有没有提供动态域名解析服务,果不其然在网站上找到了修改解析记录的 api 文档。
由于我比较擅长的是 java(其实也是唯一擅长的),所以我下了他们的 JAVA SDK ,申请好Access Key 很快就接入成功了,但是感觉在 Linux 服务器上用 Java 来执行更新好像是件很 Low 的事,正常的使用方式应该用脚本才对啊。正好最近我在自学 Phthon ,所以顺便边学边做用 python 脚本来实现吧。
好啦,以上的都是废话,下面的才是正题。
1.首先你得有个阿里云的域名
2.到阿里云管理控制台申请Access Key
3.下载Python sdk,SDK 主要帮我们封装好了一些数据格式转换和对接的方法,能够方便我们快速接入,当然如果你足够牛逼的话,你也完全可以全部自己写。
4.进行接入操作。我的主要思路是运行该脚本的时候先去阿里云获取域名绑定的 ip 地址,再跟
当前服务器 ip 地址做对比,如果 ip 相同则说明没改变,不需要操作。如果 ip 不同则修改域名绑定的 ip 地址。
5.服务器部署。在服务器上通过 corntab 设置一项定时计划,让服务器定期执行该脚本。 linux 设置定时计划命令:
crontab -e
几个注意点:
1.请记得保管好你的 Access Key ,所以我没有在我的代码里直接写 Access Key Id 和 Access Key Secret ,我把他们单独放在一个 key.json 文件中,同时将这个文件排除出 git ,保证只有我自己知道,因为一旦这两个值泄露了那别人就可以直接修改你的域名了。
2.阿里云通过 RecordId 来区分每条域名解析记录,但是他们之前文档上对于这个参数的描述只写了“解析记录的 ID ”,没有写如何获取这条解析记录 ID ,我去我的阿里云控制台上找了好久都没找到,到后来我突然想到 sdk 上有获取域名信息的 api ,我试着用这个果然返回的信息里有这个字段,后来联系了他们客服,他们也说在控制台上没办法找到,也只有通过 api 获取域名信息才能找到,后来他们也在文档中注明了这个字段的获取方式。
3.更新域名解析主要用到的是阿里云 sdk 包里 aliyun/api/rest/Dns20150109UpdateDomainRecordRequest.py 方法,我为了偷懒直接在这个方法里写死了一些需要固定传入的参数,如果你要对自己的域名做解析的话记得去修改这些参数值。
4.我已经把这个项目发到 github 上,欢迎有需要的使用,同时也欢迎一起交流,github 地址
1
abelyao 2016-01-10 16:29:22 +08:00 3
话说… 楼主… 如果只是为了 DDNS 可以用 Dnspod 有 API 可以直接操作…
并且通过 cron 定时任务,一行脚本的事… */15 * * * * curl -k -X POST https://dnsapi.cn/Record.Ddns -d 'login_email=登录邮箱&login_password=登录密码&format=json&domain_id=域名编号&record_id=记录编号&record_line=默认&sub_domain=子域名' 每 15 分钟更新一次 |
2
abelyao 2016-01-10 16:30:18 +08:00
当然… 我赞同所有以学习为目的的折腾,上面的回复仅仅针对 DDNS 的多种实现方式…
|
3
abcbit 2016-01-10 16:30:22 +08:00
何必這麼麻煩,而且 DDNS 的可靠性太差,更新也慢
1 、租個 vps ,裝上 nginx+php 或 python 2 、树莓派定期執行 wget 或 curl 到 vps 的網址,最好加上驗證比如 a.com/get?key=1234 3 、訪問 vps 上的網頁,得到最新的 remote_addr |
4
yexm0 2016-01-10 16:39:56 +08:00 via Android
ddns 更新应该不慢吧。我用路由器挂 he 的 ipv6 隧道就要用到它们给的 ddns 功能,我见每次重拨后域名对应的 ip 都有及时更新啊。
|
7
miaol OP @abelyao
1.你这个果然好简单,一行代码能搞定,我之前真的不知道还有这个,又学到了一个新技能,非常感谢👍 2.我的域名是放在阿里云上的,如果要用 dnspod 的话得把我的域名转过去才行,我对阿里云的服务还是比较满意的,暂时不想换 3.好吧被你说中了,其实我真的只是自己闲着没事干想吓折腾下而已==! |
8
bdbai 2016-01-10 16:59:37 +08:00 via iPhone
|
9
abelyao 2016-01-10 18:40:32 +08:00 1
|
11
Slienc7 2016-01-10 19:02:28 +08:00
花生壳更新不及时是路由器的问题,不是花生壳的问题。
花生壳也有 API 。 |
12
miaol OP @xgowex 我觉得应该也是,但是路由器只能填花生壳账号信息,没办法对更新频率做设置。好吧,是我误会花生壳了,他是个好同志==!
|
14
miaol OP @wuhanpizi 果然是这样啊,只能怪我之前了解的太少了,但是我这个都已经弄好了懒得再换了,不过又学到了一种新的实现方法也挺好的,非常感谢!
|
15
maskerTUI 2016-01-10 23:27:37 +08:00 via Android
看到前面我就想起 tunnel 了
|
16
clanned 2016-01-11 00:15:11 +08:00 via Android
Dnspod 或者 cloudxns 可以参考我这里的脚本 https://github.com/xdtianyu/scripts/tree/master/ddns ,我在 ddwrt 和 openwrt 上用了很久了。 https://www.xdty.org/?s=Ddns
|
17
lesliejiang 2016-12-26 23:08:13 +08:00
@abcbit 好想知道具体怎样做的。被动态 IP 搞死~
|
18
Terenc3 2017-02-08 13:52:49 +08:00
我的动态域名也放在阿里云,其他域名都在 DNSPOD ,主要是阿里云年付 40 块就可以买到 TTL 1 秒的付费服务!!!!
1 秒,什么概念! 不过我一般用 30 秒,因为 1 秒太夸张了,基本上每次访问都要去获取 DNS 。另外阿里云 DNS 同步速度挺快的,家里用 PPPoE ,然后使用 python 写了个脚本调用 API ,再使用 crontab 设一个任务每分钟获取。 用了半年,非常平稳。 请原谅我再一次地推销我的文章: 通过 python 将阿里云 DNS 解析作为 DDNS 使用 >> 文章短链接 >> https://c4.hk/2l |
19
Alliot 2017-04-10 11:33:43 +08:00
呼,过了几个路由,感觉还是得用内网穿透了
|
22
snowice123 2018-04-19 22:16:53 +08:00
@abelyao 你好,可以回复一下我吗,大哥,我现在急需弄一个阿里云动态 DNS,用做厂里的 VPN 连接,你这招是怎么弄的啊,谢谢,你能留一下 QQ 吗,
|
23
snowice123 2018-04-19 22:19:19 +08:00
@miaol 大哥,我现在急需一个你这样的阿里云 DNS ——因为现在用的是花生壳的 DDNS,不稳定,能教一下吗。1.2 步可以看懂,到第三步我就看不懂了,我没编程基础,能教下小白吗,谢谢
|
24
abelyao 2018-07-18 04:35:22 +08:00 via iPhone
@snowice123 回复你了你也收不到了啊……
|
25
vow 2020-01-17 13:49:38 +08:00
来的有点晚
duckdns.org 满足你 |