专栏首页Ar-Sr-Na【DNS 解析】使用DNSPOD实现动态公网解析(DDNS)
原创

【DNS 解析】使用DNSPOD实现动态公网解析(DDNS)

注:本文用到的所有代码已开源:https://arsrna.coding.net/public/website-mainsite/ArSrNaDDNS/git/

安装请参考上页面的README.md

前言

背景

家里或者公司分配了一个公网IP,但它每过1周就变了,如果我要用它远程桌面,意味着一周就要改一次IP,记一个新的IP,非常复杂,该如何用一个固定的地址来替代这些变化的IP并且实现定时自动替换呢?

亦或者我有一台腾讯云按量付费的CVM,如果我选择关机不计费时,再次开机IP就变了。虽然可以通过购买EIP来固定这个地址,但是成本稍微高了。替代的办法就是动态解析,用一个别名代替变换的IP

而如上,别名就是域名,用一个固定的域名,解析到这些IP,即可实现DDNS

原理

基本流程就是获取公网IP,然后修改某个域名的解析为获得的IP

流程图如下

教程

准备

环境

需要下载Nodejs:Node.js 中文网 (nodejs.cn)

在命令行运行

node-v

以及

npm -v

如果都能正常输出即可

新建项目

新建一个文件夹,名字任意

然后新建一个js,名称任意,但最好纯英文,例如 index.js

获取公网IP

在这里,我们使用npm模块:nodejs-publicip

首先在项目目录执行

npm i --save nodejs-publicip

在index.js中加入:

const PublicIp = require('nodejs-publicip');

根据这个npm包的说明,知道获取公网的方法为:

new PublicIp()
    .queryPublicIPAddresses()
    .then((result) => {
        console.log(JSON.stringify(result));
        //成功回调事件
    })
    .catch((err) => {
        console.log(err);
    });

如果获取成功了,将会输出:

{"ipv4":"124.000.000.000","ipv6":"0000:0000:0000:0000:0000"}

DNSPodSDK

流程

根据官网API文档,可以知道,设置解析必须要这几个参数

参数名称

必选

类型

描述

Domain

String

域名,这里举例:arirs.cn

RecordType

String

记录类型,A为IPv4,AAAA为IPv6

RecordLine

String

记录线路,使用“默认”

Value

String

记录值,这里是公网IP值,为上面的函数返回值 getIP().ipv4

RecordId

Integer

记录 ID,需要通过DescribeRecordList获取

SubDomain

String

主机记录,子域名,比如ddns1,就是ddns1.arirs.cn

TTL

Integer

TTL,免费版默认600s

在上表中,可以直接得到的信息除了RecordId,其它都可以直接从控制台得到

RecordId需要另一个API获得:DescribeRecordList

这个API只需要传入:Domain,Subdomain 即可获得

那么,我们的流程将会是如此

获取RecordId

首先需要在域名解析控制台处新建一个域名解析记录,可参考

DNS 解析 DNSPod 快速添加域名解析-快速入门-文档中心-腾讯云-腾讯云 (tencent.com)

添加的记录先用一个 0.0.0.0占用,比如

在API Explorer DNSPod修改解析方法下 API Explorer - 云 API - 控制台 (tencent.com)

填写以下参数

参数

说明

Domain

域名,比如 arirs.cn

Subdomain

子域名解析记录,上图表示的是 ddns1

完成后在 在线调用 处点击 发送请求

即可获得RecordId

使用SDK修改解析

在项目目录里面打开终端,键入

npm i --save tencentcloud-sdk-nodejs-dnspod

安装腾讯云的Nodejs SDK

在API Explorer的 修改记录(DNSPOD) 点此进入 里面,按照上文的参数,输入进去

切换到代码生成这一栏,选择Nodejs

把代码复制下来,除了第一行原来的引用要换为

const tencentcloud =require("tencentcloud-sdk-nodejs-dnspod");

那么代码就是

const clientConfig = {
  credential: {
    secretId: "SecretId",
    secretKey: "SecretKey",
  },
  region: "",
  profile: {
    httpProfile: {
      endpoint: "dnspod.tencentcloudapi.com",
    },
  },
};

