阿里云设置DDNS(动态域名解析)

阿里云设置DDNS(动态域名解析)阿里云设置DDNS(动态域名解析)搭建内网服务器时,因为运营商分配的公网ip地址是动态的。在一段时间后或者重启路光猫后,会导致公网ip变化,此时阿里云设置DNS将失效。因此需要进行动态域名解析。阿里云没有像花生壳一样的内置到路由器的动态域名解析服务。所以,我们没办法在路由器段进行动态域名解析设置。但是,阿里云提供了DNS的API,各个语言的API都有,因此我们可以在服务器端来实现这个动态域名解析服务。下面讲一下我实现的整个过程,我是通过go语言完成的。如下。1.设置DNS域名解析服务进入阿里云的

大家好,又见面了,我是你们的朋友全栈君。

阿里云设置DDNS(动态域名解析)

搭建内网服务器时,因为运营商分配的公网ip地址是动态的。在一段时间后或者重启路光猫后,会导致公网ip变化,此时阿里云设置DNS将失效。因此需要进行动态域名解析。

阿里云没有像花生壳一样的内置到路由器的动态域名解析服务。所以,我们没办法在路由器段进行动态域名解析设置。但是,阿里云提供了DNS的API,各个语言的API都有,因此我们可以在服务器端来实现这个动态域名解析服务。

下面讲一下我实现的整个过程,我是通过go语言完成的。如下。

1. 设置DNS域名解析服务

进入阿里云的DNS服务页面,设置域名解析。这个页面,相当于是手动操作,来实现域名解析设置。这里我们根据阿里云的教程来添加解析记录。这里我设置不是真实的服务器外网IP,真实的是211,这里我设置的212,以便后面测试DDNS是否生效。

在这里插入图片描述

2. 下载SDK

然后我们打开阿里云的帮助文档,找到API文档。文档里面有详细的说明和SDK下载链接,找到对应的go链接下载,并安装到系统。因为里面没有go语言的SDK,不过还是让我找到了,他的教程估计是很久没有更新了。
go语言SDK,在下面的界面可以找到。

在这里插入图片描述

我是通过proxychains go get github.com/aliyun/alibaba-cloud-sdk-go进行安装的。

因为我们已经添加过解析记录了,所以这里要完成的代码仅仅是修改解析记录。如果是没有添加解析记录,也可以通过go语言的API来完成解析记录的添加。我最开始是测试的添加解析记录API,直接复制代码,然后运行就行了。

这里需要accessKeyIdaccesssKeySecret。这个可以通过点击右上角的头像进行获取。

在这里插入图片描述

然后recordID通过这个链接进行获取。这个教程比较老了,现在阿里云将这个参数进行更新了,不过方法还是一样的,在updateRrValue.json这个http请求的某个参数里面能找到RecordID。

找到修改解析记录的教程。这里点击调试按钮,右边的API调用窗口就能出来,可以进行生成代码和调试。

在这里插入图片描述
在这里插入图片描述
生成的代码复制到我们的工程,然后在代码里面填入accessKeyIdaccesssKeySecret,编译运行,只要没有报错,仅仅是一行返回。并在设置域名解析能看到我们的新增的解析记录,说明整个环境搭建成功了。

3. 设置DDNS

有了上面的这段代码,实现DDNS就很简单了。只需要拿到我们服务器端的公网IP,对阿里云的DNS解析解析记录进行修改就可以了。最后,写成一个服务,定时获取wanip,如果变化了,就对我们DNS解析记录进行修改即可。
这里贴出我的代码。代码里面没有域名参数项,我猜测是通过RecordID来和我们的解析记录进行对应的,这样队能对应到我们解析记录的域名了。

ppackage main

import (
	"bytes"
	"fmt"
	"os/exec"
	"strings"
	"time"

	"github.com/aliyun/alibaba-cloud-sdk-go/services/alidns"
	log "github.com/sirupsen/logrus"
)

/* 在这里添加自己的访问秘钥 */
var accessKeyId string = ""
var accessSecret string = ""
var recordId string = ""

func main() { 
   
	go SetDDNSService()
	for { 
   
		time.Sleep(time.Duration(60) * time.Second)
	}
}

func SetDDNSService() { 
   
	var WanIP string
	var RecordIP string = GetAliRecordIP() // 服务器启动时,从阿里云获取一次

	for { 
   
		WanIP = GetWanIPStr()
		log.Info("Get WAN IP: ", WanIP)
		if WanIP != "" && WanIP != RecordIP { 
   
			log.Info("Wan IP changed. Will change the record IP.")
			err := SetDDNS(WanIP)
			if err == nil { 
   
				RecordIP = WanIP
			}

		} else { 
   
			//log.Info("Wan IP hold.")
		}
		time.Sleep(time.Duration(60) * time.Second)
	}
}

func SetDDNS(wanIP string) (err error) { 
   
	client, err := alidns.NewClientWithAccessKey("cn-hangzhou", accessKeyId, accessSecret)

	request := alidns.CreateUpdateDomainRecordRequest()
	request.Scheme = "https"

	request.RecordId = recordId
	request.RR = "@"
	request.Type = "A"
	request.Value = wanIP //GetWanIPStr() //"118.123.37.212"
	request.Lang = "en"
	request.UserClientIp = wanIP // "118.123.37.211"
	request.TTL = "600"
	request.Priority = "1"
	request.Line = "default"

	response, err := client.UpdateDomainRecord(request)
	if err != nil { 
   
		fmt.Print(err.Error(), response)
		return err
	}
	fmt.Printf("response is %#v\n", response)
	return nil
}

