找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 7414|回复: 12

【转贴】OpenWrt Hotplug脚本 + Dnspod api 实现ms级延迟的DDNS记录更新

[复制链接]
本帖最后由 lonb427 于 2017-12-9 10:11 编辑


一般的话,实现DDNS就是直接使用openwrt的DDNS插件,如下图

这里介绍一个更简便快速的方法
OpenWrt中的Hotplug脚本
Hotplug,直译就是热插拔。在OpenWrt中,无论何时一个设备从系统中增删,都产生一个“热插拔事件”。
每次网络接口启动(up)或者关闭(down)的时候,所有在/etc/hotplug.d/iface/目录中的脚本都会以字母顺序执行。根据一个不成文的规则,会在每个脚本的前面加上一个数字前缀来设置正确的运行顺序。这就是为什么脚本名称都像:/etc/hotplug.d/iface/<nn>-<scriptname>的原因。
在iface hotplug脚本中有三个主要的环境变量:
变量名称
描述
ACTION
"ifup" 或者 "ifdown"
INTERFACE
网络接口的名称,如"wan"
DEVICE
物理设备的名称,如"br-lan"
利用hotplug脚本可以在网络接口启动或关闭时执行相应的动作

Dnspod api
更新动态DNS记录
接口地址:HTTP请求方式:
  • POST
请求参数:
  • 公共参数
  • domain_id 或 domain, 分别对应域名ID和域名, 提交其中一个即可
  • record_id 记录ID,必选
  • sub_domain 主机记录,如 www
  • record_line 记录线路,通过API记录线路获得,中文,比如:默认,必选
  • record_line_id 线路的ID,通过API记录线路获得,英文字符串,比如:‘10=1’ 【record_line 和 record_line_id 二者传其一即可,系统优先取 record_line_id】
  • value IP地址,例如:6.6.6.6,可选
响应代码:……注意事项:
  • 如果1小时之内,提交了超过5次没有任何变动的记录修改请求,该记录会被系统锁定1小时,不允许再次修改,所以在开发和测试的过程中,请自行处理IP变动,仅在本地IP发生变动的情况下才调用本接口。
  • 如何理解没有任何变动的记录修改请求?比如原记录值已经是 1.1.1.1,新的请求还要求修改为 1.1.1.1。

如此,利用上两项就可以实现ms级延迟的DDNS记录更新

在/etc/hotplug.d/iface下新建30-dnspod.sh,内容如下
  1. #!/bin/sh
  2. # wan ifup
  3. [ $ACTION = "ifup" -a $INTERFACE = "wan" ]
  4. wget --post-data="login_email=USER@MAIL.COM&login_password=YOUR_PASSWORD&format=json&domain_id=12345678&record_id=987654321&record_line=默认&sub_domain=what"  https://dnsapi.cn/Record.Ddns --no-check-certificate --output-document=/dev/null
复制代码


domain_id和record_id可以使用官方的客户端或使用域名api获取.dnspod ddns api可以不带ip数据,他会获取你的访问ip,正确设置好参数和post数据后,每次wan口打开就会执行脚本下的语句,实现A记录更新。


下面是在webshell中执行返回的结果,因为wegt不能验证dnspod的证书,所以要加上--no-check-certificate参数。




转贴者注:
可以使用login_token代替login_email和login_password,使用token鉴权更安全

能再给个阿里的吗??

求打包好 DNSPOD和阿里DDNS
回复

使用道具 举报

回复

使用道具 举报

单独的命令可以成功更新.
我运行脚本无法更新什么原因?
反馈输出对比
成功
Length: 160 [text/html]
Saving to: '/dev/null'

/dev/null           100%[===================>]     160  --.-KB/s    in 0s

2016-11-25 11:12:50 (6.02 MB/s) - '/dev/null' saved [160/160]

失败
Length: unspecified [text/html]
Saving to: '/dev/null\r'

              [ <=>                ]      91  --.-KB/s    in 0s

2016-11-25 11:05:30 (1.66 MB/s) - '/dev/null\r' saved [91]
回复

使用道具 举报

 楼主| | 显示全部楼层
本帖最后由 lonb427 于 2016-11-25 18:39 编辑
▓尐〖孩孒】 发表于 2016-11-25 11:15
单独的命令可以成功更新.
我运行脚本无法更新什么原因?
反馈输出对比

试试用login_token代替login_email和login_password,我是用token更新的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

来自手机 | 显示全部楼层
Mark.........
回复

使用道具 举报

lonb427 发表于 2016-11-25 18:36
试试用login_token代替login_email和login_password,我是用token更新的

一样的,我token跟Email都试过,放在脚本里都不行,用命令都OK
回复

使用道具 举报

lonb427 发表于 2016-11-25 18:36
试试用login_token代替login_email和login_password,我是用token更新的

你试试 sh /etc/hotplug.d/iface/97-dnspod
返回什么值,贴出来我看看,还有你是什么机器啥固件?
回复

使用道具 举报

 楼主| | 显示全部楼层
▓尐〖孩孒】 发表于 2016-11-27 10:00
你试试 sh /etc/hotplug.d/iface/97-dnspod
返回什么值,贴出来我看看,还有你是什么机器啥固件?

文件里还有判断条件的,只有wan启动的时候才会执行命令,你直接执行命令能更新就行了
回复

使用道具 举报

lonb427 发表于 2016-12-9 18:40
文件里还有判断条件的,只有wan启动的时候才会执行命令,你直接执行命令能更新就行了

搞定了,去掉中文就OK了
回复

使用道具 举报

感谢分享,思考!
回复

使用道具 举报

这样并没有十分巧妙。反而隐含地把ip更新事件和wan口的状态变化绑定起来了。这意味着这样的绑定已经暗含了一个假设,那就是所有的路由器都是用的时候开,不用的时候关的。而实际情况是,大多数的路由器都是一旦打开,除非停电,一直运行。而无论是否一级路由,当ip发生变更时,wan口的状态也不会先down再up。把这两个时机关联在一起本身就很勉强,这只涵盖了ip变更场景中很小的一部分。这就是为什么许多ddns提供商的帮助文档和示例中都用crontab来运行ip更新的原因。虽然把检测频率提高可以降低ip更新的延迟,会略微增加一些系统负载,但整体来看,这样的开销非常非常小。而且相比于ip更新后整个dns系统那缓慢的刷新速度,这点延迟根本不能改变任何体验。当然,把ddns供应商的dns server设为首选dns服务器可以缓解这个问题,但一般情况下这不是个好主意,你最后还是会用114这样的server。
回复

使用道具 举报

为什么都喜欢用Dnspod 阿里云
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-12 12:55

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表