使用 DNS 名稱搭配固定 IP,將服務對外提供或者是方便管理者連線是一種很常見的措施,但中小企業因為經費考量,沒有申請固定 IP 線路而只有浮動 IP 時該怎麼處理呢?
即便使用了浮動制 IP 所提供的一個偽固定 IP (例如中華電信的 HN編號@ip.hinet.net 帳號) 方式,仍然可能遇到一段時間後變更等等的情況。
最近我接下一家新創企業的資訊顧問,衍生了經常需要遠端連入處理資訊基礎架構的狀況,面對 PPPoE 可能變動 IP 的狀況,因此寫下了這篇心得與 Script 指令稿。
尋找服務
在網路上有許多服務商提供了免費的 DDNS (Dynamic Domain Name Service,動態網域名稱服務),讓我們可以申請後使用:
Dynu DNS
No-IP
FreeDNS
除了申請好服務,裝置端也要能支援使用才可以經常更新對應的 IP,而這些裝置又需要支援上述的服務商,若裝置不支援則無法啟用。
裝置端可以在電腦上執行這些服務商提供的工具軟體,定時檢測 IP 異動並更新 DDNS 名稱對應,或者是購買有內建 DDNS 更新的 Router、NAS... 等裝置,即可完成這些工作。
但是,如果我沒有購買支援的裝置,或者我想要自己更深入控制及整合服務,還有那些選擇?
解決方案
由於這個客戶所使用的路由器與防火牆沒有支援 DDNS 服務商的功能,也沒有固定 IP 可以使用,於是我採用了台灣在地廠商 裕笠科技 (UBLink) 所提供的 UBDdns 服務,不僅免費,而且 API 使用也相當簡單。更重要的是,裕笠科技跟我一樣都是台中在地廠商,當然要大推 (笑)。
UBDdns
請先至 UBDdns 服務申請好一組帳號,再建立一組網域名稱:
建立一筆網域名稱
至此,申請的相關作業已經完成。
撰寫程式
接著,我在 Proxmox VE 虛擬化平台上建立一個 LXC 客體容器,撰寫一支 Script,每隔 30 分鐘檢測目前連外 IP,並用來與 UBDdns 域名比對是否相符,若不相符合即啟動 DDNS IP 更新。
撰寫更新 UBDdns IP 指令稿
# 下載指令稿 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 為範例,請忽略之。
IP 未異動,不需變更
另外,考量到日後會自動會執行的需求,我也將相關結果寫入系統的 syslog 記錄裡,方便事後追查成功或失敗,進一步還可以搭配 LibreNMS 或 Graylog 做為告警的條件使用。
syslog 事件顯示案例
排程運作
若上述的設定與執行都正確沒有問題,我們可以將它設定為自動執行的排程,以確保 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