当前位置:首页 > 程序开发 > RouterOS利用aliyun的API接口实现DDNS动态解析

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

程序开发 / 星之宇 / 2021-5-3 8:00 / 浏览:3029 / 评论:8

本文主要讲解如何借助阿里云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

目前有 8 条评论

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

    藏起 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

    这个是你直接错误访问了这个接口地址,那么直接跳转到我的页面。跟解析没有关系。回复