const client = new DnspodClient(clientConfig);
const params = {
    "Domain": "你的域名",
    "SubDomain": "你的子域名",
    "RecordType": "A",
    "RecordLine": "默认",
    "Value": ip,
    "TTL": 600,
    "RecordId": 你所获取到的ID
};
client.ModifyRecord(params).then(
  (data) => {
    console.log(data);
  },
  (err) => {
    console.error("error", err);
  }
);

根据文档,把代码修改成自己的参数

然后封包为方法,方便调用

function changeIP(ip){
const clientConfig = {
  credential: {
    secretId: "SecretId",
    secretKey: "SecretKey",
  },
  region: "",
  profile: {
    httpProfile: {
      endpoint: "dnspod.tencentcloudapi.com",
    },
  },
};

const client = new DnspodClient(clientConfig);
const params = {
    "Domain": "你的域名",
    "SubDomain": "你的子域名",
    "RecordType": "A",
    "RecordLine": "默认",
    "Value": ip,
    "TTL": 600,
    "RecordId": 你所获取到的ID
};
client.ModifyRecord(params).then(
  (data) => {
    console.log(data);
  },
  (err) => {
    console.error("error", err);
  }
);
}

在上面获取IP那部分将回调设置为调用这个函数即可

new PublicIp()
    .queryPublicIPAddresses()
    .then((result) => {
        changeIP(result.ipv4)
    })
    .catch((err) => {
        console.log(err);
    });

到这里,就算完成这一流程了

可以运行一下看下结果

node index.js

出现类似这样的就是成功了

总代码

const PublicIp = require('nodejs-publicip');
// Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher
const tencentcloud = require("tencentcloud-sdk-nodejs-dnspod");
const DnspodClient = tencentcloud.dnspod.v20210323.Client;

new PublicIp()
    .queryPublicIPAddresses()
    .then((result) => {
        changeIP(result.ipv4);
    })
    .catch((err) => {
        console.log(err);
    });


function changeIP(ip){
const clientConfig = {
  credential: {
    secretId: "替换为你的secretId",
    secretKey: "替换为你的secretKey",
  },
  region: "",
  profile: {
    httpProfile: {
      endpoint: "dnspod.tencentcloudapi.com",
    },
  },
};

const client = new DnspodClient(clientConfig);
const params = {
    "Domain": "你的域名",
    "SubDomain": "子域名",
    "RecordType": "A(IPV6为AAAA)",
    "RecordLine": "默认",
    "Value": ip,
    "TTL": 600,
    "RecordId": 替换成你的Recordid
};
client.ModifyRecord(params).then(
  (data) => {
    console.log(data);
  },
  (err) => {
    console.error("error", err);
  }
);
}

代码可以前往

自动化

现在已经可以通过命令行

node index.js

来运行这个程序了

那么就把他打包为cmd

Windows中每周执行一次

可参考文章:windows设置定时任务执行程序命令_13271972的技术博客_51CTO博客

Nodejs原生循环执行

如果你的业务场景很复杂,需要几分钟就变一次解析(而且你的套餐TTL很短)的情况下,建议直接使用setInterval定时器来进行操作

只需要在PublicIP这个方法前后包裹一个SetInterval

setInterval(function(e){
  new PublicIp()
    .queryPublicIPAddresses()
    .then((result) => {
        changeIP(result.ipv4);
    })
    .catch((err) => {
        console.log(err);
    });
},600000) //这里的数字是定时器的速度,单位毫秒,也就是多少毫秒执行一次

再次运行 node index.js 即可

到此,教程就结束了,更多可能,需要我们一起探索

