Windows使用阿里云RAM访问控制API实现自建DDNS动态域名解析

前言

因为最近将家里的电信宽带换成了公网IP,在二手鱼上面淘了点破烂,搭建了一些服务(比如NAS)。而电信的公网IP并不是固定的,要想持续稳定的访问到搭建的服务,我们可以使用固定的域名访问,这就需要DDNS,每次IP变化后,将域名动态的解析到新的公网IP上。 一开始准备使用路由自带的DDNS功能,家里用的小米路由器,小米路由器自带的DDNS服务商有下面几家:

  • 花生壳(oray.com)
  • 公云(3322.org)
  • Dyndns.com
  • No-ip.com

一般可能用花生壳的比较多一点,但是免费的域名毕竟又长又cuo(免费的还要啥自行车),不便于记忆。 正好我有几个域名正在使用,而且都已经备案过,所以我觉得使用自己的域名比较方便,遂决定使用阿里云的API实现自建的DDNS服务。 本次服务我是将软件部署到下载机(一台7_24在线的Windows电脑)里的,后面尝试将该服务直接部署到小米路由器里,这样适用于没有7_24在线机器的情况。

更新:后来发现小米路由器有插件Misstar Tools,安装后直接使用里面的Ali DDNS模块即可。
非小米路由可以使用这个开源项目:AliDDNSBash,跑的是shell脚本。

一、实现方式

1.使用到的资源

  • 域名服务商:阿里云
  • 软件:NewFuture/DDNS,Github开源项目,网址:点我

2.基本流程

architecture

二、阿里云配置

(一)前置条件

首先,默认你已经拥有域名并且已经备案(不备案解析时会被阿里云阻断)。

(二)添加RAM访问控制

1.添加子用户

登录阿里云,点击右上角用户头像,选择 访问控制access 阿里云会有下面的提示: child_account 意思这个全局 AccessKey权限太高,知道这个等于就拥有你账号所有权限,墙裂建议你使用RAM子用户去进行API调用。所有为了安全,我们点击使用子用户AccessKey。 进去后点击左侧的 人员管理-用户,添加一个用户,比如叫shangyexin.com-dns,访问方式选择编程访问,因为你使用API去修改DNS解析,并不需要去WEB上使用这个用户: create_account

2.为子用户添加权限

创建好后点击创建的用户名,然后选择 添加权限为这个子用户添加修改DNS解析的权限: add_access 一般一开始调试时建议先添加系统策略,在搜索框里搜索 dns,然后选择添加AliyunDNSFullAccess权限,也就是拥有你该账户下的所有域名DNS解析权限,点击确定即可(只有操作DNS权限,没有对你账号下除DNS外其他资源的权限)。 后面步骤调试通后,可以添加更加细粒度的权限,比如只可以修改指定的域名。 可以选择 新建策略权限,然后添加该权限。比如本文中添加了下面这样的权限:

  • 所有域名的查询主域名权限,因为不添加后面步骤中使用的软件无法查询二级域名的主域名
  • shangyexin.com域名的所有权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Version": "1",
"Statement": [
{
"Action": [
"alidns:GetMainDomainName"
],
"Resource": "acs:alidns:*:*:domain/*",
"Effect": "Allow"
},
{
"Action": "*",
"Resource": "acs:alidns:*:*:domain/yasin.store",
"Effect": "Allow"
}
]
}

更多详情可以参考阿里云官方文档: 点我

3.创建新的AccessKey

用户和权限都已经创建好后,我们就可以添加 AccessKey,点击用户名后,点击最下面的AccessKey,会出现下面的提示:

请及时保存或发送 AccessKey 信息至对应员工,弹窗关闭后将无法再次获取该信息,但您可以随时创建新的 AccessKey 。

意思这个 AccessKey只能在创建时被看到,后面无法看到,所以我们需要将创建得到的的AccessKey保持下来,以给下面的软件使用。 一个典型的 AccessKey(已失效)如下:

1
2
AccessKey ID LTAI4Fc4Rresd6uUdgt9w9Cq
AccessKeySecret 40wgnfmCWVxcTXQT2xgP86hz5Y9dSe

