这两天在家里用树莓派折腾了一个家用服务器,主要用来做 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 地址

 

24 回复  |  直到 2018-07-18 04:35:22 +08:00

 
    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 都有及时更新啊。
 
    5
 

bdbai   2016-01-10 16:46:54 +08:00 via iPhone

 
@abelyao 原来 DNSPod 还有这一手...蠢蠢的我还去解析手机版页面登录提交

通过阿里云域名动态解析 IP 地址的更多相关文章

  1. 无法Ping通阿里云服务器的公网IP地址的解决方法

    解决步骤: 1.打开控制台2.打开防火墙3.添加规则添加规则的详情页,可以添加全部TCP也可以自定义添加一定端口范围的TCP:

  2. 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程

    第一步:登录阿里云官网,获取服务器ECS的指定公网IP地址. 1.输入阿里云官网账号进入首页,如下图: 2.点击进入"管理控制台",如下图: 3.点击"云服务器ECS&q ...

  3. 网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+

    网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+ HTTPDNS_移动开发_域名解析_域名防劫持-阿里云https://www.aliyun.com/prod ...

  4. 阿里云域名绑定IP

    前提条件:拥有一个阿里云域名,拥有一台自己的服务器,并且知道ip,我的是nginx 1.登陆阿里云https://www.aliyun.com/ 2.选择域名与网站,会看到自己拥有的域名,比如我的是m ...

  5. 阿里云域名和ip绑定步骤

    阿里云域名和ip绑定步骤 一.总结 一句话总结:域名转IP信息存在所在地运营商那,比如电信联通等. 1.给域名添加对应ip的过程叫做什么? 域名解析 2.域名解析中的记录代表什么意思,记录值呢? 记录 ...

  6. 亚马逊EC2服务器申请+NODE服务器部署+阿里云域名申请+SSL证书使用

    最近,由于项目需要,自己申请了一台亚马逊用于部署网站测试,在使用期间,发现网上没有一篇非常完整的文章讲解从服务器申请到域名解析,SSL证书申请的整个流程.所以自己总结一下,以供大家学习! 一.亚马逊E ...

  7. 阿里云域名+github建立网站

    1.准备工作 ①购买一个阿里云域名,这里测试的域名为 www.cores.vip ②创建一个github账号 (注意:一个github账号只能建立一个username.github.io的网站,不能建 ...

  8. 使用 DNSPOD API 实现域名动态解析

    0. 简单概述在家里放一个 NAS 服务器,但是宽带的 IP 地址经常改变,一般路由器自带的花生壳域名解析可以解决,如果路由器没有类似功能或者想使用自己的域名,可以尝试使用 DNSPOD API 来实 ...

  9. 阿里云域名的ssl证书申请与腾讯服务器域名的证书安装

    阿里云域名中的SSL证书申请,腾讯云服务器中的证书安装: 因为公司的与域名都在阿里云上面,服务器却用的是腾讯云的.记得前2年用阿里云管理平台的时候,域名的SSL证书都很好找,也许是长时间不用,找SSL ...

随机推荐

  1. <LeetCode OJ> 257. Binary Tree Paths

    257. Binary Tree Paths Total Accepted: 29282 Total Submissions: 113527 Difficulty: Easy Given a bina ...

  2. POJ 3373 Changing Digits

    题目大意: 给出一个数n,求m,使得m的长度和n相等.能被k整除.有多个数符合条件输出与n在每位数字上改变次数最小的.改变次数同样的输出大小最小的.  共同拥有两种解法:DP解法,记忆化搜索的算法. ...

  3. Windows下ADB使用相关问题

    Windows下ADB使用相关问题 适用环境: 在Windows XP.WIN7下均可按本文操作进行.WIN8下没有进行实验.但操作设置大致同样.除了第4步.adb_usb.ini的位置可能有所不同以 ...

  4. Apc缓存Opcode(转)

    1.PHP执行 PHP的运行阶段也分成三个阶段: Parse.语法分析阶段. Compile.编译产出opcode中间码. Execute.运行,动态运行进行输出.                   ...

  5. jquery插件中使用ajax并且获取使用插件的对象

    jquery插件中使用ajax后无法在里面获取this 解决办法是在函数内使用ajax前声明变量 $this=this 然后再ajax中使用$this

  6. js错误: Unexpected number in JSON at position 2792 value里面有双引号怎么解决

    源头  出现这个报错提示,大家从错误就可以看的出来,这就是json的错误,一般来说都是json格式出现了错误,本人遇到比较多的情况就是json字符串里面出现了一些会影响json格式的符号,这次出现这个 ...

  7. java中 ExecutorService,Executor,ThreadPoolExecutor的用法

    package com; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; import ...

  8. wifi认证Portal开发系列(一):Radius与FreeRadius简介

    RADIUS 维基百科上的介绍: Remote Authentication Dial-In User Service (RADIUS) is a networking protocol that p ...

  9. java提高同步锁的几点建议

    1.减少锁的持有时间,只对关键的代码块加锁,减少synchronized锁内部的无关模块: 2.减小锁粒度,如Collections.synchronizedMap(map)返回线程安全的map会锁整 ...

  10. 移动应用开发测试工具Bugtags集成和使用教程【转载】

    前段时间,有很多APP突然走红,最终却都是樱花一现.作为一个创业团队,突然爆红是非常难得的机会.然并卵,由于没有经过充分的测试,再加上用户的激增,APP闪退.服务器数据异常等问题就被暴露出来,用户的流 ...