本文主要讲解如何借助DNSPOD的API接口来实现RouterOS的DDNS动态解析。
一、创建Token添加域名
首先域名要在DNSPOD解析,然后在DNSPOD后台开启的API Token。
详细开通API Token教程:https://support.dnspod.cn/Kb/showarticle/tsid/227/
二、PHP制作DNSPOD API动态解析接口
以下是我制作好的php解析接口,支持SSL
解析接口地址:
查询接口:
链接自动生成接口:
HTTP请求方式:
- POST/GET
请求参数:
- token(必选)DNSPod Token,格式 "ID,Token",如“12345,3a13a4331549*******127c185368303”
- domain(必选)域名(如:77bx.com)
- record(必选)记录名(如:www)
- record_id(必选)记录名id, 和record二选一
- ip(可选,默认值为请求来源IPv4)DDNS的IP地址(或者CNAME、MX记录值)
- line(可选,默认值为默认)线路设置,详细参数请看注1
- type(可选,默认值为A记录)支持AAAA、CNAME、MX记录
- format(可选,默认值为xml)xml和json,返回的数据格式
注1:
line参数说明:如&line=cmcc,那么线路就是移动线路,请按照下面的对照表来。
default => 默认
ctc => 电信
cucc => 联通
cernet => 教育网
cmcc => 移动
ctt => 铁通
home => 国内
abord => 国外
search => 搜索引擎
baidu => 百度
google => 谷歌
youdao => 有道
bing => 必应
soso => 搜搜
sogou => 搜狗
qihu => 奇虎
示例:
curl -X POST http://api.77bx.com/dnspod -d 'token=id,token&domain=77bx.com&record=www&ip=1.1.1.1&line=ctc&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/77bx/dnspod-api-php
dnspod-api-php Gitee:https://gitee.com/staryu/dnspod-api-php
2024-05-21
修复接口更新IP的时候,直接改变记录名的问题。(不知道官网接口搞什么突然不传sub_domain会默认为@)
ROS脚本:
#PPPoE :local pppoe "pppoe-out1" #DDNS Token :local token "id,token" #DDNS域名 :local record "www" :local domain "77bx.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://api.77bx.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锁域名的情况。
目前有 7 条评论
Collin 2021-12-06 23:183楼
大神您好,您有一篇alidns的文章(https://www.myxzy.com/alidns-api-php.html#9210),没能成功留言提示“网页报错”,这边借助这个平台问您一下: 1、SSH登录ROS,使用大神的接口可以正常执行如下命令:tool fetch url=\"http://u.myxzy.com/alidns/\\?id=***&secret=***&domain=test.com&record=ddns&ip=1.1.1.1\" as-value output=user (另外使用浏览器访问相关url也正常返回0并修改dns) 2、这边用接口php自建了一个站,发现浏览器url带参数访问没问题,地址如:http://u.test.com/alidns/?id=***&secret=***&domain=test.com&record=ddns&ip=1.1.1.2。每次都能正常返回0和正常修改dns。 3、SSH登录ROS命令执行我自建的站点相关命令有问题,命令如下:tool fetch url=\"http://u.test.com/alidns/\\?id=***&secret=***&domain=test.com&record=ddns&ip=2.1.1.1\" as-value output=user 4、上面“3”执行的命令,是直接在大神实际可测可用的命令中修改自己的站点。不知道是什么原因,期待大神回复。评论
星之宇 2021-12-07 17:03
PHP环境也有要求的,可能你自己的环境没有满足要求吧。回复
Collin 2021-12-11 16:00
上面提到我这边自建的php站点,浏览器带参数没问题,且能正常修改dns,但ROS脚本执行不行。这边调试发现data返回的值不是0(您的php站点返回的是0),而是一串html字符,其中有JavaScript提示。不知道是否是字符集问题,还是其他问题? 结果返回如下: data=<html><body><script type=\"text/javascript\" src=\"/aes.js\" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e=\"\",f=0;f<d.length;f++)e+=(16>d[f]?\"0\":\"\")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers(\"f655ba9d09a112d4968c63579db590b4\"),b=toNumbers(\"98344c2eee86c3994890592585b49f80\"),c=toNumbers(\"0fe86f7acf5f31f4303b1022b85efe40\");document.cookie=\"__test=\"+toHex(slowAES.decrypt(c,2,a,b))+\"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/\"; location.href=\"http://u.test.com/alidns/?id=***&secret=***&domain=test.com&record=ddns&ip=1.1.1.8&i=1\";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>;downloaded=0;status=finished回复
星之宇 2021-12-11 17:56
可能是免费的网站导致会自动增加javascript脚本所以不行。回复
淡定 2021-11-30 23:252楼
可用,就是延迟比较大1秒左右评论
joseph 2021-11-02 15:071楼
请教大佬,如果ROS作为网络内部主机并没有公网IP,要怎么做才能通过比如用curl -s \"https://api.myip.la/\"获取自己的公网IP,然后更新阿里云?评论
星之宇 2021-11-05 15:57
用我的脚本,你不带IP地址会自动解析你来源的IP地址的。回复