找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 6497|回复: 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 我对你的敬仰犹如江水滔滔,我上朝鲜战场后一定写信给你!!!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
简单粗暴的才会火的,这样的感觉需要的人不是很多
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

受用了,谢谢~
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

用了无效,怎么解决?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

点评

opkg update opkg install curl  详情 回复 发表于 2018-2-11 15:49
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

opkg update
opkg install curl

点评

谢谢,但是装好了,DDNS还是提示错误  详情 回复 发表于 2018-2-11 23:45
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

本帖最后由 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


点评

可能是脚本问题,检查下脚本。  详情 回复 发表于 2018-2-12 09:35
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

可能是脚本问题,检查下脚本。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

mark backup TKS
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

需要的人不是很多
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

使用道具 举报

为什么我按照步奏,没办法获得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"}}
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

按教程一步步操作下来,非常好用,可是DNSPod里系统默认添加的两条NS类型记录少了一条,不知有影响吗?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-29 19:10

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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