基于阿里云API实现简单DDNS
This is a post talking about using Aliyun Domain Control API (and python sdk as well) to script a simple, self-own ddns service, with only one assumption – a public ip over WAN port of your router.
原始状态:
光猫 <—> R7000主路由 <—> 需要出门的母鸡+小鸡们
设计思路:
- 办法1:破解光猫,将光猫与R7000桥接。
- 优势:内网只有一层,简洁明了。
- 劣势:打N通电话,下N多工具,还要将独立IPTV信道映射或proxy到R7000的某个LAN口。
- 办法2:硬件不做任何变动,添加两层映射。
- 优势:实施安全性高。
- 劣势:理论上,走ddns经双层转发,传输性能受影响。
- 总结:人老色衰,首选安全方案。
网络拓扑:
【更新】代码已推至github,欢迎加星。
第一步:确定你拥有的是公网IP
- 如果最接近外网的是光猫,那么登录光猫看WAN IP #1。
- 如果最接近外网的是路由器,用路由器PPPoE拨号,那么拨通后看路由器WAN IP #1。
- 用内网任何一台计算机访问http://httpbin.org/ip,拿到PUBLIC IP #2。
- 如果#1和#2两个IP一致,恭喜,进入下一关。【注】重启光猫/路由器WAN IP会变化,是OK的;唯一要求是#1和#2永远保持一致。
- 二者不一致的话,说明没有公网IP,无法继续进行。此时一种方案是,电话运营商客服,要求给自己账户提供公网IP,一般如果是联通/电信大运营商是很有可能给的,这个可以自行百度攻略,至于其他地方性小运营商就看水平了;另外一种方案就超出本文范畴,除了域名之外,从阿里云额外买一台公网云,选择“入门级 – 突发性能实例”,配置尽可能低,比如单核512M,只要能跑起最小化部署的ubuntu或者centos即可,一年用不上200大洋,带公网IPv4地址,不购买固定带宽而是选择“按使用流量”,然后使用FRP/NPS来构建内网穿透,也是可以稳定实现等效于DDNS的功能。此处不再赘述,感兴趣的话,有空再写。
第二步:将光猫与R7000间的映射打通
- 先找到R7000在光猫上的LAN口IP,建议R7000使用固定IP。
- 然后把两侧端口一对一映射起来,端口号建议两两一致(因为之后再设定第二层转发时不容易忘),也可完全不对应,看自己需求。
第三步:将R7000与内网计算机之间的映射打通
- (操作原理和方法同上)
- 内网2层的IP及端口号,对应内网计算机服务地址和端口号。
第四步:先不谈域名,看公网IP双层转发能否正常工作。
- 浏览器(或其他服务客户端)验证公网IP+公网端口号,浏览器顺利访问到PVE母鸡。
第五步:使用阿里云API实现DDNS。【注】听说dnspod也可以。
- 前提:在阿里云(万网)买了域名,尽可能做过备案。不过不备案应该也ok,因为个人网络得到的公网IP,理应不可能从80端口提供服务。
- 在阿里云的解析页面,先手动设置公网IP,等10分钟,用域名+公网端口号,验证域名生效;剩下的就是实现自动更新。
- 根据阿里云文档,编写IP自动更新脚本思路(不想自行开发的,可以github撸现成)。
- 先去阿里云账户申请key和secret,作为API调用的身份凭据。【注】阿里云现在建议使用RAM账户,可以只给域名操作权限,不给ECS、RDS等其他产品操作权限,万一泄露,损失可控。
- 使用curl或者python requests去 http://httpbin.org/ip 拿到新的公网IP #1。
- 根据阿里云文档获取解析记录列表,传入一级域名,拿到所有二级域名(RR)的解析记录。遍历之,找到我们需要的RR,所对应的IP #2。
- 判断#1和#2是否一致,一致则退出。不一致,根据阿里云文档修改解析记录,对相应RR进行修改,传入RR和新IP #1,将原来的IP替换掉,对API返回结果进行确认,完成退出。【注】实在不放心可以再一次获取解析列表,确认替换成功。
- 等待大概6~10分钟,用浏览器确认新IP是否生效。【注】测试时想要新的公网IP,可以通过重启光猫来得到。
- 给requests和aliyunsdk加上try-except容错机制,比如timeout等。
- 给脚本添加适当的log机制。
- 将脚本注册到内网计算机的crontab上,频率建议10分钟一次。
- 再次重启光猫验证,同时可与阿里云控制台解析日志对照。
第六步:enjoy your ddns,比如在外网靠域名播放内网file server存储的视频,访问私有云host/guest,远程备份电脑/手机等。
文章的脚注信息由WordPress的wp-posturl插件自动生成
暂无评论
引用