func GetAliRecordIP() (recordIP string) { 
   
	client, err := alidns.NewClientWithAccessKey("cn-hangzhou", accessKeyId, accessSecret)

	request := alidns.CreateDescribeDomainRecordInfoRequest()
	request.Scheme = "https"

	request.RecordId = recordId
	request.Lang = "en"
	request.UserClientIp = "118.123.37.211"

	response, err := client.DescribeDomainRecordInfo(request)
	if err != nil { 
   
		fmt.Print(err.Error())
		return ""
	}
	log.Info("Record IP: ", response.Value)
	return response.Value
}

func GetWanIPStr() (wanip string) { 
   
	cmd := exec.Command("wsl", "curl", "ident.me")
	cmd.Stdin = strings.NewReader("some input")
	var out bytes.Buffer
	cmd.Stdout = &out
	err := cmd.Run()
	if err != nil { 
   
		log.Error("error: ", err)
		return ""
	}
	//fmt.Printf("in all caps: %q\n", out.String())

	wanip = out.String()
	if wanip != "" { 
   
		//log.Info("Get WAN IP ok: ", wanip)
	} else { 
   
		log.Warn("Get WAN IP failed")
	}
	return wanip
}

运行结果:

在这里插入图片描述

上面圈出来的一行,即是官方生成的这段代码运行成功后的反馈。只要没有报错,并且有这行代码,设置域名解析上能查看到我们解析记录已经修改成功了,118.123.37.212变成了118.123.37.211说明我们的工作完成了。

在这里插入图片描述

腾讯服务器域名解析

将上面的程序跑在腾讯云服务器上,即可将阿里云的域名解析为腾讯云服务器对应的IP地址。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133898.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 模仿学习(Imitation Learning)概述

    模仿学习(Imitation Learning)概述本篇文章是基于台大李宏毅老师的课程写的,如有疏漏,请看原课程。https://www.youtube.com/watch?v=rl_ozvqQUU81.什么是模仿学习?模仿学习(ImitationLearning)也被称为基于演示的学习(LearningByDemonstration)或者学徒学习(ApprenticeshipLearning)。机器是可以与环境进行交互的,但…

    2026年1月28日
    3
  • matlab声源定位算法实现_MATLAB程序

    matlab声源定位算法实现_MATLAB程序这是通过传统互相关的方法来进行声源定位的程序,做完互相关之后,红色标注的程序行,应该如何理解呢,是通过什么方法来实现最终延迟差的估计的呢?clclearallcloseall%%%*各参数设置*%–声源相关参数fm=2000;%Hz:信源调频信号最高频率周期0.5msTs=0.2;%s:信源周期0.2s%–采样和信号处理相关参数fs=10*fm;%采样率…

    2022年9月22日
    3
  • PHP小程序开发_微信小程序后端语言

    PHP小程序开发_微信小程序后端语言想要快速地开发一个小程序,很多环节都需要注意,微信小程序php后端的开发估计很多人都还很陌生,但是这也是至关重要的,一起来看看开发实例详解吧。1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局、事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但是所有的数据都要以JSON的形式返回给小程序。2.昨天写了登录注册、忘记密码功能,…

    2025年12月14日
    3
  • 倒立摆的simulink模型搭建

    倒立摆的simulink模型搭建倒立摆的simulink模型搭建1.倒立摆基本背景:倒立摆,InvertedPendulum,是典型的多变量、高阶次,非线性、强耦合、自然不稳定系统。倒立摆系统的稳定控制是控制理论中的典型问题,在倒立摆的控制过程中能有效反映控制理论中的许多关键问题,如非线性问题、鲁棒性问题、随动问题、镇定、跟踪问题等。因此倒立摆系统作为控制理论教学与科研中典型的物理模型,常被用来检验新的控制理论和…

    2022年8月18日
    23
  • C++语法篇之STL库[通俗易懂]

    C++语法篇之STL库[通俗易懂]STL是StandardTemplateLibrary的缩写,即标准模板库。之前在写Templates模板的时候,提到过STL对于模板的应用。STL是由多个模板类构成,能够为开发者提供通用的数据结构和算法。STL主要包含以下内容:一个简单的vector示例:创建int类型的向量,并实现初始化、赋值和打印操作。输出结果:从上边的例子可以体现出vector的健壮性,vector是一个动态的数组模板,可以在程序运行过程中高效地添加或者删除元素,为程序设计提供了很大的灵活性。最后,关于STL还有很

    2022年8月31日
    5
  • JavaScript日期格式化及解析

    JavaScript日期格式化及解析JavaScript开发经常需要对日期进行转换,把日期转成字符串或者从字符串生成日期。JavaScript日期对象内置了简单的日期格式化方法toString()和日期解析方法Date.parse(),这两个方法有较大的局限性,不能自定义自定义日期格式化和解析的字符串格式。下面列出一些常用的日期处理JS库。

    2022年5月25日
    43

发表回复

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

关注全栈程序员社区公众号