由於 CNAME 與任何記錄都衝突的特性,在根域(@)下添加 CNAME 記錄指向 CDN(或其他服務)會導致 mx(郵箱記錄)、TXT(一些站長驗證)、DS 等常用記錄衝突等且多級 CNAME 會導致解析性能下降等問題,所以拉平是一個很不錯的解決方案。但目前 DNSPod 並沒有提供拉平的功能,所以需要自己寫腳本調用 API 實現。(本文以腾讯云 CDN 為例,但是其他 CDN 服務商也可以使用,替換腳本裡面的 CNAME 域名即可。)

PS:自2019年1月接觸互聯網行業以來一直在做運營相關的工作,本身也不是學計算機相關專業的,代碼寫的可能不是很好,歡迎大佬們指正。

操作場景

本文將指導您如何使用 DNSPod 的 API 實現拉平 CNAME 記錄,以解決相關記錄衝突的問題。(以腾讯云 CDN 為例)

前提條件

域名解析托管在腾讯云 DNSPod。
域名已綁定企業版或更高版本套餐

方法說明

流程圖

流程圖
實現嘅方法大體如上圖所示,獲取 CDN 在 31 個省份三大運營商嘅調度結果,然後將調度結果更新到 DNSPod 上。

相關說明

  • 因本人海外訪問全部由 Cloudflare 提供服務,且由於服務 IP 基本固定,故本腳本中未考慮海外使用 CDN 嘅情況,如果 CDN 有海外節點,可以喺腳本中自行添加海外 CDN 調度部分。
  • 需要企業版或更高版本套餐嘅原因係因為從企業版開始先支持分省分運營商解析調度。(或許有時間寫個華為雲 DNS 嘅)
  • 考慮 CDN 存在多級 CNAME 嘅情況,本腳本從 DoH 获取嘅調度結果第二個 “data” 先開始取值,由於 CDN 每次返回嘅 IP 數量唔一,僅取兩個 IP,能滿足目前大部分 CDN 嘅情況,當然唔排除有啲 CDN 存在多級 CNAME 嘅情況,呢種情況下需要自行修改腳本。
  • 考慮到並非所有人都開啟咗 IPv6,故本腳本分為 IPv4 和 IPv6 兩個版本,您可根據自身情況選擇使用。

腳本

項目地址

GitHub 地址:https://github.com/KincaidYang/CNAMEFlattening

Flame 版本

該版本適用於騰訊雲 CDN、華為雲 CDN
直接下載(IPv4 腳本):https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Flame/DNSPod-Flame-IPv4.py
直接下載(IPv6 腳本):https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Flame/DNSPod-Flame-IPv6.py

Frost 版本

該版本適用於騰訊雲 EdgeOne、阿里云 CDN、天翼雲 CDN
直接下載(IPv4 腳本):https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Frost/DNSPod-Frost-IPv4.py
直接下載(IPv6 腳本):https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Frost/DNSPod-Frost-IPv6.py

操作步驟

获取腳本

您可直接下載腳本,或者使用 git clone 命令下載本腳本。
直接下載:

Flame 版本

該版本適用於騰訊雲 CDN、華為雲 CDN:
IPv4 腳本:

1
wget https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Flame/DNSPod-Flame-IPv4.py

IPv6 腳本:

1
wget https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Flame/DNSPod-Flame-IPv6.py

Frost 版本

該版本適用於騰訊雲 EdgeOne、阿裡雲 CDN、天翼雲 CDN:
IPv4 腳本:

1
wget https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Frost/DNSPod-Frost-IPv4.py

IPv6 腳本:

1
wget https://dl.r2wind.com/script/CNAMEFlattening/DNSPod/Frost/DNSPod-Frost-IPv6.py

使用 git clone 命令下載腳本

使用 git clone 命令:

1
git clone https://github.com/KincaidYang/CNAMEFlattening.git

修改變量配置

打開腳本,修改以下變量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置參數
# domanin 替換為自己的域名,如'r2wind.com'
domain='xxx.cn'
# sub_domain 替換為自己的子域名,如'@'或'www'
subdomain='xxx'
# CDNCNAME 請替換為 CDN 提供的 CNAME 地址,如'r2wind.com.cdn.dnsv1.com'
CDNCNAME='xxx.xxx.xxx.cn'
# SecretId 請替換為自己的騰訊雲 SecretId,可前往 https://console.cloud.tencent.com/cam/capi 获取
SecretId='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# SecretKey 請替換為自己的騰訊雲 SecretKey,可前往 https://console.cloud.tencent.com/cam/capi 获取
SecretKey='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# URL 為 DNSPod DOH 接口地址,用以獲取 CDN 實時解析情況,可自行替換為其他廠商的 DoH 接口
DoH='https://1.12.12.12/resolve'
# 記錄類型("A"為 IPv4,"AAAA"為 IPv6)
record_type='A'