Powered by Ar-Sr-Na

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • 【Python】实现DDNS 动态解析到阿里

    DDNS(Dynamic Domain Name Server,动态域名服务)是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端...

    杨丝儿
  • 一文搞懂“如何通过群晖+DNSPod DDNS搭建私有云服务?”

    DNSPod春节特惠3折起 买解析就送CDN,最高60TB CDN让你带回家 ??购买入口 ---- 近期很多DIY私有云玩家私聊D妹“我想在外网访问家庭网络,...

    腾讯云DNSPod团队
  • 基于python利用腾讯云API Explorer实现家用宽带的动态DNS解析

    先介绍了应用背景:用来使得域名能够正确对应上动态IP。然后介绍了完成这项功能需要用到的API接口,并简单实现了对应的API接口调用框架。最后为了使用更加简洁,对...

    EatRice
  • ddns动态域名解析服务之dnspod与花生壳的区别

    自从04年开始接触了做网站,就了解到了花生壳,可以说是一个老牌的内网穿透服务提供商。

    风吹屁屁凉
  • 树莓派用IPV6拯救电信大内网(全版本)

    想起来我已经好久没有写文章了,于是来水一篇,因为这几天一直在研究废物利用,啊呸,一直在研究怎么把我吃灰的树莓派4B合理的运用起来,可是一时间居然想不起来该拿来干...

    卜露
  • 群晖增加多个dnspod自定义解析的方法

    这里的ddns_provider.conf文件,就是我们为了增加dnspod的自定义ddns解析要修改的文件。

    风吹屁屁凉
  • 利用bind实现内网域名解析走内网默认dns,其他域名解析走公网公共dns或自建dns

    云平台不允许私搭公网dns,得确保自己搞了dns服务后,公网不能访问53端口才行,因此有必要一开始就在安全组限制公网53端口,只放行内网53端口,安全组参考下图

    shawyang
  • 一文搞懂常用的网络概念:域名、静态IP和动态IP、域名解析DNS、动态域名解析DDNS

    在此之前,我对于网络通讯上的一些基础概念总是含糊其辞,感觉自己知道都又道不出个所以然,总之就是不成体系难以有个整体的把握。因此有了本文,目的是对一些平时颇为关注...

    YourBatman
  • 一文搞懂常用的网络概念:域名、动态IP、DNS、DDNS

    在此之前,我对于网络通讯上的一些基础概念总是含糊其辞,感觉自己知道都又道不出个所以然,总之就是不成体系难以有个整体的把握。因此有了本文,目的是对一些平时颇为关注...

    YourBatman
  • openwrt路由器(小米路由)实现自定义DDNS(动态域名解析)

    转自(https://www.pocketdigi.com/20181009/1626.html)

    ._1545
  • 使用 DNSPod 公共解析服务实现家庭网络净化

    1、登录 DNSPod 控制台,功能菜单中依次点击 公共解析、我的配置 进入公共解析控制台。若没有账号,请点击下方链接免费注册:https://www.dnsp...

    若海
  • 域名、解析、证书、备案等产品常见问题

    请参考关于腾讯云免费SSL证书在IIS部署中提示 " 证书链中的一个或多个中间证书丢失 " 的解决办法

    Im小泽
  • dnspod通过接口解析本地ip python脚本

    最近内网搭建了一台gitlab服务器,因为是内网没有公网ip,为了方便同事访问,dnspod直接解析了内网ip 但是网卡使用的是dhcp的获取ip的,每次关机...

    开心分享
  • 免费的动态域名解析(ddns)的申请

    ddns,又称动态域名解析,适用于没有固定IP的网络,通过ddns,即动态域名解析,

    风吹屁屁凉
  • 【DNS解析】如何设置DDNS(动态域名解析)

    1、登录OpenWrt,找到系统(System)→软件包(Software),将下方软件包的地址放入从网络安装的输入框中,点击确认(ok)完成安装。 ipk安装...

    Im小泽
  • 如何组建高效的家庭网络

    在“为什么家里要有公网IP”一文中已经简要的说明了一下网络环境对于NAS的重要性,这里专门就此问题展开讨论。

    ZONGLYN
  • 我是如何在两天内做完一个网站的

    有点标题党的嫌疑,不过确实网站的主体是在两天内的完成的,后面只是抓取了素材和完善细节。以下内容绝对是赤裸裸的干货。

    lyb-geek
  • 如何使用 Zero 自己搭建机房

    第一步,首先要确认你安装的网线是否有公网IP,大部分情况下安装网线是没有公网IP的.怎么判断自己是否有公网IP?主要是通过百度"IP",然后记录搜索到公网IP,...

    大发明家

扫码关注云+社区

领取腾讯云代金券