golang监控公网IP变化自动同步dns解析

大致思路

  • 有一个地方保存旧公网ip 可以是文件/redis等

  • 定时访问一些网站或者执行脚本获取最新的公网ip

    • 网站

      https://api.ipify.org
      http://myexternalip.com/raw
    • 脚本

      curl -s ifconfig.me
      curl ipv4.ip.sb
  • 新公网ip 与 旧公网ip不一致,则调用腾讯云golang sdk修改域名的ip解析

    • 正文有详细的demo代码
  • 循环定时执行巡检即可

获取最新公网ip

func getExternalIp1() string {
 // 使用http.Get函数请求外部服务
 resp, err := http.Get("https://api.ipify.org")
 if err != nil {
  log.Printf("请求失败: %s\n", err)
  return ""
 }
 defer resp.Body.Close() // 确保关闭响应体
 // 读取响应体内容
 ip, err := io.ReadAll(resp.Body)
 if err != nil {
  log.Printf("读取响应失败: %s\n", err)
  return ""
 }
 return string(ip)
}
  • 为了兼容一些异常 校验下ip是否合法 不是一些errorcode之类的

    func IsValidIPv4(ip string) bool {
     parsedIP := net.ParseIP(ip)
     return parsedIP != nil && parsedIP.To4() != nil
    }

动态更新域名对应ip

腾讯云启用API密钥,记录自己的secertId和和secertKey

管理地址 https://console.cloud.tencent.com/cam/capi

引入腾讯云golangapi 其它也类似

import (
 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
 dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
)

查询域名下面的所有解析记录

  • 下面demo代码注意修改 你的SecertId/你的SecertKey/域名 会打印域名下面的所有的A记录解析情况
credential := common.NewCredential(
  "你的SecertId",
  "你的SecertKey",
 )
 // 实例化一个client选项,可选的,没有特殊需求可以跳过
 cpf := profile.NewClientProfile()
 cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com"
 // 实例化要请求产品的client对象,clientProfile是可选的
 client, _ := dnspod.NewClient(credential, "", cpf)
 // 实例化一个请求对象,每个接口都会对应一个request对象
 request := dnspod.NewDescribeRecordListRequest()
 var Domain string ="becool.vip"
 var RecordType string ="A"
 request.Domain =&Domain
 request.RecordType =&RecordType
 // 返回的resp是一个DescribeRecordListResponse的实例,与请求对象对应
 response, err := client.DescribeRecordList(request)
 if _, ok := err.(*errors.TencentCloudSDKError); ok {
  fmt.Printf("An API error has returned: %s\n", err)
  return ""
 }
 if err != nil {
  fmt.Println("getdnsrecord err:%s",err.Error())
  return ""
 }
 for i:=0;i<len(response.Response.RecordList);i++{
  item:=response.Response.RecordList[i]
fmt.Println(*item.Value,*item.RecordId,*item.Line,*item.LineId,*item.Remark,*item.MX,*item.Name,*item.UpdatedOn)
 }

更改域名对应ip解析

  • 建议指定 var SubDomain string ="bereal" 具体主机记录 比如 @/www/子域名
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
 // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
 credential := common.NewCredential(
  "你的SecertId",
  "你的SecertKey",
 )
 // 实例化一个client选项,可选的,没有特殊需求可以跳过
 cpf := profile.NewClientProfile()
 cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com"
 // 实例化要请求产品的client对象,clientProfile是可选的
 client, _ := dnspod.NewClient(credential, "", cpf)
 // 实例化一个请求对象,每个接口都会对应一个request对象
 request := dnspod.NewModifyRecordRequest()
 var Domain string ="becool.vip"
 var SubDomain string ="blog" // 我这里指定子域名 对应全称就是blog.becool.vip
 var RecordType string = "A"
 var RecordLine string = "默认"
 var RecordLineId string ="0"
 var RecordId uint64 = 1811353533 // 对应上面的item.RecordId
 var Value string = extIp
 request.Domain =&Domain
 request.RecordType = &RecordType
 request.RecordLine = &RecordLine
 request.RecordLineId =&RecordLineId
 request.Value =&Value
 request.RecordId =&RecordId
 request.SubDomain=&SubDomain
 // 返回的resp是一个ModifyRecordResponse的实例,与请求对象对应
 _, err := client.ModifyRecord(request)
 if _, ok := err.(*errors.TencentCloudSDKError); ok {
  fmt.Printf("An API error has returned: %s", err)
  return false
 }
 if err != nil {
  fmt.Println("modify error",err.Error())
 }

本文由 mdnice 多平台发布

相关推荐

  1. golang监控IP变化自动同步dns

    2024-07-14 06:30:02       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 06:30:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 06:30:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 06:30:02       58 阅读
  4. Python语言-面向对象

    2024-07-14 06:30:02       69 阅读

热门阅读

  1. Unity脚步.txt

    2024-07-14 06:30:02       25 阅读
  2. React Native Android 应用开发、调试与发布深度指南

    2024-07-14 06:30:02       28 阅读
  3. 方差是什么?

    2024-07-14 06:30:02       20 阅读
  4. 【jvm】字符串常量池问题

    2024-07-14 06:30:02       25 阅读
  5. VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?

    2024-07-14 06:30:02       27 阅读
  6. 持续集成的自动化之旅:Gradle在CI中的配置秘籍

    2024-07-14 06:30:02       23 阅读
  7. C++:虚函数相关

    2024-07-14 06:30:02       28 阅读