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

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或FalseEXISTS 指定一个子查询,检测行的存在. EXISTS与IN的使用效率的问题,通常情 ...

  2. java中各种时间格式的转化

    http://www.chinaitpower.com/A/2005-01-14/104881.html 使用java.util.Calendar返回间隔天数         static int g ...

  3. http url转义字符,特殊字符

    空格 - %20 " - %22 # - %23 % - %25 & - %26 ( - %28 ) - %29 + - %2B , - %2C / - %2F : - %3A ; ...

  4. FZU2125:简单的等式

    Problem Description 如今有一个等式例如以下:x^2+s(x,m)x-n=0. 当中s(x,m)表示把x写成m进制时,每一个位数相加的和.如今,在给定n,m的情况下,求出满足等式的最 ...

  5. 06 php 单例模式

    一:单例模式的三大原则 (1)构造函数需要标记为非public(防止外部使用new操作符创建对象),单例类不能在其他类中实例化,只能被自身实例化. (2)拥有一个保存类的实例的静态成员变量$_inst ...

  6. PowerBuilder -- Tab控件

    在tab中关闭窗口 Close(tab_1.getparent()) 调整tab中的控件的tab oder 鼠标右键tabpage_1,选择 Tab Order菜单.

  7. 用Delphi实现网络视频编程

    在MSN.QQ等聊天类的应用程序中,都应用到了网络视频技术.Delphi使用Object Pascal语言是一种完全面向对象语言,可以开发出灵活强大的程序,开发网络视频程序也不在话下.一个完整的网络视 ...

  8. 【题解】P4886快递员

    [题解]P4886 快递员 淀粉质好题!!!加深了我对点分治的理解.最近分治学了好多啊. 题目大意 给定你一颗有边权的树,再给你\(m\)和点对,请你在树上选出来一个点,使得所有点对到这个点的距离的最 ...

  9. Django框架ORM单表添加表记录_模型层

    此方法依赖的表时之前创建的过的一张表 参考链接:https://www.cnblogs.com/apollo1616/p/9840354.html 方法1: # 语法 [变量] = [表名].obje ...

  10. TCP/IP协议之ARP寻址

    ARP协议: 前面讲了网络层的寻址是通过IP地址来做的.其实一个数据包寻址包含两个部分:1 IP寻址.2 ARP寻址. ARP寻址是用在数据链路层上的.我们上网的电脑都有网卡.那么在数据链路层的进行传 ...