原文:
https://www.myxzy.com/alidns-api-php.html
alidns-api-php腳本源碼
Github:https://github.com/myxzy/alidns-api-php
本文主要講解如何借助阿里雲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腳本源碼