天天看點

在光貓/軟路由上使用 Cloudflare 的動态域名

作者:區塊軟體開發

相信很多小夥伴對于動态域名已經很熟悉了,大多數光貓/路由器也都内置了 DDNS 功能。但是在使用過程中,好像總是有點掣肘,例如一些早期的光貓/路由器提供的 DDNS 功能隻支援更新 IPv4 位址,由于移動寬帶隻提供公網的 IPv6 公網位址,DDNS 功能會無法使用。是以在兩年前,我就寫了兩段簡單的 DDNS 更新腳本,使用 DnsPod.cn 或 dynv6.com 動态域名完成 IPv4&IPv6 位址的更新。

現在看來,使用 DnsPod.cn 或 dynv6.com 動态域名仍然有一些不完美的地方,由于三大營運商都關閉了家庭寬帶的 80 & 443 端口,如果想利用家庭寬帶搭建一個 Blog ,或者将自己群晖裡的内容分享給其他朋友使用時,總要在網址後面帶上端口才可以通路。如果使用 Cloudflare.com 的動态域名,另外配合 Cloudflare Origin Rules 功能,即可完美解決上述問題。

一、擷取域名的 Zone ID 和 API 令牌

1、登入 Cloudflare.com ,點選域名,我以 ifeng.xyz 這個域名為例。

在光貓/軟路由上使用 Cloudflare 的動态域名

2、Copy 頁面右下角的“區域 ID” ( Cloudflare_Zone_ID )備用,然後點選“擷取您的 API 令牌” ( Cloudflare_API_Tokens ) 。

在光貓/軟路由上使用 Cloudflare 的動态域名

3、點選“建立令牌”。

在光貓/軟路由上使用 Cloudflare 的動态域名

4、将頁面拉到底部,點選“建立自定義令牌”。

在光貓/軟路由上使用 Cloudflare 的動态域名

5、如下圖所示填入令牌名稱,例如我填入了“dynamic”;權限選擇 “區域” -> “DNS” ->“編輯” ;區域資源選擇 “包含” -> “特定域名” ->“自己的域名(例如我選擇 ifeng.xyz )” ,最後點選頁面底部的“繼續以顯示摘要”。

在光貓/軟路由上使用 Cloudflare 的動态域名

6、點選“建立令牌”。

在光貓/軟路由上使用 Cloudflare 的動态域名

7、Copy “API 令牌” ( Cloudflare_API_Tokens )備用 。

在光貓/軟路由上使用 Cloudflare 的動态域名

二、登入光貓/軟路由安裝 DDNS 更新腳本

ddns_update.sh 腳本中有關 Cloudflare 域名記錄更新的代碼為 update_IP 函數中 24 行代碼,其他代碼主要用于擷取光貓/軟路由的公網 IPv4/IPv6 位址,同時檢測 IP 位址是否發生變化,然後調用 update_IP 函數更新。如果對于特定的光貓/軟路由,代碼會寫的更簡單一些,例如使用類似“ip -6 addr list scope global pppoe | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p' | head -n 1”這樣的指令來擷取本機的 IPv6 位址,但是不同品牌的光貓/路由器由于固件版本不同,在建立 pppoe 連結後 interface 名稱有所差別,為了腳本的通用性,這種方法不能使用,是以代碼中的處理邏輯相對來說更複雜一點。當然,你可以根據自己光貓/路由器的情況自行修改代碼,讓代碼更加簡單高效。例如可以使用 /etc/ppp/ipv6-up 來啟動腳本,來減少循環檢測 IP 位址是否發生變化對系統資源的占用。

1、下載下傳并安裝 DDNS 更新腳本,以 EdgeMAX EdgeRouter ER-X 路由器為例。

項目位址:https://github.com/hiifeng/Dynamic-DNS-using-Cloudflare

在上述位址下載下傳 ddns_update.sh ,使用 WinSCP 等 ftp 工具将腳本上傳到 /usr/local/ 目錄中。

2、使用 ssh 登入光貓/軟路由

Bash

# 切換到 root 使用者
sudo -i
# 增加可執行屬性
chmod a+x /usr/local/ddns_update.sh
# 修改 ddns_update.sh 檔案中的相關參數,其中包含 Cloudflare_Zone_ID 、Cloudflare_API_Tokens 和你需要解析的域名(例如:ddns.ifeng.xyz)
sed -i "s/type in zoneID/此處填入上面擷取的Cloudflare_Zone_ID/g" /usr/local/ddns_update.sh
sed -i "s/type in token/此處填入上面擷取的Cloudflare_API_Tokens/g" /usr/local/ddns_update.sh
sed -i "s/ddns.example.com/你的域名/g" /usr/local/ddns_update.sh
# 修改作業系統 /etc/rc.local 檔案,當光貓/軟路由開機或重新開機時,自動執行 ddns_update.sh
sed -i 's/^exit 0$/bash \/usr\/local\/ddns_update.sh\n\nexit 0/' /etc/rc.local           

BASH

3、重新開機光貓/軟路由使其生效。

三、注意事項

Cloudflare API 不支援對 .cf, .ga, .gq, .ml, .tk 域名的更新。