三、DDNS软件配置

(一)软件介绍

这里使用的是这个开源软件,项目地址:https://github.com/NewFuture/DDNS 原因是支持多平台和多服务商,下面是feature的简介:

  • 兼容和跨平台:
    • [x] 可执行文件(无需 python 环境)
    • [x] 多系统兼容 cross platform
    • [x] python2 和 python3 支持 PyPI - Python Version
    • [x] PIP 安装 PyPI - Wheel
  • 域名支持:
    • [x] 多个域名支持
    • [x] 多级域名解析
    • [x] 自动创建新记录
  • IP 类型:
    • [x] 内网 IPv4 / IPv6
    • [x] 公网 IPv4 / IPv6 (支持自定义 API)
    • [x] 自定义命令(shell)
    • [x] 正则选取支持(@rufengsuixing)
  • 网络代理:
    • [x] http 代理支持
    • [x] 多代理自动切换
  • 服务商支持:
  • 其他:
    • [x] 可设置定时任务
    • [x] TTL 配置支持
    • [x] 本地文件缓存(减少 API 请求)

(二)软件使用

1.配置与运行

我这次机器装的是Windows系统,所有使用的是exe程序,下载后直接运行即可。 如果下载较慢的话可以使用下面的地址,是2.9.2版本: 下载地址:https://yasin.store/index.php/s/7PGRWFBqxGietnN 可以直接双击运行,但是建议使用Windows系统的 cmd命令,在命令窗口手动输命令运行,这样可以看到打印的日志。 首次运行会在同级目录自动生成一个名为 config.json的模板配置文件。我们需要将里面的内容改成我们自己的配置,因为这次使用的是阿里云,参考配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"$schema": "https://ddns.newfuture.cc/schema/v2.8.json",
"debug": false,
"dns": "alidns",
"id": "LTAI4Fc4Rresd6uUdgt9w9Cq",
"index4": "public",
"index6": "default",
"ipv4": [
"test.shangyexin.com"
],
"ipv6": [
],
"proxy": null,
"token": "40wgnfmCWVxcTXQT2xgP86hz5Y9dSe",
"ttl": null
}

记得将 idtoken替换为上一步你在阿里云上保存的AccessKeyAccessKeySecretipv4替换为你自己需要解析使用的域名。 **出现错误时建议将 debug选项调为true以获取更多信息,config.json更详细的配置可以参考Github上的项目说明。** 配置后直接运行软件(配置文件选择你自己的实际路径):

1
ddns -c path/to/config.json

如果配置正确的话,你就可以登录阿里云控制台,发现新的域名已经添加成功。

2.定时任务

①bat脚本

下载 create-task.bat于相同目录,以管理员权限运行。 因为文件很小,我们可以直接新建一个txt,将后缀名改为bat,添加下面的内容并保存: create-task.bat脚本

1
2
3
4
5
6
7
8
9
10
11
12
@ECHO OFF
REM https://msdn.microsoft.com/zh-cn/library/windows/desktop/bb736357(v=vs.85).aspx

SET RUNCMD="%~dp0ddns.exe" -c "%~dp0config.json" >> "%~dp0run.log"

SET RUN_USER=%USERNAME%
WHOAMI /GROUPS FIND "12288" > NUL && SET RUN_USER="SYSTEM"

ECHO Create task run as %RUN_USER%
schtasks /Create /SC MINUTE /MO 5 /TR "%RUNCMD%" /TN "DDNS" /F /RU "%RUN_USER%"

PAUSE

意思每5分钟检查运行一下程序,这样如果IP变化的话,就会更新DNS解析。 停止定时任务delete-task.bat:

1
2
3
ECHO delete task DDNS

schtasks /delete /TN "DDNS" /f
②Windows计划任务

也可以右键我的电脑,选择 管理-->任务计划程序-->创建任务自定义更详细的计划任务,这里不多做解释。

四、END

Enjoy it now.


Windows使用阿里云RAM访问控制API实现自建DDNS动态域名解析
https://www.shangyexin.com/2020/04/16/aliddns/
作者
Yasin
发布于
2020年4月16日
许可协议