写了一套公司内部使用的网站日志跟踪系统,由于内网只有 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,当天就不会变了。

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