当前位置:首页 > 网络技术 > RouterOS利用aliyun的API接口实现DDNS动态解析

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

网络技术 / 星之宇 / 2019-6-8 11:05 / 浏览:35211 / 评论:139

本文主要讲解如何借助阿里云aliyun的云解析API接口来实现RouterOS(以下简称ROS)的DDNS动态解析。


一、创建访问控制RAM的AccessKey

我这边简单的讲讲如何申请开通:

1、阿里云网站 --> 产品 --> 安全 --> 应用身份服务,这个就是控制API ,用户管理,新建用户,填写用户名和勾上“为该用户自动生成AccessKey”,保存好这个accesskey。


2、策略管理 --> 自定义授权策略,新建授权策略,选择空白模版,授权策略名称随便填(如alidns),策略内容为下面的内容(
修改下面内容中的域名为你自己要做DDNS的域名)

action是api的接口,只接受AddDomainRecord(增加域名解析),DescribeDomainRecords(输出域名解析列表)和UpdateDomainRecord(修改域名解析记录)

Resource是指被授权的具体对象,这边domain/myxzy.com需要修改成你自己的域名domain/xxx.com。这样就是授权对象是该域名

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "alidns:AddDomainRecord",
        "alidns:DescribeDomainRecords",
        "alidns:UpdateDomainRecord"
      ],
      "Resource": "acs:alidns:*:*:domain/myxzy.com",
      "Effect": "Allow"
    }
  ]
}


3、用户管理,对上面创建的用户,点击授权,选择刚才自定义创建的策略,确定。


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

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

接口地址:


HTTP请求方式:

  • POST/GET


请求参数:

  • id    (必选)  AccessKeyId
  • secret (必选)  AccessKeySecret
  • record  (必选)  记录名(如:www)
  • domain (必选)  域名(如:myxzy.com)
  • ip         (可选,默认值为请求来源IPv4)  DDNS的IP地址
  • type     (可选,默认值为A,可选值为AAAA) IPv6支持


示例:
curl -X POST http://u.myxzy.com/alidns -d 'id=id&secret=secret&domain=myxzy.com&record=www&ip=1.1.1.1'

返回

“0”代表解析修改成功或者是当前解析记录ip相同

“1”代表AccessKey报错(这个阿里云我这边经常出现,刷新就可以正常)

“2”代表没有设置参数


安全说明:

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

2、强烈建议按照步骤一设置授权权限。

3、由于使用本接口出现的任何安全问题,本人概不负责。这边只能保证本人不会去做任何后门行为。这边建议勤换AccessKey


2020-2-14 v1.1

1、修复records记录太多,导致重复添加域名记录

2、修复签名有概率失败的情况

3、支持IPv6解析,加上参数&type=AAAA,IP参数为IPv6地址



2019-6-8 v1.0

1、只支持A记录,TTL为600(10分钟),线路是默认线路

2、ip填入不带,默认是来源的IPv4地址

3、不支持IPv6

4、解析记录不存在会自动新建解析记录,存在则修改解析

5、多线路相同主机名记录只能识别列表第一条主机名解析记录

6、供源码


三、ROS脚本

id、secret、domain、record、pppoe修改成自己的。定时1分钟运行就好。

#aliyun Access Key
:local id "AccessKeyId"
:local secret "AccessKeySecret"

#domain
:local domain "myxzy.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://u.myxzy.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/myxzy/alidns-api-php

