golang 调用阿里云 API 动态修改域名解析记录

更新日期: 2020-06-02 阅读次数: 276 字数: 421 分类: DNS

写了一套公司内部使用的网站日志跟踪系统,由于内网只有 windows 的服务器,而且使用频率有限,我决定干脆部署在本机上。 为了防止本机IP变化,影响访问。于是尝试一下使用阿里云 API 动态修改域名解析记录。

golang 版本的三方实现

https://github.com/GameBelial/AliDDNSGo

如何获取 Access Id 与 Access Key

点击阿里云右上角头像,选择“AccessKey 管理”。

由于是公司的阿里云账号,还是按照 RAM 规范添加一个子账号,给予 AliyunDNSFullAccess 权限比较好。这样不至于 API 权限被滥用。

注:什么是 ram 访问控制

即 Resource Access Management, RAM 使您能够以更精细的粒度(eg, 资源对象级、API操作级)授予对云端资源的访问权限,帮助您的公司实施最小授权原则。您还可以根据请求源IP 地址、日期/时间、资源标签等属性创建更精细的资源访问控制策略,这些策略有助于确保在授予对云端资源的访问权限时运用适当的安全控制措施。

运行程序

git clone git@github.com:GameBelial/AliDDNSGo.git

修改 settings.json

{
    "AccessId": "xxx",
    "AccessKey": "xxx",
    "MainDomain": "sunzhongwei.com",
    "SubDomains": [
        {
            "Type": "A",
            "SubDomain": "log",
            "Interval": 600
        }
    ]
}

编译并运行:

> go build -o alidns
> ./alidns
2020/06/02 10:00:40 域名记录更新成功...

问题

但是从阿里云DNS解析后台的解析日志上看,这条记录被修改成了公司出口公网IP,而不是我的开发机内网IP。

golang 获取内网 IP

func getLocalIP() string {
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		return ""
	}

	for _, address := range addrs {
		// check the address type and if it is not a loopback the display it
		if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
			if ipnet.IP.To4() != nil {
				return ipnet.IP.String()
			}
		}
	}

	return ""
}

于是我 fork 了一份代码,修改了一下逻辑,代码如下:

https://github.com/sunzhongwei/AliDDNSGo

设置个定时任务

其实也不是必须的,因为通常在开机的时候自动分配一个IP,当天就不会变了。

但是为了严谨起见,防止机器重启,还是设置计划任务吧。

领取618阿里云/腾讯云服务器优惠券

关于作者

我是来自山东烟台的一名开发者,喜欢瞎折腾,顺便记记笔记。有敢兴趣的话题,欢迎加微信 zhongwei 聊聊。 白天写程序,晚上哄熊孩子,可能回复有点慢,见谅。 查看更多联系方式

相关文章

爱评论不评论

近期节日

2020年07月06日 国际接吻日
2020年07月06日 小暑
2020年07月07日 抗日战争纪念日
2020年07月11日 世界人口日
2020年07月22日 大暑
2020年07月30日 非洲妇女日
2020年08月01日 八一建军节
2020年08月06日 国际电影节
2020年08月07日 立秋
2020年08月15日 日本投降日
2020年08月22日 处暑
2020年08月25日 七夕
查看更多节日