家庭NAS——DDNS篇

家庭NAS最大的一個問題之一就是公網(wǎng)IP不固定,這個問題的解決方法很多蛆挫,如:
1.路由器刷固件赃承;
2.群暉:白群暉自帶內(nèi)網(wǎng)穿透,黑群暉就放棄這個方案吧悴侵;
3.花生殼/花生棒:支持各類操作系統(tǒng)平臺(路由器/Windows/Linux/群暉)瞧剖,缺點是需要花錢;
4.阿里云DDNS:強(qiáng)烈推薦可免;
5.騰訊云DDNS:推薦抓于,證書驗證不如阿里云方便。
6.ngrok等內(nèi)網(wǎng)傳統(tǒng)方案

我買了黑群暉巴元,家用路由器是小米的毡咏,所以對于我來說通過阿里云DDNS和騰訊云DDNS是最好的方案,我的域名是在阿里云上注冊的逮刨,所以呕缭,我直接采用了阿里云DDNS方案。

思路是:每隔一定時間獲取當(dāng)前的公網(wǎng)ip修己,把阿里云的域名解析地址更改為獲取到的公網(wǎng)ip

獲取公網(wǎng)IP

最直觀的獲取ip的方法是


百度

后續(xù)我們獲取到ip后可以跟此ip對比恢总,驗證是否正確

node 獲取ip方式有好多,我嘗試了public-ip睬愤、http 請求等方法

// npm install --save public-ip
const publicIp = require('public-ip');

publicIp.v4().then(ip => {
    console.log(ip);
    //=> '46.5.21.123'
});

很有意思的是我利用public-ip這個庫請求到的ip地址跟我百度的ip地址并不一樣片仿,這個問題我后續(xù)探究下

所以我直接使用http請求,獲取到用戶公網(wǎng)ip尤辱,代碼如下

    const http = require('http')
    // 獲取用戶公網(wǎng)ip
    const url = 'http://txt.go.sohu.com/ip/soip'
    http.get(url, res => {
      let data = ''
      res.on('data', chunk => data += chunk)
      res.on('end', () => {
        let m = data.match(/\d+\.\d+\.\d+\.\d+/g)
        if (m.length > 0) {
          console.log('myIP', m[0])
        }
      })
    }).on('error', e => console.log(`error messsage: ${e.message}`))

這樣獲取到的ip地址跟百度出來的ip地址是一樣的

修改阿里云域名解析

首先登錄阿里云獲取accessKeyId和accessKeySecret
獲取accessKeyId和accessKeySecret
域名解析文檔
使用阿里云npm庫@alicloud/pop-core進(jìn)行調(diào)用

// npm install @alicloud/pop-core --save
const Core = require('@alicloud/pop-core');
var client = new Core({
        accessKeyId: 'xxxxxxxx',
        accessKeySecret:  'xxxxxxxx',
        endpoint: 'https://alidns.aliyuncs.com',
        apiVersion: '2015-01-09'
      });

通過文檔我們可以發(fā)現(xiàn)砂豌,如果需要修改解析地址,我們需要用到被修改解析記錄的RecordId光督,
所以我們先獲取到RecordId

var params = {
      // 參數(shù)可根據(jù)自己需求去增加
      "RegionId": "cn-hangzhou",
      "DomainName": "baidu.com",
      "KeyWord": "A"
    }
    
    var requestOption = {
      method: 'POST'
    };
    
    client.request('DescribeDomainRecords', params, requestOption).then((res) => {
      console.log(JSON.stringify(res));
      if(res.DomainRecords.Record) {
        // 我修改的是根域名阳距,所以篩選了下
        let recordList = res.DomainRecords.Record.filter(item => {
          return item.Type === 'A'
        })
        let recordID = recordList[0].RecordId
        // 此處獲取到的就是RecordId,可根據(jù)自己需求修改邏輯
      } else {
        console.log('DomainRecords record is null')
      }
    }, (ex) => {
      console.log(ex);
    })

根據(jù)獲取到的RecordId將獲取到的公網(wǎng)ip賦值

var params = {
      "RegionId": "cn-hangzhou",
      "RecordId": recordID,
      "RR": "@",
      "Type": "A",
      "Value": myIP
    }
    
    var requestOption = {
      method: 'POST'
    };
    
    this.client.request('UpdateDomainRecord', params, requestOption).then((result) => {
      // console.log(JSON.stringify(result));
      console.log('修改成功结借,公網(wǎng)IP為', myIP)
    }, (ex) => {
      console.log(ex);
    })

