RouterOS利用DNSPOD的API接口实现DDNS动态解析

本文主要讲解如何借助DNSPOD的API接口来实现RouterOS的DDNS动态解析。


一、创建Token添加域名

首先域名要在DNSPOD解析,然后在DNSPOD后台开启的API Token。

详细开通API Token教程:https://support.dnspod.cn/Kb/showarticle/tsid/227/


二、PHP制作DNSPOD API动态解析接口

以下是我制作好的php解析接口

接口地址:


查询接口


链接自动生成接口


HTTP请求方式:

  • POST/GET


请求参数:

  • token    (必选)  DNSPod Token,格式 "ID,Token",如“12345,3a13a4331549*******127c185368303”
  • domain (必选)  域名(如:myxzy.com)
  • record  (必选)  记录名(如:www)
  • record_id  (必选)  记录名id, 和record二选一
  • ip         (可选,默认值为请求来源IPv4)  DDNS的IP地址(或者CNAME、MX记录值)
  • line      (可选,默认值为默认)  线路设置,详细参数请看注1
  • type     (可选,默认值为A记录  支持AAAA、CNAME、MX记录
  • format    (可选,默认值为xml  xml和json,返回的数据格式


注意:

2019-9-16

已更换服务器,没有解析次数限制,希望这次不会经常把服务器玩挂。

2019-8-5

现在一天的解析量很大,一天解析次数已经超过100万了,1次解析2~3次curl,而curl又很占资源,为了其他资源正常,我设置了监控脚本,所以会导致该解析动不动就关站。为了保证大家的正常使用,所以我这边对解析接口1加了限制,限制为1分钟内最多5次,超过了就禁用60分钟,第6次解析不生效。如果需要高解析量的,那么请使用解析接口2,其实本人还是希望有这种高解析量的自建php服务器。


注1:

line参数说明:如&line=cmcc,那么线路就是移动线路,请按照下面的对照表来。

default  =>  默认
ctc  =>  电信
cucc  =>  联通
cernet  =>  教育网
cmcc  =>  移动
ctt  =>  铁通
home  =>  国内
abord  =>  国外
search  =>  搜索引擎
baidu  =>  百度
google  =>  谷歌
youdao  =>  有道
bing  =>  必应
soso  =>  搜搜
sogou  =>  搜狗
qihu  =>  奇虎


示例:

curl -X POST http://u.myxzy.com/dnspod -d 'token=id,token&domain=myxzy.com&record=www&ip=1.1.1.1&line=ctc&record_type=A&format=json'
返回参考:
{
    "code": "1",
    "message": "Record created success, ip updated",
    "time": "2019-03-08 09:28:34",
    "info": "dnspod-api-php V1.4 By Star.Yu"
}
字段说明:

code:状态id编号,1是成功,0是失败,其他的数字请参考DNSPOD的API ID对应的报错

message:本php接口输出的信息

time:访问时间

info:本php接口的版本信息等


安全说明:

1、本接口未记录所有的解析token和解析记录,但是服务器的访问日志会有链接记录(按照政策要求需保存6个月的日志虽然有日志但是本接口不提供任何查询。

2、建议使用独立的DNSPOD账号来使用本接口,重要的域名请自建PHP服务器用来解析。由于使用本接口出现的任何安全问题,本人概不负责。这边只能保证本人不会去做任何后门行为。这边建议如果使用了本接口请勤换token

PS:因为有了token可以管理账号下的所有域名。


dnspod-api-php Github地址:https://github.com/myxzy/dnspod-api-php/


ROS脚本:

#PPPoE
:local pppoe "pppoe-out1"

#DDNS Token
:local token "id,token"

#DDNS域名
:local record "www"
:local domain "myxzy.com"

#以下不需要修改
:global ipold
:local ipnew [/ip address get [/ip address find interface=$pppoe] address]
:set ipnew [:pick $ipnew 0 ([len $ipnew] -3)]
:if ($ipnew != $ipold) do={
:local url "http://u.myxzy.com/dnspod/\?token=$token&ip=$ipnew&domain=$domain&record=$record"
/tool fetch url=$url mode=http keep-result=no
:set ipold $ipnew
log info "DDNS: Sending UPDATE!"
}

以上脚本需要修改pppoe(宽带拨号的名称),token,record和domain

注:ROS可以设置定时1分钟执行一次脚本,脚本中带有ip是否相同判断,相同就不执行;然后是我做的API接口后台中也有ip是否相同的判断,所以不会引起DNSPOD锁域名的情况。


更新说明:

by 2019-9-25

1.8服务器版本

1、为了降低负载使用memcached进行缓存降低压力而开发的(不适合个人使用,所以不更新到github)

2、增加list.php页面用于token查询A和AAAA记录

3、测试功能加入record_id支持,使用list.php查询。


by 2019-6-16

bug修复:

1、修复脚本不更新ip的问题


by 2019-4-7

1.7版本

1、支持cname和mx记录添加和修改

2、A和AAAA记录会判断IP值是否正确


by 2019-4-3

1.6版本

1、优化部分Bug

2、不添加参数自动跳转到demo页面


by 2019-3-18

1.5版本

1、支持POST和GET提交


by 2019-3-8

1.4版本

1、重写返回数据格式,因为我要对接项目,所以返回格式可以是xml或json

2、重写更新ipv4和修改ipv6

3、ip地址可以根据来源自动更新。

4、自动添加解析记录,不存在就自动添加解析记录


by 2018-12-19

1.3版本

1、去除服务器获取域名DNS解析地址去判断是否相同(不影响和DNSPOD后台记录是否相同的判断)

2、因为突然发现可以通过访问日志查看解析的API ID和Token,有不安全的可能的,所以提供代码,建议自建PHP服务器保证域名解析安全

3、如果不怕安全问题,这边还会继续提供解析服务,不过会修改本API的服务器地址,老版本接口保证持续1个月


by 2018-10-18

1.1版本

1、增加ipv6支持,在连接后面加上&type=AAAA为IPv6(不加默认是A解析)

2、把更新DNS记录接口修改为修改DNS接口(更新DNS接口不支持IPv6)

3、IPv6不增加从服务器获取IPv6进行判断


1.0版本

1、增加按照线路更新ip地址

2、对服务器获取域名IP判断DNS记录添加开关 &chk=1

3、优化本接口报错信息提示


0.1beta版本

1、基本实现DNS域名动态解析

2、可以判断IP是否相同,防止DNSPOD相同修改记录超过5次被锁域名1小时

  • 下载列表

目前有 65 条评论

avatar

游客2067010392  2019-11-11 12:42 21楼

最近更新不过来,记录的TTL值超出了限制(600)  。。不知道要怎么解决呢 回复
avatar

星之宇  2019-11-11 12:53

@游客2067010392:可能你的域名被限制了,TTL至少是600,看现在是不是能免费开通故障切换,开启后就是ttl是10秒 回复
avatar

lyalove  2019-10-16 13:05 20楼

大神,能不能做一个在ROS利用AliDNS的API接口实现DDNS动态解析啊? 回复
avatar

星之宇  2019-10-16 13:07

@lyalove:有啊。http://www.myxzy.com/alidns-api-php.html 但是由于一些问题没有开源。 回复
avatar

游客3658577230  2019-09-23 15:52 19楼

老大 求一份源码,github没找到 回复
avatar

星之宇  2019-09-23 15:54

@游客3658577230:不是写了github网址吗?https://github.com/myxzy/dnspod-api-php/ 回复
avatar

游客2032152589  2019-08-13 12:50 18楼

ros的定时任务执行脚本无效。但是单独执行脚本可以更新ip。这是为什么? 回复
avatar

星之宇  2019-08-13 13:52

@游客2032152589:ros可以定时执行脚本。
:execute script="DNSPOD" 回复
avatar

游客2869914781  2019-08-07 16:41 17楼

服务器挂了。无法解析了! 回复
avatar

星之宇  2019-08-07 19:31

@游客2869914781:超压了,最近再改进脚本,不然服务器压力实在撑不住。下午3点多解析量就80万+ 回复
avatar

游客1857619360  2019-08-06 10:04 16楼

我想自己也部署一个,求分享源码,感谢。 回复
avatar

星之宇  2019-08-06 10:06

@游客1857619360:github放了源码的。 回复
avatar

游客2047262562  2019-06-16 14:14 15楼

你好,请问ros的脚本不支持虚拟机板的CHR的ros吗?我放脚本上去,id和token,拨号的名字都对,但是不更新IP。 回复
avatar

游客1700283755  2019-06-12 18:30 14楼

大神,最近这个脚步貌似不工作了,不知道是什么原因。能否指点一下?感谢! 回复
avatar

星之宇  2019-06-12 20:26

@游客1700283755:重新手写输入一遍,我也发现这个问题了,应该是复制粘贴的时候有问题。可以先保存txt记录本,然后再从记事本复制到ROS脚本 回复
avatar

西城良品  2019-04-02 17:47 13楼

能否将这个网页版的dnspod动态域名解析系统改成token验证的方式?谢谢了 https://github.com/xuexiaokang/phpwebddns-for-dnspod/blob/master/ddns.php 回复
avatar

星之宇  2019-04-03 16:11

@西城良品:本地服务器加密几乎没必要,要安全自己建服务器,和服务器之间的连接改为https 回复
avatar

西城良品  2019-04-03 17:24

@星之宇:现在的源码是账号密码的方式,博主能帮忙做下修改,弄成token验证的方式吗 回复
avatar

星之宇  2019-04-03 17:26

@西城良品:用我的就可以了,直接下载我的就可以了,直接网址访问也可以更新的,不一定要ROS才可以的。 回复
avatar

西城良品  2019-04-03 17:28

@星之宇:主要是博主的没有在线生成一段比较方便的链接添加到计划任务中,这个web在线版是方便经常需要添加不同账户和域名做动态解析,每次都能快速生成一段链接,添加到计划任务中,确实方便了经常有不同动态域名需求的人使用 回复
avatar

星之宇  2019-04-03 17:31

@西城良品:计划任务可以通过赋值的方法来做,也几乎可以实现 回复
avatar

西城良品  2019-04-03 17:36

@星之宇:博主帮忙修改下这个源码吧,真的很方便,感谢感谢 回复
avatar

星之宇  2019-04-03 17:37

@西城良品:你要自动生成吧,那我把我自己的改一下,应该能满足你要求。 回复
avatar

西城良品  2019-04-03 17:38

@星之宇:嗯,是的,要自动生成,这样就能方便直接复制粘贴到计划任务中了,谢谢谢谢 回复
avatar

星之宇  2019-04-03 20:36

@西城良品:你现在看看是不是你这个效果,直接打开我的api链接,不加参数就可以打开自动生成页面了。 回复
avatar

西城良品  2019-04-03 21:58

@星之宇:非常感谢,就是这样的效果,应该只要“生成本站API解析链接(不带IP)”这一个功能就够了,前面几项好像意义不大,毕竟动态域名,IP肯定是不断的变动的 回复
avatar

西城良品  2019-04-03 22:04

@西城良品:这个源码有下载吗? 回复
avatar

星之宇  2019-04-03 22:05

@西城良品:直接查看源码就可以了,这个东西php只有输出了一个获取ip的,你也用不到。 回复
avatar

西城良品  2019-04-03 22:09

@星之宇:我看到http://www.dh.vg/tools/ddns.php是直接就输出:更新IP成功,这个是怎么弄的? 回复
avatar

星之宇  2019-04-03 22:12

@西城良品:php网页支持使用echo就可以了。我这个为了稍微标准化点,对接我的另一个东西才做的。无非就是我把输出的提示改下就可以了。你如果要做,直接下载我github中的php自己去改。 回复
avatar

西城良品  2019-04-03 22:13

@星之宇:好的,谢谢,我下载来看看 回复
avatar

西城良品  2019-04-06 11:30

@西城良品:使用中发现就算是本地服务器,加密还是有必要的,不加密的话,有些场合会暴露自己的Token,还有更新的域名信息完全给别人看,别人拿了token就可以往自己的域名里随意添了,像我都是用在openwrt路由器中,在计划任务中可以轻易看到token,博主能否修改下,将这些字段加密 回复
avatar

星之宇  2019-04-06 11:36

@西城良品:开源代码,可逆加密没必要,所以我这边不弄。你可以内网自建PHP服务器,这个相对于PHP更安全,甚至不用传输token的。 回复
avatar

游客659324475  2019-03-09 00:44 12楼

谢谢您的文章,请问可以发一份源码给我么 谢谢 回复
avatar

星之宇  2019-03-09 00:45

@游客659324475:Github自己下 回复
avatar

游客659324475  2019-03-09 01:35

@星之宇:已经下载 测试ok 感谢您的分享 回复
avatar

游客1879255019  2019-03-01 18:26 11楼

可以发一份服务器部署的源码吗 回复
avatar

星之宇  2019-03-01 19:16

@游客1879255019:已经上传github了,可以自己去找 回复
avatar

游客2099790817  2018-12-07 17:27 10楼

谢谢楼主分享  能否分享下您的源码呢   我想用易语言写个  但是不会用易语言代替curl  谢谢老师 回复
avatar

星之宇  2018-12-07 18:50

@游客2099790817:发你邮箱 回复
avatar

游客2099790817  2018-12-07 18:51

@星之宇:谢谢老师  已经收到 回复
avatar

游客2099790817  2018-12-07 22:01

@游客2099790817:老师  如果解析名称为空 也就是比如@abc.com  那么这里的@怎么填写呢   &sub_domain=(域名解析名)  如果域名解析名写@   提示失败 回复
avatar

星之宇  2018-12-08 05:09

@游客2099790817:@.abc.com就可以了 回复
avatar

游客2100221755  2018-12-08 10:13

@星之宇:老师是这样的比如解析abc.com(非www.abc.com)到A记录1.1.1.1.1  按照您的格式写
&domain=abc.com&sub_domain=&line=default&chk=1&type=A的话  那么  &sub_domain=后面应该写什么  如果留空  则提示失败 解析名不能为空  应该如何写呢   谢谢老师 回复
avatar

星之宇  2018-12-08 11:12

@游客2100221755:&sub_domain=@这么写 回复
avatar

游客2100221755  2018-12-08 11:23

@星之宇:老师如果写@  则如下提示
Error 未知,id::DNS记录更新失败 回复
avatar

星之宇  2018-12-08 11:35

@游客2100221755:我已经测试是可以的,查看dnspod后台有没有添加这个解析。 回复
avatar

游客1960160246  2018-12-05 12:28 9楼

正好在测试,一直不成功,可否分享下源码?非常感谢!! 回复
avatar

星之宇  2018-12-06 11:58

@游客1960160246:已发邮箱 回复
avatar

游客1960160246  2018-12-06 15:23

@星之宇:已收到,谢谢!! 回复
avatar

游客1960160246  2018-12-05 12:12 8楼

可否分享一下源码?正需要,太及时了,非常谢谢!谢谢 回复
avatar

游客828151719  2018-12-02 20:32 7楼

我想自己也部署一个,求分享源码,感谢。 回复 回复
avatar

星之宇  2018-12-02 20:46

@游客828151719:已发你邮箱。 回复
avatar

游客1019090878  2018-11-28 08:40 6楼

我想自己也部署一个,求分享源码,感谢 回复
avatar

星之宇  2018-11-28 08:42

@游客1019090878:已发邮箱 回复
avatar

游客3730754938  2018-11-27 15:16 5楼

我想自己也部署一个,求分享源码,感谢。 回复
avatar

星之宇  2018-11-27 15:34

@游客3730754938:已发你邮箱 回复
avatar

游客1927091787  2018-11-16 21:47 4楼

想自己内网部署份,求分享源码,感谢。 回复
avatar

星之宇  2018-11-17 06:32

@游客1927091787:已发你邮箱 回复
avatar

游客3733053474  2018-11-15 14:09 3楼

非常感谢楼主的分享,因单位内所有的域名都使用的是dnspod,在网上查了好多文章都不行,谢谢了!方便提供一下源代码吗?十分感谢! 回复
avatar

星之宇  2018-11-15 14:23

@游客3733053474:已发你邮箱。 回复
avatar

游客829508880  2018-10-27 22:08 2楼

谢谢您的分享,请问有没有阿里云DDNS的动态解析方案?阿里云DDNS动态解析脚本嘛? 回复
avatar

星之宇  2018-10-27 22:09

@游客829508880:没有。我的域名都是dnspod解析的。 回复
昵称
邮箱
主页
提交
订阅