腾讯云DNSPOD域名动态解析实现

腾讯云DNSPOD域名动态解析实现

月光魔力鸭

2022-04-10 00:25 阅读 104 喜欢 0

最近一直在围绕着我的小电脑在转,基本都是这方面的问题。在没有公网IP的情况下,这个问题就是我怎么才能通过域名访问到我家中的服务器。

场景

有自己的云服务器(没有也行)、有域名、有一个独立ip (虽然可能会变)、家里有服务器或办公室(但能上网)。

目标

通过域名访问到在内网服务器部署的项目。 我这边的场景是服务器通过wifi连接路由器,路由器连接光猫,光猫是花钱找人破解做的桥接,这样基本全都是托管给了我的路由器来管理,同时在百度ip 可以得到一个ip地址

自己有几个域名,现在想在不通过穿透的情况下实现外网访问(当然穿透相对可能更简单些,但是需要依托云服务器,并受限于云服务器)

思路

其实,这里还有一个很小的问题,但是强迫症受不了.. 我就是不想带端口号(因为联通、电信都屏蔽了 80 443 端口,无法直接进行这几个端口的转发,导致在通过ip 或 域名访问的时候都是带着端口的..哎,我就不想带--这个问题放在最后)

方法及方案

光猫破解

额,这个可以自己研究,当然有时间折腾还是自己研究比较好玩,不过据说可能会有风险,我是直接淘宝找的大神破解的,几十块钱直接搞定,中间一顿操作,我也没看懂。

IP地址解析

这篇文章着重说的就是这个问题,监听并动态修改解析记录,话不多说,直接上代码。


/**
 * 域名动态解析
 * 由于IP地址会经常变化,所以这里做一个定时器,每隔几分钟就做一次ip检查,如果发现不一致,则进行动态解析变更。
 */

const tencentcloud = require("tencentcloud-sdk-nodejs");
let axios = require('axios');
let dns = require('dns');
let config = require('./config');
let spwan = require('child_process').spawn;
const DnspodClient = tencentcloud.dnspod.v20210323.Client;

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

const client = new DnspodClient(clientConfig);
const params = {};


/**
 * 获取域名解析记录
 * @param {String} name 域名
 * @returns 
 */
function getRecordList(name) {
  return new Promise((r, j) => {
    client.DescribeRecordList({
      Domain: name
    }).then(rs => {
      r(rs.RecordList);
    }, err => {
      j(err);
    })
  })
}
function getIp(domain) {
  return new Promise((r, j) => {
    dns.lookup(domain, (err, ip, family) => {
      if (err) j(err);
      r(ip);
    })
  })
}
/**
 * 修改解析记录
 * @param {Object} rec 原有的数据
 * @param {String} newip 新IP
 */
function modifyRecord(rec,domain,newip) {
  return new Promise((r, j) => {
    client.ModifyRecord({
      Domain: domain,
      RecordType: rec.Type,
      RecordLine: rec.Line,
      Value: newip,
      RecordId: rec.RecordId,
      SubDomain : rec.Name
    }).then(rs => {
      r(rs.RecordList);
    }, err => {
      j(err);
    })
  })
}

//测试
(async function () {

  //检查当前IP与现有IP是否一致
  let iprs = await axios.get('https://api.ipify.org/?format=json').then(rs => rs.data);
  let ip = iprs.ip;//现有IP地址
  //获取目标网站的地址信息,指定一个即可
  let nowIp = await getIp(config.testDomain);
  if (ip == nowIp) {
    console.info(`${new Date()}: 当前IP无变化`);
    process.exit(0);
  } 
  let msg = `${new Date()} : 当前ip发生变更,原有IP : ${nowIp} ,新的IP : ${ip}`;
  console.info(msg)
  //钉钉通知我
  //此处是我服务器有一个自己的工具notify,可以直接给我钉钉发消息,可以自行实现或删除
  spwan('notify', [msg]);
  let domain = config.domain;
  let recList = await getRecordList(domain);
  for (let rec of recList) {
    if (config.watch[rec.Name]) {
      //修改
      await modifyRecord(rec, domain ,ip);
    }
  }

  process.exit(0);

})();

以下为config.js 内容:

module.exports = {
 //id 和 key 去腾讯申请即可
  secretId: '1',
  secretKey: '2',
//目前主要是针对一个域名做处理,domain主域名
  domain: 'domain.com',
//二级域名,用来判断是否产生变化
  testDomain: 'test.domain.com',
  //监听二级域名前缀 test.domain.com site.domain.com 等等
  watch: {
    'test' : '主机连接使用SSH'
  }

}

之后做一个crontab定时器,每10分钟检查一次:

crontab -e
*/10 * * * * node /home/chrunlee/data/code/dnswatch/app.js >> /home/chrunlee/data/code/dnswatch/log.txt 2>&1

最后,说下关于端口的问题,其实很简单,做个中转 。 举例说明: test.domain.com:10010 该地址可以正常访问服务器的项目 如果想不带端口,那么我们可以做一个隐性URL .

test2.domain.com 隐性URL 指向 http://test.domain.com:10010 ,这样在访问 test2.domain.com的时候等于访问了 test.domain.com:10010 ,端口就不显示了..

转载请注明出处: https://chrunlee.cn/article/nodejs-tencent-dnspod.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
从上面那篇文章过来的,这里分享下nodejs对文件夹以及子文件进行批量删除的实现。
使用nodejs连接ftp,进行ftp的操作,包括列表、上传、下载以及速率等。
通过pm2来实现nodejs应用的集群,不过我之前没做session共享,导致.. 登录不上啊 啊啊啊,无奈,又重新对redis进行了集成。
最近由于系统需要一些数据进行测试,但是正常的流程都是下载pdf ,打印pdf,然后通过涂写答题卡,将涂写的扫描上传..太麻烦了,想做成简单点,通过程序直接生成..卡在了pdf转图片上,今天抽空找了下库,通过gm可以将pdf转为图片,起码第一步已经实现了,后边的涂学号之前已经做过了。
之前在知乎上有看到,基本上都是一致的,这里提供一个nodejs版本的针对微信内dat文件进行处理恢复为图片的方法。
在公司报销的时候虽然已经有了电子发票,但是贴票还是需要将发票打印出来贴上,如果只有一两张也就算了,如果几十张.. 呵呵,光胶水我都不够用的,找了好多工具、在线版本都不合心意,烦死,自己做个自己喜欢的吧。
通过nodejs来进行爬取页面的内容,这里简单试试做个小任务..
我们项目一直在使用puppeteer 生成pdf ,整体的思路是没有问题的,而且在开发环境运行了好久了,但是部署后总会有各种各样的报错。各种so文件找不到等等 。