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

更新日期: 2020-06-02 阅读次数: 849 字数: 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,当天就不会变了。

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

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

关于作者

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

相关文章

爱评论不评论

近期节日

2020年11月26日 感恩节
2020年12月01日 世界艾滋病日
2020年12月03日 国际残疾人日
2020年12月07日 大雪
2020年12月09日 "一二九"运动纪念日
2020年12月09日 世界足球日
2020年12月10日 世界人权日
2020年12月12日 西安事变纪念日
2020年12月13日 南京大屠杀
2020年12月20日 澳门回归日
2020年12月21日 国际篮球日
2020年12月21日 冬至
查看更多节日