本文主要讲解如何借助阿里云aliyun的云解析API接口来实现RouterOS(以下简称ROS)的DDNS动态解析。
一、创建访问控制RAM的AccessKey
我这边简单的讲讲如何申请开通:
1、阿里云网站 --> 产品 --> 安全 --> 应用身份服务,这个就是控制API ,用户管理,新建用户,填写用户名和勾上“为该用户自动生成AccessKey”,保存好这个accesskey。
2、策略管理 --> 自定义授权策略,新建授权策略,选择空白模版,授权策略名称随便填(如alidns),策略内容为下面的内容(修改下面内容中的域名为你自己要做DDNS的域名)
action是api的接口,只接受AddDomainRecord(增加域名解析),DescribeDomainRecords(输出域名解析列表)和UpdateDomainRecord(修改域名解析记录)
Resource是指被授权的具体对象,这边domain/77bx.com需要修改成你自己的域名domain/xxx.com。这样就是授权对象是该域名
{ "Version": "1", "Statement": [ { "Action": [ "alidns:AddDomainRecord", "alidns:DescribeDomainRecords", "alidns:UpdateDomainRecord" ], "Resource": "acs:alidns:*:*:domain/77bx.com", "Effect": "Allow" } ] }
3、用户管理,对上面创建的用户,点击授权,选择刚才自定义创建的策略,确定。
二、PHP制作aliyun API动态解析接口
以下是我制作好的php解析接口
接口地址:
HTTP请求方式:
- POST/GET
请求参数:
- id (必选) AccessKeyId
- secret (必选)AccessKeySecret
- record(必选)记录名(如:www)
- domain(必选)域名(如:77bx.com)
- ip (可选,默认值为请求来源IPv4)DDNS的IP地址
-
type (可选,默认值为A,可选值为AAAA) IPv6支持
示例:
curl -X POST http://api.77bx.com/alidns -d 'id=id&secret=secret&domain=77bx.com&record=www&ip=1.1.1.1'
返回参考:
“0”代表解析修改成功或者是当前解析记录ip相同
“1”代表AccessKey报错(这个阿里云我这边经常出现,刷新就可以正常)
“2”代表没有设置参数
安全说明:
1、本接口未记录所有的解析AccessKey和解析记录,但是服务器的访问日志会有链接记录(按照政策要求需保存6个月的日志)。虽然有日志但是本接口不提供任何查询。
2、强烈建议按照步骤一设置授权权限。
3、由于使用本接口出现的任何安全问题,本人概不负责。这边只能保证本人不会去做任何后门行为。这边建议勤换AccessKey
三、ROS脚本
id、secret、domain、record、pppoe修改成自己的。定时1分钟运行就好。
#aliyun Access Key :local id "AccessKeyId" :local secret "AccessKeySecret" #domain :local domain "77bx.com" :local record "www" #PPPoE-out :local pppoe "pppoe-out1" :local ipaddr [/ip address get [/ip address find interface=$pppoe] address] :set ipaddr [:pick $ipaddr 0 ([len $ipaddr] -3)] :global aliip :if ($ipaddr != $aliip) do={ :local result [/tool fetch url="http://api.77bx.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr" as-value output=user]; :if ($result->"status" = "finished") do={ :if ($result->"data" = "0") do={ :set aliip $ipaddr :log info "alidns update ok"; } else={ :log info "alidns update error"; } } }
脚本说明:获取pppoe拨号ip,然后判断和记录解析ip是否相同,不同开始访问我的php解析脚本,解析脚本就判断参数执行,返回0或1或2,如果是0更新记录的alidns解析ip,其他的不记录。
四、源码开源
alidns-api-php Github:https://github.com/77bx/alidns-api-php
alidns-api-php Gitee:https://gitee.com/staryu/alidns-api-php
目前有 36 条评论
狂风海天 2023-09-11 21:328楼
你这个只有IPV4的解析,IPV6的ROS脚本有吗?评论
星之宇 2023-09-11 21:37
其实是支持IPv6,type=AAAA是支持IPv6,但是IPv6的分配模式有点不同,毕竟客户端都会分配IPv6的地址,应该在客户端上做才对。当然一定要在路由器上做也是可以的,但是脚本要自己写。回复
狂风海天 2023-09-11 21:59
直接在ROS脚本里面修改好,让ipv4和ipv6同时在阿里云上解析,这样可以吗回复
星之宇 2023-09-13 18:37
可以是可以,但是你要获取到设备的IPv6地址要做拼接,比较麻烦不建议。回复
riadnahn 2023-06-17 13:217楼
:local result [/tool fetch url=\"http://1111.com/alidns/\\?id= 这句结尾不对,折腾了一晚上,要改成 /alidns.php?id= ,谢谢大佬 ,总之成功评论
星之宇 2023-06-17 13:31
这个稍微懂点的都知道,用我的接口就不存在折腾了。回复
好久不见 2022-12-26 09:516楼
这个是什么原因呢 我的网站支持PHP的 [0] App.php 第 535 行中的HttpException 模板不存在于:alidns $config = self::init($module); // 模块请求缓存检查 $request->cache( $config[\'request_cache\'], $config[\'request_cache_expire\'], $config[\'request_cache_except\'] ); } else { throw new HttpException(404, \'module not exists:\' . $module); } } else { // 单一模块部署 $module = \'\'; $request->module($module); } // 设置默认过滤机制 $request->filter($config[\'default_filter\']);评论
yeoh 2022-12-17 04:205楼
博主您好,我在内网建立一个PHP环境,然后使用您的脚本,把tool fetch url 改成内网的PHP文件地址,却无法更新,是不是我这个URL地址填的不正确?评论
星之宇 2022-12-17 10:56
通过内网浏览器访问直接PHP网址是不是会跳转到我的博客,如果是那URL地址没问题,如果不是,那就是URL错误。先判断URL在判断PHP环境是否可以。回复
yeoh 2022-12-17 13:11
博主,通过内网浏览器访问时可以跳转到您的博客的。已经测试过了。回复
星之宇 2022-12-19 08:58
那是可以的。那有可能就是阿里云的key权限设置问题了。目前可以通过手工的方式测试下看看。回复
verygood 2022-12-19 23:17
怎么手工测试?回复
星之宇 2022-12-20 08:44
http://api.77bx.com/alidns/?id=授权id&secret=授权密钥&domain=域名&record=主机名&ip=ip地址 以上换成你自己的信息就可以了,浏览器访问即可,看看返回是什么?0是成功,1是失败,2是参数错误。回复
YEOH 2022-12-22 23:26
博主你好,我通过你说的测试方法填入自己的信息后,返回的是0,这代表自己内网的PHP服务没有问题,但是内网的PHP地址填入ROS脚本里就不执行。真的快被这个问题搞疯了。是我的ROS无法访问内网的这个地址么?回复
星之宇 2022-12-23 11:26
是的,有可能ros无法访问,或者ros脚本有问题导致。回复
Ryan 2023-01-11 13:57
感谢博主提供的脚本,已经找出原因了,因为我使用的二级路由,ROS无法访问二级路由导致的,更改防火墙规则后已经运行正常了。回复
Lewis 2023-02-12 16:08
您好博主,用您的代码自建了api接口。然后将我的授权id等信息按照您上面发的网址测试了一下,返回的是1;用我的服务器测试,也是返回1。那么是否证明是我的域名问题?回复
Lewis 2023-02-12 16:42
您好,我用您发的api接口链接测试过,结果是1。域名相关的授权id、密钥等信息都输入无误,权限策略也没问题(两年前弄过),是不是因为我用的域名是.top,所以存在识别上的问题?回复
星之宇 2023-02-13 10:25
目前来说跟域名和权限策略也是有关系的,和2年前是否是同一个域名。1是失败,大概率就是权限问题。回复
Evan 2023-04-12 00:36
测试后,结果始终还是1,权限不管是教程中的配置,还是给域名操作所有权限都无法成功,排除法很可能是协议变化未做兼容,作者自己目前还在用吗?回复
星之宇 2023-04-12 08:46
目前我自己的环境已经测试了,是可以的,返回是0回复
Evan 2023-04-12 00:42
对了,作者最好是把PHP的运行环境要求也补全下,如果阿里云的请求和权限没问题,就应该只有一个服务端的运行环境问题了回复
星之宇 2023-04-12 08:49
都是标准化环境,唯一要求的就是curl和ssl,这个没配置好确实出问题,目前我用的是宝塔面板的PHP8.0回复
daady 2022-12-14 18:584楼
接口失效了吗博主?评论
星之宇 2022-12-14 19:26
测试了,有效的,是不是你的权限设置问题。回复
daady 2022-12-23 11:24
博主我看到你的源码了,如何把解析放到自己的服务器里面呢?我有vps也有php环境和域名回复
星之宇 2022-12-23 11:27
可以的。回复
风 2022-12-23 16:45
可以给个教程吗?不是很明白设置流程回复
藏起 2022-09-04 03:573楼
动态获取网络的怎么改评论
星之宇 2022-09-05 22:06
前置的路由器需要做ip绑定,然后由前置路由器做DDNS回复
穹崖巨谷 2022-07-02 13:032楼
大佬你好,请问多个域名同时解析的话,应该怎么添加呢,单个域名解析已经成功了评论
星之宇 2022-07-02 22:29
如果是同一个ip,其他的域名做cname到这单个域名上; 如果不是同一个ip,多个脚本实现就好了。回复
REX 2022-05-11 00:111楼
所以...请问接口是怎么做的呢??我看了源码,源码好像不是接口。。。。评论
星之宇 2022-05-11 08:29
PHP做的接口回复
REX 2022-07-21 16:52
是的,我知道是PHP的接口,请问接口有提供源码吗? if(is_array($request)&&count($request)<1){ Header(\"Location: //www.77bx.com/aliyun-ddns-api.html\"); exit(\'2\'); 好像github里面的这个也是通过您的接口来解析回复
星之宇 2022-07-27 17:02
这个是你直接错误访问了这个接口地址,那么直接跳转到我的页面。跟解析没有关系。回复