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