NodeJS + Aliyun 實現 DDNS

靈魂腹肌貓發表於2018-01-04

DDNS,即動態DNS,簡單來說就是伺服器的 IP 地址經常變動,這個時候需要一個主動上報的服務來更新 DNS 的解析記錄,保證域名指向正確的 IP 地址。

比如在自己家中的樹莓派上部署了某些服務,且路由器有公網 IP,由於每次重新撥號,公網 IP 都會變,所以想要根據域名去訪問樹莓派,必須做 DDNS。

DDNS 可以選擇 花生殼,但是花生殼提供的 DDNS 服務無法自定義域名,配置起來也較為麻煩,所以這裡用 NodeJS 來實現一個 DDNS 服務。

原始碼地址(https://github.com/luoye-fe/aliyun-ddns)

原理

  • 定期獲取本機公網 IP

  • 比對當前 DNS 解析記錄

  • 如果不一致,呼叫阿里雲的 API 更新 DNS 記錄

相關資料

實現

獲取公網 IP

訪問 http://ifconfig.me/ip 獲取本機外網 IP,注意需偽造 UA,不然403

阿里雲 API 介面鑑權

比較複雜,也比較坑爹,具體實現可以看放出的 git 原始碼

  • 把所有請求引數按順序序列化

  • 把所有請求引數拼接成 encodeURIComponent(key)=encodeURIComponent(value)&encodeURIComponent(key)=encodeURIComponent(value) 的形式得到 signStr

  • 拼接字串,[請求方式]&encodeURIComponent(`/`)&[signStr],如 GET&%2F&[signStr]

  • HMAC SHA1 加密,加密的 key 為 [AccessKeySecret]&,注意最後的 &

獲取當前解析記錄

DescribeSubDomainRecords

具體看文件

更新或新增解析記錄

根據當前解析記錄的狀態來確定是更新還是新增解析記錄

AddDomainRecord UpdateDomainRecord

定時執行

使用的 node-schedule

服務常駐

使用的 pm2

原文地址

相關文章