这两天在家里用树莓派折腾了一个家用服务器,主要用来做 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. 《Linux设备驱动开发具体解释(第3版)》(即《Linux设备驱动开发具体解释:基于最新的Linux 4.0内核》)网购链接

    <Linux设备驱动开发具体解释:基于最新的Linux 4.0内核> china-pub   spm=a1z10.3-b.w4011-10017777404.30.kvceXB&i ...

  2. eclipse中文件文件夹高速定位,打开文件所在文件夹,在资源管理器中查看

    viewFile.bat (打开选中的文件获取目录) Explorer/e,/select,%1 viewjava.bat (打开选中的文件名称相应的.java文件) @echo off set ca ...

  3. apue学习笔记(第七章 进程环境)

    本章将了解进程的环境. main函数 C程序总是从main函数开始执行,main函数的原型是: int main(int argc,char *argv[]); 其中,argc是命令行参数的数目,ar ...

  4. unbuntu16.04上python开发环境搭建建议

    unbuntu16.04上python开发环境搭建建议  2017-12-20  10:39:27 推荐列表: pycharm: 可以自行破解,但是不推荐,另外也不稳定 pydev+eclipse: ...

  5. js 显示当前系统时间

    <div id="test"></div>                <script >                    setInt ...

  6. Map输出数据的处理类MapOutputBuffer分析

    MapOutputBuffer顾名思义就是Map输出结果的一个Buffer,用户在编写map方法的时候有一个参数OutputCollector: void map(K1 key, V1 value, ...

  7. android 编译问题解决

    1.android4.2.2 '/root/origin_android/mokesoures/out/target/common/obj/APPS/ApplicationsProvider_inte ...

  8. Android TextView setText卡顿问题

    TextView 是经常使用控件之中的一个,最经常使用的方法是setText()  . 可是 我们在显示大量的文本的时候,使用setText还是会有一些性能的问题. 这篇文章 关于TextView的s ...

  9. 【转】安卓逆向(一)--Smali基础

    转载自吾爱破解安卓逆向入门教程 APK的组成 文件夹 作用 asset文件夹 资源目录1:asset和res都是资源目录但有所区别,见下面说明 lib文件夹 so库存放位置,一般由NDK编译得到,常见 ...

  10. MySQL 优化1

    系统在应用时间很长的情况下会慢慢变得很慢,无论是人还是机器为了更好的工作和学习都需要适当学习.数据库也是一样的用久了, 自然就会产生空间碎片,需要我们都i数据库中的数据块进行维护和整理.下面以实例来说 ...