目前有 139 条评论

    • QQ
    • 填好QQ,点击获取自动填写昵称和邮箱
    • 昵称
    • 邮箱
    • 网址

    Nautilus 2021-01-17 16:3940楼

    楼主,你好,感谢提供的解析接口,万分感谢。想请教一下,这里能不能同时支持“www”和“@”两种方式呢?评论

    星之宇 2021-01-17 16:41

    @Nautilus:类似于用@.myxzy.com就好回复

    Nautilus 2021-01-17 16:42

    那我就在“record”那里填“@”就可以了吗?多谢指教回复

    星之宇 2021-01-17 16:43

    @Nautilus:是的。回复

    Nautilus 2021-01-17 16:45

    感谢楼主拨冗指教,用自己的资源帮大家做接口,实在不容易,不过期待你的文章,如何创建自己的解析接口。祝生活愉快,工作顺利!回复

    游客2028837530 2020-12-21 16:3139楼

    上个record忘记该,不好意思
    https://u.myxzy.com/alidns/?id=***up&secret=***&domain=***.COM&record=@&ip=1.1.1.1可以正常返回0且阿里可以修改解析地址
    但是record修改为www就不正常了。我www解析CNAME到XXXX.COM正常没错啊
    另Ros里面执行命令log无法输出,且代码无效评论

    星之宇 2020-12-21 17:19

    @游客2028837530:保证阿里云后台是做A或AAAA以及没有这个解析就能成功,如果是其他解析就失败了。做了cname就不要用这个脚本。回复

    游客2028837530 2020-12-21 17:26

    @星之宇:只做一个www的A记录?回复

    星之宇 2020-12-22 16:03

    @游客2028837530:是的。无非是一个ip,一个A记录,其他的做cname到这个A记录的域名就好回复

    游客2028837530 2020-12-21 16:0538楼

    https://u.myxzy.com/alidns/?id=***&secret=***&domain=***.XYZ&record=ros&ip=1.1.1.1
    博主,请问为什么测试域名这里加了www返回值是1,不加www返回值是0
    解析里面已经设置了www解析了评论

    星之宇 2020-12-21 16:07

    @游客2028837530:不加www的应该改成@.***.xyz这个才是不加www的解析,要简单,不加www的直接在后台做个cname解析到www.xxx.xyz即可回复

    daady 2020-12-17 22:1637楼

    您好博主,第一步申请accesskey,新建用户、策略,授权
    第二步将代码写入ROS,修改部分内容
    手动将目前公网IP解析到A记录可以访问,但是重启路由后更换了公网IP,阿里云不会自动更换解析IP,是第二步我漏了什么东西吗?评论

    星之宇 2020-12-17 22:19

    @daady:ros的脚本要自动运行回复

    daady 2020-12-17 22:20

    @星之宇:已经添加了自动运行1分钟的任务,代码和自动运行的任务都运行了一千多次。log里面没反应,阿里云里面也不解析。
    浏览器内输入上述代码一直显示1回复

    星之宇 2020-12-17 22:22

    @daady:显示1是错误的回复

    daady 2020-12-17 22:24

    @星之宇:请问可以麻烦详细解答一下吗?确认所有的设置都是按照教程,域名也是新买的
    http://u.myxzy.com/alidns/?id=xxxx&secret=xxx&domain=daady.xyz&record=www&ip=1.1.1.1回复

    星之宇 2020-12-17 22:25

    @daady:id和secret要对回复

    daady 2020-12-17 22:27

    @星之宇:是子账户的accesskey  id 和secret没错的,我换成管理账户的id和secret同样还是不行
    ROS版本是V6.42.4(STABLE)
    f3322的解析就是正常的,真的不知道怎么排除问题了回复

    星之宇 2020-12-18 06:03

    @daady:首先保证网页访问是0了才对回复

    daady 2020-12-18 09:57

    @星之宇:https://developer.aliyun.com/article/702552
    您好,您看一下阿里云官方的指南。阿里称不支持ddns,只有这种方式可以实现。
    如果说ROS版本有问题但F3322又正常的,大神可以帮忙看看嘛回复

    星之宇 2020-12-18 10:02

    @daady:既然我开源出来,那么肯定是可以的,也经过测试是可以的,就我自己网站今年不到1年就近2000多万的解析次数。
    aliyun配置好,使用网页访问没有出现0,那么就是配置的问题,如果出现了0,但是ROS放入脚本后无法更新,那么就是ROS脚本设置问题。回复

    游客3072454829 2020-12-18 19:21

    @星之宇:大佬我发现按教程设置好,只要连wifi,哪怕解析的a记录不对,ros里面没有脚本和自动执行的任务,我的域名也可以访问家庭网络。但是断开wifi就不行了,按教程设置了好多遍了确认没问题,可以远程协助一下吗。万分感谢回复

    daady 2020-12-17 21:3736楼

    大佬,第一步第三步看的懂,第二步能说详细点吗?
    专门买了个域名发现第二步看不懂
    小白没有计算机语言基础的真的看不懂,非常感谢。评论

    游客2102471332 2020-12-14 17:1335楼

    curl -X POST https://xxx.com/alidns -d 'id=id&secret=secret&domain=myxzy.com&record=www&ip=1.1.1.1'
    执行正常,为什么放到ROS脚本里执行啥都不提示呢?评论

    星之宇 2020-12-14 17:13

    @游客2102471332:ROS不支持curl,请看下面详细脚本回复

    游客1783974000 2020-12-14 21:05

    @星之宇:https://xxx.com/alidns -d 'id=id&secret=secret&domain=myxzy.com&record=www&ip=1.1.1.1
    我是浏览器里执行的这个,返回0,但ROS里没反应!回复

    星之宇 2020-12-15 17:25

    @游客1783974000:ros版本也有关系的回复

    游客3719364068 2020-12-08 17:1634楼

    部署在本地服务器,总是返回 1 ,发现 $data = json_decode(ssl_post(geturl($public,$search,$accessKeySecret)),true);
    ssl_post(geturl($public,$search,$accessKeySecret))这一句返回有问题,alidns报错:
    400 Bad Request
    Sorry for the inconvenience.
    Please report this message and include the following information to us.
    Thank you very much!
    URL:    https://alidns.aliyuncs.com:28443/?Format=json&Version=2015-01-09&AccessKeyId=test-key&SignatureMethod=HMAC-SHA1&Timestamp=2020-12-08T09%3A12%3A10Z&SignatureVersion=1.0&SignatureNonce=16074187304333&Action=DescribeDomainRecords&DomainName=xxx.net&PageSize=500&RRKeyWord=xxx&Type=A&Signature=1RUGslOzOJdkSiOipKLp%2FqqQ6rk%3D
    Server:    pop-aliyun-com033014194213.et2
    Date:    2020/12/08 17:12:10
    Powered by Tengine评论

    星之宇 2020-12-08 17:37

    @游客3719364068:你的key域名不对当然是返回错误,回复

    游客3719364068 2020-12-08 20:24

    @星之宇:域名是我修改过的,所有参数都没问题,用我自己的网站不行,用你的就没问题,问号后的参数一摸一样的回复

    星之宇 2020-12-08 23:21

    @游客3719364068:那就是环境问题回复

    游客3738350630 2020-11-24 19:4633楼

    大佬 请问下 照你教程上 创建访问控制RAM的AccessKey    php脚本 放 在服务器里  要怎么运行呢 改这个url地址?http://u.myxzy.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr&type=AAAA" as-value output=user]评论

    星之宇 2020-11-24 23:36

    @游客3738350630:php服务器用于接收ros脚本更新回复

    游客2062135456 2020-08-30 11:2332楼

    ......
    :local result [/tool fetch url="http://u.myxzy.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr" as-value output=user];
    :log info "any log"; //打不出日志,说明获取url结果的语句执行失败评论

    星之宇 2020-08-31 11:22

    @游客2062135456:新版本ROS独立下url吧。不然不知道fetch url为什么会执行失败。回复

    zephyrchen 2020-08-27 20:3731楼

    谢谢大神,基本都OK,就剩一个问题
    #domain
    :local domain "myxzy.com"
    :local record "www"

    这个解析正常没问题

    #domain
    :local domain "myxzy.com"
    :local record "@"
    这个无法更新,用run script也没有效果。
    请问像这种主域名应该怎么设置评论

    星之宇 2020-08-28 05:21

    @zephyrchen:主域名做cname到www,不过我测试过这个是支持的。回复

    游客2089135590 2020-09-15 18:57

    @星之宇:大神,我也是无法绑定@回复

    星之宇 2020-09-15 19:05

    @游客2089135590:做过测试是可以的。回复

    canghai 2020-08-26 21:2030楼

    大神,我想在自己的vps上部署这个php的api该如何部署?从github上下的php好像不能用评论

    星之宇 2020-08-28 05:22

    @canghai:测试过可以的。可能你的php环境有问题。回复

    Joe 2020-08-11 17:3429楼

    如何使用此脚本解析多个二级域名?只能增加脚本数量吗?评论

    星之宇 2020-08-11 22:52

    @Joe:同一个ip其他二级域名请用cname,如果是不同的ip不同的拨号增加脚本数量。其他的功能就要定制化了,这个是收费的。回复

    游客1901568643 2020-06-17 17:4028楼

    使用你的api-php源码搭建了服务端,通过curl是可以解析的,但是在ros里添加了脚本,不能解析。是咋回事啊评论

    星之宇 2020-06-17 19:05

    @游客1901568643:应该是脚本有问题。回复

    游客1901568643 2020-06-17 21:57

    @星之宇:#aliyun Access Key
    :local id "xx"
    :local secret "xx"

    #domain
    :local domain "xxxx"
    :local record "xxx"

    #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://xx.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";
    }
    }
    }

    用的这段脚本
    在ros里运行是<404 NOT FOUND>回复

    星之宇 2020-06-17 22:59

    @游客1901568643:无法访问网站。回复

    游客1901568643 2020-06-17 23:40

    @星之宇:/tool fetch url="http://xx.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr" as-value output=user
    我把这段脚本直接在ros里跑是<404 NOT FOUND>
    然后修改了下/tool fetch url="http://xx.com/alidns\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr" as-value output=user后台解析成功
    但是放到定时脚本里还是不行啊。是因为的nginx配置的问题吗?我是在windows2008R2下部署的回复

    星之宇 2020-06-17 23:42

    @游客1901568643:不会,不要直接进定时脚本,最好是先做脚本,对脚本进行定时执行回复

    游客1901568643 2020-06-18 11:18

    @星之宇:好像因为ros是5.25的关系/tool fetch url="http://xx.com/alidns\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr" as-value output=user这段语法有问题回复

    游客1901568643 2020-06-18 11:40

    @星之宇:ros5.25不支持将结果保存为变量,后面那一段脚本要调整下,老大能帮忙改改吗回复

    星之宇 2020-06-18 13:32

    @游客1901568643:这个自己改,要么用新版本回复

    游客1886417031 2020-06-13 10:5727楼

    大佬,我找了好久终于在你这里找到ROS中进行阿里云域名解析的教程,可是,我按照教程弄了,失败了,可不可以加个QQ赐教一下,万分感谢评论

    星之宇 2020-06-13 10:59

    @游客1886417031:教程很详细了,一般新版本不会失败的。回复

    游客1886417031 2020-06-13 11:16

    @星之宇:小弟QQ1273956911,真心请教,没有任何其它目的,大佬能不能帮忙详细指导一下回复

    星之宇 2020-06-13 11:40

    @游客1886417031:阿里云设置正确,脚本设置正确,改好之后,pppoe重播下换一下ip地址,一般就好了。回复

    游客3071304872 2020-06-12 01:1526楼

    大佬,多线路,有没有切换带有切换pppoe-ou1的。我两条电信线路。有时候一条断了,想映射第二条备用线路ip评论

    星之宇 2020-06-12 06:34

    @游客3071304872:这个可以检测pppoe-out1的拨号情况,然后提交就可以了回复

    游客1991959338 2020-05-26 17:0625楼

    我这是光猫直接拨号,无法得到PPPOE的名称,ROS使用的是DHCP-Client来上网的,这样的话。。怎么进行解析?评论

    星之宇 2020-05-26 17:20

    @游客1991959338:光猫需要做dmz,如果外部不能访问,如果做了dmz可以不带ip自动识别来源的ip地址。回复

    游客975560620 2020-05-15 18:5924楼

    按照你步骤,好像不能成功,可以指导下吗?alidns-api-php脚本源码评论

    星之宇 2020-05-15 20:17

    @游客975560620:跟ros版本还是有关系的。应该支持最新的版本回复

    游客975560620 2020-05-15 20:30

    @星之宇:用你网站的php可以,但是alidns-api-php脚本源码放到我的虚拟机,然后就不行了回复

    星之宇 2020-05-15 20:31

    @游客975560620:要支持curl不知道那就没办。回复

    强哥 2020-04-16 14:3223楼

    RouterOS 6.43.16,之前一直正常,前几天突然不会更新IP
    经测试,直接用http://u.myxzy.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr在浏览器上输入,可以更新
    但是ROS脚本就是不行,执行到:local result [/tool fetch url="http://u.myxzy.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr" as-value output=user];这句之后就没反应了评论

    星之宇 2020-04-16 16:01

    @强哥:我映像中,有个版本之后,调准了tool fetch url。回复

    星之宇 2020-04-16 16:43

    @强哥:使用本站的新脚本就可以了回复

    强哥 2020-04-20 14:02

    @星之宇:原来使用的就是本篇的脚本,之前一直正常使用的,不知新脚本在哪可以找到?回复

    星之宇 2020-04-20 17:32

    @强哥:只要把连接提取出来做local赋值试试。
    :local url "http://u.myxzy.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr"
    :local result [/tool fetch url=$url as-value output=user];回复

    强哥 2020-04-20 19:22

    @星之宇:测试结果如下:
    :local url "http://u.myxzy.com/alidns/\?id=$id&secret=$secret&domain=$domain&record=$record&ip=$ipaddr";
    :log info $url;//此处输出信息正确
    :local result [/tool fetch url=$url as-value output=user];//应该是此语句出错
    :log info $result;//此处无输出
    不知道原因出在哪回复

    强哥 2020-04-20 19:49

    @强哥:另外测试了直接用输出的url链接直接在浏览器打开,DDNS是可以更新的回复

    星之宇 2020-04-21 18:40

    @强哥:6.44.5版本测试是可以的回复

    VX 287562722 2020-04-15 01:4122楼

    大佬,付费给搞个华为云的DDNS吧评论

    星之宇 2020-04-15 08:09

    @VX 287562722:最近没空,而且使用华为云的DDNS比较小众吧。回复

    VX 287562722 2020-04-19 01:09

    @星之宇:华为云的ddns ttl值可以1秒,神器,可能用普及的不够,另外大佬你的变量有问题导致ddns脚本不能更新改为全局变量正常,但是全局变量又不灵活,没办法了我用{}把整个脚本放在一个行内,然后全部用行内变量正常了回复

    星之宇 2020-04-19 10:29

    @VX 287562722:这个可能是ROS新版本改了脚本规则引起的。回复

    游客245173659 2020-03-22 18:3421楼

    手动用网页写入www和@记录都能成功,不知道是不是ros脚本有问题,2个脚本分别是www和@,設置1分钟,重新获取公网IPwww正常,@不能更新评论

    星之宇 2020-03-22 19:12

    @游客245173659:你测试话的话,重播下pppoe看看是否更新,脚本本地会判断当前ip地址有没有变更。如果@不行的话。@做cname解析到www就可以了。回复

    游客245173659 2020-03-22 19:30

    @星之宇:@做cname解析到www就可以了这个怎么弄回复

    星之宇 2020-03-22 19:32

    @游客245173659:比如我直接在阿里云dns里面设置一条记录,比如我的域名、@做cname解析到www.myxzy.com,那么我只要更新一条www.myxzy.com的记录就好。回复