本站配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置參數
# domanin 替換為自己的域名
domain='r2wind.com'
# sub_domain 替換為自己的子域名
subdomain='@'
# CDNCNAME 請替換為 CDN 提供的 CNAME 地址
CDNCNAME='r2wind.com.cdn.qcloudcdn.cn'
# SecretId 請替換為自己的騰訊雲 SecretId
SecretId='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# SecretKey 請替換為自己的騰訊雲 SecretKey
SecretKey='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# URL 為 DNSPod DOH 接口地址,用以獲取 CDN 實時解析情況,可自行替換
DoH='https://1.12.12.12/resolve'
# 記錄類型("A"為 IPv4,"AAAA"為 IPv6)
record_type='A'

說明:
若覺得下方用於 ECS 協議的 IP 子網存在問題,可自行修改

安裝依賴

腳本使用 Python3 運行,故您需要安裝 Python3 環境。(一般鏡像都會預裝 Python3)

1
2
3
4
# CentOS/RHEL
yum install python3
# Debian/Ubuntu
apt install python3

本腳本使用了 requests 庫和騰訊雲 SDK,故您還需要安裝 requests 庫和 SDK。

1
2
3
4
# requests 庫
pip3 install requests
# 騰訊雲 SDK
pip3 install tencentcloud-sdk-python

說明:
某些系統下可能需要將 pip3 替換為 pip。
使用前請您前往DNSPod 控制台添加相應記錄,否則本腳本將無法正常運行,或參照下述方式導入記錄。

下載記錄模板

Flame 版本

適用於騰訊雲 CDN、華為雲 CDN
IPv4 模板:https://dl.r2wind.com/template/DNSPod-IPv4-Flame.xls
IPv6 模板:https://dl.r2wind.com/template/DNSPod-IPv6-Flame.xls

Frost 版本

適用於騰訊雲 EdgeOne、阿里雲 CDN、天翼雲 CDN
IPv4 模板:https://dl.r2wind.com/template/DNSPod-IPv4-Frost.xls
IPv6 模板:https://dl.r2wind.com/template/DNSPod-IPv6-Frost.xls

說明:
請根據版本選擇相應模板。
導入前請自行修改模板中的主機記錄。(若有需要)
導入前請自行修改模板中的記錄值為當前 CDN 節點 IP,否則會影響域名正常訪問。(節點 IP 可以通過 nslookup 查询 CDN CNAME 地址獲取)
若需要導入的記錄已在控制台添加過,請刪除原有記錄後再導入。

導入記錄

  1. 登錄 DNSPod 控制台,進入批量操作-導入記錄頁面。
  2. 輸入需要導入的域名,上傳已經修改好的模板,點擊導入
  3. 等待導入完成,請注意查看導入結果,若有導入失敗的記錄,查看原因修正後手動添加記錄,不要重複導入。

調試腳本

請先在本地使用編輯器(如 VScode)調試腳本,若調試成功則可繼續部署。
若腳本正常運行,您將看到類似如下輸出:
{“RecordId”: 1300xxxxxx, “RequestId”: “b690601d-b97f-46fa-a5fb-xxxxxxxxxx”}

[TencentCloudSDKException] code:InvalidParameter.DomainRecordExist message:記錄已經存在,無需再次添加

部署運行

腳本使用 cron 定時運行,故您需要安裝 cron。

1
2
3
4
# CentOS/RHEL
yum install cronie
# Debian/Ubuntu
apt install cron

安裝完成後,您需要編輯 crontab 文件,添加定時任務。

1
crontab -e

在 crontab 文件中添加如下内容:

1
*/5 * * * * python3 /root/DNSPodCDNv4.py

說明:
本配置每 5 分鐘運行一次,您可以根據需要自行修改。
請將 /root/DNSPodCDNv4.py 替換為您的腳本路徑。
若您使用的是 IPv6 腳本,請將上述內容替換為 */5 * * * * python3 /root/DNSPodCDNv6.py

驗證效果

你可以喺 DNSPod 控制台查看對應域名嘅相關記錄,若記錄值已經更新為 CDN 節點 IP,則說明腳本運行成功。

D 監控

可開啟 D 監控配合使用,注意調整監控頻率,監控頻率應小於更新頻率。
注:D 監控僅支持 IPv4。

問題反饋

若你喺使用過程中遇到任何問題,歡迎你提交 Issue