網域在 Google domains 上購買有提供 DNS 代管服務,本網站的主機是使用樹梅派架設 LEMP,對外中華電信光纖上網只有一個固定IP,使用浮動IP來對外服務每72小時就會中斷一次。
要確保網站可以提供長期服務,當偵測到IP有所變化就會自動更新主機位置給 Google 的動態 DNS,讓全世界的人都可以正確地連入 Server 。
設定Google 動態 DNS
登入 Google Domains 管理介面 會看到以下畫面,選 DNS 頁籤進入設定畫面。
在右側設定框中會看到設定 綜合紀錄 將下拉式選單選到 動態DNS ,並在下拉選單右側填入網域名稱,完成後按下新增,示範內容是 test 請根據實際內容填寫。
下方會出現設定的動態DNS網域資料欄是空白 0.0.0.0 代表尚無設定資料,點擊紅框中的查看憑證。
使用者名稱及密碼的內容會轉呈明碼,這兩個值用來變更網域的資料把值抄下。
此內容切記勿公開在網路上任何地方,一旦公開有心人是可以直接變更指向的站台造成訪問者的風險。
將上方的三個取得的使用者名稱、密碼及網域填入下方腳本。
Shell 腳本
將腳本放入主機中修改檔案中的三個參數,username、API_key 和 domain,並更改腳本執行設定執行權限為 755。
#!/bin/bash
#Raspberry PI 開機後自動更新 Google Domains
# v1.0.0 BY CJK https://www.cjkuo.net/
#設定檔
username="填入使用者名稱"
API_key="填入密碼"
domain="填入網域"
#更新網域IP
set_pppoe(){
#比對目前記錄
pppoe_ip="$(ip address show ppp0 | grep inet |awk '{print $2}')"
dns_A_record=$(dig -t A +short "$domain")
if [ "$dns_A_record" != "$pppoe_ip" ]; then
#不同需更新
curl -X POST "https://$username:$API_key@domains.google.com/nic/update?hostname=$domain&myip=$pppoe_ip"
fi
}
while [ "$(ip addr show ppp0 2>&1 | grep -c inet)" = "0" ]
do
# PPPoe 撥號尚未完成
sleep 2
done
set_pppoe
執行腳本
手動執行腳本 IP 有變更會出現 Good ,沒有變更IP會回應 nochg。
XXX@XXX$ ./set_domains_test.sh
good 36.XX.XX.146
XXX@XXX$ ./set_domains_test.sh
nochg 36.XX.XX.146
更新完成後可以在Google 動態 DNS看到資料欄位出現主機 IP,DNS 紀錄會同步到全球。
設定開機執行
需要更新紀錄時手動執行,也可以設定開機執行腳本會自動更新DNS紀錄。
設定開機執行腳本請參考文章”使用 Systemd 開機自動執行腳本,棄用 rc.local“