RouterOS 阿里云 DDNS 脚本

将以下脚本添加到 System Scheduler 里,设置 Interval 为 00:01:00,并修改开头的四个变量,即可实现阿里云域名的DDNS。

注意事项:
该脚本只适用于WAN口能直接获取到公网IP的情形。
该脚本不会自动在阿里云DNS里创建子域名,要更新的子域名必须事先添加好。

:local "accessKeyId" "你的阿里云Access Key ID";
:local "accessKeySecret" "你的阿里云Access Key Secret";
:local "domain" "你的域名";
:local "wanInterface" "WAN口接口名称"

# ==========

:local "localIP"
:local "resolvedIP";
:local "epicFail" false;


:do {
  :set $localIP [ /ip address get [ find interface=$wanInterface ] address ];
  :set $localIP [ :pick $localIP 0 [ :find $localIP "/" ] ];
  :set $localIP [ :toip $localIP ];
} \
on-error {
  :set $epicFail true;
  :log error ("DDNS: Get local IP failed.");
}


:do {
  :set $resolvedIP [ :resolve $domain ];
} \
on-error {
  :set $epicFail true;
  :log error ("DDNS: Resolve domain " . $domain . " failed.");
}


:if ($epicFail = false && $localIP != $resolvedIP) \
do={
  :local "callUrl" ("https://ddns.vsean.net/aliyun/index.php");
  :local "postData" ("domain=" . $domain . "&id=" . $accessKeyId . "&secret=" . $accessKeySecret);
  :local result [ /tool fetch url=$callUrl mode=https http-method=post http-data=$postData as-value output=user ];
  :log info ("DDNS: " . $result->"data");
}

关于如何获取 Access Key ID / Secret 的教程可以参考下一篇文章:
获取用于DDNS的阿里云Access Key ID/Secret

服务器端脚本源代码看这里:
https://github.com/vibbow/aliyun-ddns-script


更新:如果你的接口无法直接获取到公网IP(如DMZ或者1:1 NAT),则可用以下代码取代获取 localIP 部分的代码

:do {
  :local result [/tool fetch url="http://ip.3322.net/" mode=http as-value output=user];
  :set $localIP ($result->"data")
  :set $localIP [ :pick $localIP 0 [ :find $localIP "\n" ] ];
  :set $localIP [ :toip $localIP ]
} \
on-error {
  :set $epicFail true;
  :log error ("DDNS: Get local IP failed.");
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注