一般的话,实现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记录
接口地址:
https://dnsapi.cn/Record.Ddns
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
,内容如下
#!/bin/sh # wan ifup if [ $ACTION = "ifup" -a $INTERFACE = "wan" ] then wget -q -O - --post-data="login_token=36797,805e5d4cfecebe40eeafc7758590ace2&format=json&domain_id=60560160&record_id=317740618&record_line_id=0&sub_domain=home" https://dnsapi.cn/Record.Ddns --no-check-certificate > /dev/null fi
domain_id和record_id可以使用官方的客户端或使用域名api获取
dnspod ddns api可以不带ip数据,他会获取你的访问ip,如此正确设置好参数和post数据后,每次wan口打开就会执行脚本下的语句,实现A记录更新
openwrt下的wegt不能验证dnspod的证书,所以要加上--no-check-certificate
参数