找回密码
 立即注册

QQ登录

只需一步,快速开始

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

利用OpenWrt的Hotplug与DNSPOD的API实现DDNS

[复制链接]
本帖最后由 liu_geng 于 2017-11-12 21:17 编辑

既然标题叫“利用OpenWrt的Hotplug与DNSPOD的API实现DDNS”,那么首先你得有一个openwrt的路由器,其次你需要有一个在dnspod.cn解析的域名,最后你家的宽带得要是公网IP。除此之外,既然你需要把域名解析到你家宽带的IP,那么你家里肯定有一台需要从外网访问的Server。

如果这些你都有,那就跟着我一起动手来折腾吧。

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的功能,我们可以在wan口的状态发生变化时执行一个自定义的脚本来更新我们的DDNS。

我们先来看一下DNSPOD关于DDNS的API文档:https://www.dnspod.cn/docs/records.html#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,可选

示例:curl -X POST https://dnsapi.cn/Record.Ddns -d 'login_token=LOGIN_TOKEN&format=json&domain_id=2317346&record_id=16894439&record_line_id=10%3D3&sub_domain=www'

其中LOGIN_TOKEN是DNSPOD新采用的一种鉴权方式,旧的 “用户名 + 密码” 的鉴权方式仍能继续使用,推荐开发者优先使用 login_token 来鉴权。
LOGIN_TOKEN生成方法详见:https://support.dnspod.cn/Kb/showarticle/tsid/227/

有了LOGIN_TOKEN,下一步我们还需要获取domain_id和record_id,这里我们需要用到curl指令,这个指令在windows里面需要安装第三方软件才能实现,不过既然你有openwrt的路由器,那么最简单的方法就是直接在openwrt的WebShell里面执行,不过这里需要注意的是由于你的openwrt里面可能没有安装证书,所以在使用curl指令的时候可以加上-k的参数来忽略证书的问题。

获取 domain_id
curl -k 'https://dnsapi.cn/Domain.List' -d 'login_token=<your_login_token>&format=json'
根据响应中的 domains 得到域名对应的 domain_id

获取 record_id
curl -k 'https://dnsapi.cn/Record.List' -d 'login_token=<your_login_token>&format=json&domain_id=<your_domain_id>'
根据响应中的 records 得到子域名记录对应的 record_id

有了这几样东西,我们就可以准备正式动手编写脚本了。
在编写脚本之前我们先在路由器的WebShell里面输入以下指令来测试一下解析记录是否能更新成功:
curl -s -k -X POST "https://dnsapi.cn/Record.Ddns" -d "login_token=<your_login_token>&format=json&domain_id=<your_domain_id>&record_id=<your_record_id>&record_line=%e9%bb%98%e8%ae%a4&sub_domain=<your_sub_domain>"
如果网站返回内容有"message":"Action completed successful"的字段,那么恭喜你,成功了。

现在,我们新建一个名叫99-dnspod的文件,文件格式一定要使用UTF-8,输入以下内容保存:

  1. #!/bin/sh

  2. # wan ifup

  3. [ "$ACTION" = ifup ] || exit 0

  4. [ "$INTERFACE" = "wan" ] || exit 0

  5. curl -s -k -X POST "https://dnsapi.cn/Record.Ddns" -d "login_token=<your_login_token>&format=json&domain_id=<your_domain_id>&record_id=<your_record_id>&record_line=%e9%bb%98%e8%ae%a4&sub_domain=<your_sub_domain>"
复制代码


然后用WinSCP登录你的路由器,将99-dnspod这个文件上传到/etc/hotplug.d/iface/目录,修改权限0755,完工。

当然,你也可以把curl指令换成wget,指令如下:
wget --post-data="login_token=<your_login_token>&format=json&domain_id=<your_domain_id>&record_id=<your_record_id>&record_line=%e9%bb%98%e8%ae%a4&sub_domain=<your_sub_domain>"  https://dnsapi.cn/Record.Ddns --no-check-certificate --output-document=/dev/null

你也可以使用https://dnsapi.cn/Record.Modify这个接口来实现更多功能。这个接口需要人工发送解析记录的IP地址,获取wan口IP地址的指令我搜集了一下,可以用以下几种方式:
wanip=$(ifconfig pppoe-wan | awk '/inet addr/{print substr($2,6)}')
wanip=$(ifconfig pppoe-wan | grep inet | awk '{print $2}' | cut -c 6-)

