
使用 DNS 名稱搭配固定 IP,將服務對外提供或者是方便管理者連線是一種很常見的措施,但中小企業因為經費考量,沒有申請固定 IP 線路而只有浮動 IP 時該怎麼處理呢?
即便使用了浮動制 IP 所提供的一個偽固定 IP (例如中華電信的 HN編號@ip.hinet.net 帳號) 方式,仍然可能遇到一段時間後變更等等的情況。
最近我接下一家新創企業的資訊顧問,衍生了經常需要遠端連入處理資訊基礎架構的狀況,面對 PPPoE 可能變動 IP 的狀況,因此寫下了這篇心得與 Script 指令稿。
尋找服務
在網路上有許多服務商提供了免費的 DDNS (Dynamic Domain Name Service,動態網域名稱服務),讓我們可以申請後使用:



除了申請好服務,裝置端也要能支援使用才可以經常更新對應的 IP,而這些裝置又需要支援上述的服務商,若裝置不支援則無法啟用。
裝置端可以在電腦上執行這些服務商提供的工具軟體,定時檢測 IP 異動並更新 DDNS 名稱對應,或者是購買有內建 DDNS 更新的 Router、NAS... 等裝置,即可完成這些工作。
但是,如果我沒有購買支援的裝置,或者我想要自己更深入控制及整合服務,還有那些選擇?
解決方案
由於這個客戶所使用的路由器與防火牆沒有支援 DDNS 服務商的功能,也沒有固定 IP 可以使用,於是我採用了台灣在地廠商 裕笠科技 (UBLink) 所提供的 UBDdns 服務,不僅免費,而且 API 使用也相當簡單。更重要的是,裕笠科技跟我一樣都是台中在地廠商,當然要大推 (笑)。

請先至 UBDdns 服務申請好一組帳號,再建立一組網域名稱:

至此,申請的相關作業已經完成。
撰寫程式
接著,我在 Proxmox VE 虛擬化平台上建立一個 LXC 客體容器,撰寫一支 Script,每隔 30 分鐘檢測目前連外 IP,並用來與 UBDdns 域名比對是否相符,若不相符合即啟動 DDNS IP 更新。

我已放置在我的 GitHub 存放庫,請至文末的連結下載並放置到 /opt/renew_ubddns.sh,或者使用以下指令直接取得:
# 下載指令稿
cd /opt
wget https://raw.githubusercontent.com/jasoncheng7115/it-scripts/master/ubddns/renew_ubddns.sh
# 設定執行權限
chmod +x /opt/renew_ubddns.sh
再以文字編輯器 (如 nano、vi 等) 請變更檔案裡面的 DDNSNAME、DDNSID、DDNSPW 變數內容,填入您在 UBDdns 服務上所使用的網域名稱、帳號以及密碼,退出後可以立即執行看看結果。
執行成果
執行後的各種結果如下,圖中的 IP 為範例,請忽略之。


另外,考量到日後會自動會執行的需求,我也將相關結果寫入系統的 syslog 記錄裡,方便事後追查成功或失敗,進一步還可以搭配 LibreNMS 或 Graylog 做為告警的條件使用。

排程運作
若上述的設定與執行都正確沒有問題,我們可以將它設定為自動執行的排程,以確保 DDNS 對應的 IP 可以保持在最新的狀態。
而為了避免監測過於頻繁,導致 config.me 以及 ubddns.org 服務過忙,或是防火牆等設備誤判為異常行為,我將排程設為每半小時執行一次。

我已經預先寫好排程工作的內容,可以直接使用下列指令完成設定。
# 下載指令稿
cd /etc/cron.d
wget https://raw.githubusercontent.com/jasoncheng7115/it-scripts/master/ubddns/renew_ubddns
完成設定後,可以檢視系統記錄檔確認是否有正確執行,指令為 tail /var/log/messages。

註:
上圖中的時間有非 00 分及 30 分執行的結果,是我有手動執行的原因,實際上只應該出現在 00 分及 30 分的執行結果。
參考資料
- Free dynamic DNS service | Dynu Systems, Inc.
https://www.dynu.com/ - Free Dynamic DNS - No-IP
https://www.noip.com/ - FreeDNS - Free DNS - Dynamic DNS
https://freedns.afraid.org/ - UBDdns.org Dynamic Domain Name
http://ubddns.org/ - 裕笠科技
http://www.ublink.org/ - it-scripts/ubddns at master · jasoncheng7115/it-scripts
https://github.com/jasoncheng7115/it-scripts/tree/master/ubddns