以上就是修改ip的全過程筐摘,后續(xù)我們再利用node-schedule做個定時任務(wù)就可以了,整體代碼如下

const http = require('http')
const Core = require('@alicloud/pop-core');
const schedule = require('node-schedule');

class AliDDNS {
  constructor() {
    this.myIP = ''
    this.accessKeyId = ''
    this.accessKeySecret = ''
    this.domainName = ''
    this.KeyWord = '@'
  }

  init () {
    this.getIP()
    this.initCore()
    this.getDomainNameID()
  }

  getIP () {
    // 獲取用戶公網(wǎng)ip
    const url = 'http://txt.go.sohu.com/ip/soip'
    http.get(url, res => {
      let data = ''
      res.on('data', chunk => data += chunk)
      res.on('end', () => {
        let m = data.match(/\d+\.\d+\.\d+\.\d+/g)
        if (m.length > 0) {
          this.myIP = m[0]
          console.log('myIP', this.myIP)
        }
      })
    }).on('error', e => console.log(`error messsage: ${e.message}`))
  }

  initCore() {
      // 初始化 阿里云Core
      this.client = new Core({
        accessKeyId: this.accessKeyId,
        accessKeySecret: this.accessKeySecret,
        endpoint: 'https://alidns.aliyuncs.com',
        apiVersion: '2015-01-09'
      });
  }
  getDomainNameID() {
    if(!this.client) {
      console.error('client no init')
      return false
    }
    var params = {
      "RegionId": "cn-hangzhou",
      "DomainName": this.domainName,
      "KeyWord": this.KeyWord,
    }
    
    var requestOption = {
      method: 'POST'
    };
    
    this.client.request('DescribeDomainRecords', params, requestOption).then((res) => {
      console.log(JSON.stringify(res));
      if(res.DomainRecords.Record) {
        let recordList = res.DomainRecords.Record.filter(item => {
          return item.Type === 'A'
        })
        let recordID = recordList[0].RecordId
        this.changeDomainIP(recordID)
      } else {
        console.log('DomainRecords record is null')
      }
    }, (ex) => {
      console.log(ex);
    })
  }

  changeDomainIP(recordID) {
    var params = {
      "RegionId": "cn-hangzhou",
      "RecordId": recordID,
      "RR": "@",
      "Type": "A",
      "Value": this.myIP
    }
    
    var requestOption = {
      method: 'POST'
    };
    
    this.client.request('UpdateDomainRecord', params, requestOption).then((result) => {
      // console.log(JSON.stringify(result));
      console.log('修改成功船老,公網(wǎng)IP為', this.myIP)
    }, (ex) => {
      console.log(ex);
    })
  }
}

const aliDDns = new AliDDNS()

// 每五分鐘更新一次ip
schedule.scheduleJob('0 5 * * * *', ()=>{
  aliDDns.init()
})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咖熟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柳畔,更是在濱河造成了極大的恐慌馍管,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薪韩,死亡現(xiàn)場離奇詭異咽斧,居然都是意外死亡堪置,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門张惹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舀锨,“玉大人,你說我怎么就攤上這事宛逗】材洌” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵雷激,是天一觀的道長替蔬。 經(jīng)常有香客問我,道長屎暇,這世上最難降的妖魔是什么承桥? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮根悼,結(jié)果婚禮上凶异,老公的妹妹穿的比我還像新娘。我一直安慰自己挤巡,他們只是感情好剩彬,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矿卑,像睡著了一般喉恋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上母廷,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天轻黑,我揣著相機(jī)與錄音,去河邊找鬼琴昆。 笑死氓鄙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椎咧。 我是一名探鬼主播玖详,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼把介,長吁一口氣:“原來是場噩夢啊……” “哼勤讽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拗踢,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤脚牍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后巢墅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诸狭,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡券膀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驯遇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芹彬。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叉庐,靈堂內(nèi)的尸體忽然破棺而出舒帮,到底是詐尸還是另有隱情,我是刑警寧澤陡叠,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布玩郊,位于F島的核電站,受9級特大地震影響枉阵,放射性物質(zhì)發(fā)生泄漏译红。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一兴溜、第九天 我趴在偏房一處隱蔽的房頂上張望侦厚。 院中可真熱鬧,春花似錦昵慌、人聲如沸假夺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已卷。三九已至,卻和暖如春淳蔼,著一層夾襖步出監(jiān)牢的瞬間侧蘸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工鹉梨, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留讳癌,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓存皂,卻偏偏與公主長得像晌坤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旦袋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361