【2017年11月12日更新】
今天发现DDNS已经可以使用自定义脚本来更新了,所以我们只需要将上面指令的最后一行保存为一个脚本文件,然后在DDNS里面调用这个自定义脚本就可以实现。
原生的DDNS除了每隔一段时间检查一次域名解析之外,同样还在/etc/hotplug.d/iface/里面加入了一个95-ddns文件在WAN口的IP发生变化时调用更新程序。

1、将这一行代码保存为dnspod.sh,保存之前根据自己的域名信息替换掉<>中的内容。
curl -s -k -X POST "https://dnsapi.cn/Record.Ddns" -d "login_token=<your_login_token>&format=json&domain_id=<your_domain_id>&record_id=<your_record_id>&record_line=%e9%bb%98%e8%ae%a4&sub_domain=<your_sub_domain>"

2、上传到任意目录,修改权限:


3、在路由器的DDNS设置页面里添加一个配置,只需要填入Lookup Hostname和自定义更新脚本,其它都不用填,然后点保存并应用:


完成之后,你应该能在“状态”-“概览”的页面里看到动态DNS的注册状态。

本帖子中包含更多资源

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

×

评分

参与人数 2恩山币 +2 收起 理由
ro*** + 1 率全体恩山路由党以及党魁向你学习!
Ma*** + 1 我对你的敬仰犹如江水滔滔,我上朝鲜战场后一定写信给你!!!

查看全部评分

简单粗暴的才会火的,这样的感觉需要的人不是很多
回复

使用道具 举报

受用了,谢谢~
回复

使用道具 举报

用了无效,怎么解决?
回复

使用道具 举报

请教楼主,缺少Curl命令,K2P的LEDE如何安装呀?
回复

使用道具 举报

来自手机 | 显示全部楼层
tonli2008 发表于 2018-2-11 14:10
请教楼主,缺少Curl命令,K2P的LEDE如何安装呀?

opkg update
opkg install curl
回复

使用道具 举报

本帖最后由 tonli2008 于 2018-2-11 23:46 编辑
lm317379829 发表于 2018-2-11 15:49
opkg update
opkg install curl

谢谢,但是装好了,DDNS还是提示错误
dnspod.sh: line 1: curl: not found


回复

使用道具 举报

tonli2008 发表于 2018-2-11 23:45
谢谢,但是装好了,DDNS还是提示错误
dnspod.sh: line 1: curl: not found

可能是脚本问题,检查下脚本。
回复

使用道具 举报

mark backup TKS
回复

使用道具 举报

需要的人不是很多
回复

使用道具 举报

我想采用你2017年11月12日更新的方式来做。我是用wget代替了curl,因为openwrt里面基本都带有wget。
脚本在命令行运行正常,可以更新IP,但在ddns script里面却出错,不能更新。
提示:135838 ERROR : IP update not accepted by DDNS Provider。
什么问题呢?如何解决?谢谢!
回复

使用道具 举报

为什么我按照步奏,没办法获得ID呢?能不能告诉我该怎么做呀。
root@OpenWrt:~# curl -k 'https://dnsapi.cn/Domain.List' -d 'login_token=C8C4405961CFEE3B0A412AAE35787108&format=json'
{"status":{"code":"10001","message":"The login token ID is invalid","created_at":"2019-06-21 22:38:33"}}root@OpenWrt:~# curl -k 'https://dnsapi.cn/Record.List' -d 'login_token=<your_login_tokeroot@OpenWrt:~# curl -k 'https://dnsapi.cn/Record.List' -d 'login_token=C8C4405961CFEE3B0A412AAE35787108&format=json&domain_id=10001'
root@OpenWrt:~# curl -k 'https://dnsapi.cn/Record.List' -d 'login_token=C8C4405961CFEE3B0A412AAE35787108&format=json&domain_id=10001'
{"status":{"code":"10001","message":"The login token ID is invalid","created_at":"2019-06-21 22:41:30"}}
回复

使用道具 举报

按教程一步步操作下来,非常好用,可是DNSPod里系统默认添加的两条NS类型记录少了一条,不知有影响吗?
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-5-14 11:00

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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