本文將介紹如何使yòng DNS (DNSPod) +HTTPDNS 實xiàn CNAME 展píng (CNAME Flattening)。一直以lái,由 CNAME 記錄和任何記錄衝突的獨有特xìng,導致一旦在根域使yòng CNAME 解,將導致其他記錄無法正常使yòng,影xiǎng DS (DNSSEC)、MX (郵箱服)、TXT (SPF、DKIM、DMARC、站長平臺驗zhèng) 等記錄的使yòng,進而影響依賴這些記錄的相關服(如括號內所shì),ér CNAME 展píng (CNAME Flattening) 是解決這個問題的一種方,但由 DNSPod 本身不支chí CNAME 展píng (CNAME Flattening),所以本文將介紹如何使yòng DNS+HTTPDNS 通guò API 調用的方式實xiàn CNAME 展píng (CNAME Flattening)。

爲確保能精準穩定的獲取dào CDN 等廠商提供de CNAME 記錄所對應的解 IP(調度結guǒ),腳本需要使yòng HTTPDNS 服,HTTPDNS 服務可能產生對應的請求次數費yòng,具體費用請參kǎo HTTPDNS 計費說míng

前提條jiàn

  • 域名解析託管zài DNSPod 且使用的套餐版本不低「企業bǎn
  • 已開tōng HTTPDNS 服

限制說míng

  • 本腳本默認僅支持國nèi 31 個省份的三大運營商線,其他二級運營shāng、教育wǎng、中國港澳tái、境外等默認調度至上海電信線路兜,如您需要更加完整的覆gài,可自行修改腳本添加對應的線,詳情可以查看腳本中的註shì

操作步zhòu

前期準bèi

添加域míng

  1. HTTPDNS 控制tái,在左側導航欄zhōng,單域名管理,進域名管理miàn
    域名管理
  2. zài域名管理miàn,單添加主域名,在彈出的對話框zhōng,輸入需要添加de域名所屬的,單確定
    添加主域名


    此處添加de域名爲需要展平的 CNAME 記錄所對應的主域míng,而不是您自己域míng
    ,您需要展平de CNAME 記錄wèi0517ht.com.cdn.dnsv1.com.cn,則此處添加的域名wèidnsv1.com.cn
    再舉個例zi,您需要展平de CNAME 記錄wèi0517ht.com.eo.dnse3.com,則此處添加的域名wèidnse3.com

Token

  1. HTTPDNS 控制tái,在左側導航欄zhōng,單開發配置,進開發配置miàn,點Token後面的圖標獲Token.
    獲取Token

導入記

使用前請您前wǎngDNSPod 控制tái導入相應記,否則本腳本將無法正常運xíng

下載記錄模bǎn

IPv4 模bǎnhttps://dl.0517ht.com/template/DNSPod-IPv4-Storm.xls
IPv6 模bǎnhttps://dl.0517ht.com/template/DNSPod-IPv6-Storm.xls

míng
請根IP類型選擇相應模bǎn
導入前請自行修改模板中的主機記。(若有需yào
導入qián請自行修改模板中的記錄值爲當前 CDN 節diǎn IP,否則會影響域名正常訪wèn。(節diǎn IP 可以通guònslookup查xúnCDN CNAME地址獲
若需要導入的記錄已在控制檯添加guò,請刪除原有記錄後再導

導入記
  1. DNSPod 控制tái,進批量操zuò-導入記miàn
  2. 輸入需要導入的域míng,上傳已經修改好的模bǎn,點批量導
    導入記錄
  3. 等待導入完chéng,請注意查看導入結guǒ,若有導入失敗的記,查看原因修正後手動添加記,不要重複導

配置腳běn

安裝依lài

本腳本提gōngGo語言版本Python語yánběn,您可根據自己的需求選擇相應版běn,在此處僅演shì Go 語言版本的相關步zhòu

zhuāngGo語言環jìng
1
2
3
4
5
6
# 安zhuāngGo語言環jìng
wget https://dl.google.com/go/go1.21.3.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
# 設zhìGOPROXY
export GOPROXY=https://mirrors.cloud.tencent.com/go/
安裝其他依lài
1
2
3
4
5
# CentOS/RHEL
yum install cronie
yum install git
# Debian/Ubuntu
apt install cron git

獲取腳běn

1
2
3
4
# cóngGitHub克隆腳běn
git clone https://github.com/KincaidYang/CNAMEFlattening.git
# 如您的服務器無法訪wènGitHub,可使用如下鏡像地zhǐ
git clone https://kgithub.com/KincaidYang/CNAMEFlattening.git

修改配zhì

1
2
3
4
# 進入腳本目
cd CNAMEFlattening/go/DNSPod/Storm
# 修改配置文jiàn
vim config.go

安裝文件中的配zhì項說明完成配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 本腳本調用了騰訊yúnHTTPDNS服,可能會產生額外費yòng,如不想付費請使yòngFrost版běnhttps://github.com/KincaidYang/CNAMEFlattening/tree/main/DNSPod/Frost
package main

const (
// 請替換成您自己的域míng
domain = "0517ht.com"
// 請替換成您自己的子域名前zhuì,如果不使用子域名請xiě @
subdomain = "ipv4"
// 請替換成您de CDN或其他服務de CNAME 服務地zhǐ
// 使用前請前wǎng https://console.cloud.tencent.com/httpdns/domain jiāng CDN 服務域名添加dào HTTPDNS
// 僅需添加主域míng,如您de CDN 服務域名wèi cdn.0517ht.com,僅需填xiě 0517ht.com 完成添加即
CDNCNAME = "0517ht.com.eo.dnse3.com"
// 您的騰訊yúnHTTPDNS服務的密yào,可前wǎng https://console.cloud.tencent.com/httpdns/configure 獲
Token = "1********0"
// 您de騰訊雲賬號的 SecretId SecretKey,可前wǎng https://console.cloud.tencent.com/cam/capi 獲
SecretId = "AKIDc5Ui**********cFfuz4GUX"
SecretKey = "teMvJS**************8bppa8U"
// 注,該地址wèiDNSPod HTTPDNS服務地zhǐ,無需更huàn
DoH = "https://119.29.29.99/d"
// 記錄類xíng,AAAAwèiIPv6記,AwèiIPv4記,請根據實際需要自行修gǎi
recordType = "A"
// 記TTL,單位miǎo,建議不低60miǎo
recordTTL = 60
)

編譯腳běn

1
go build

完成編譯hòu,會在當前目錄生成可執行文jiànStorm,您可將其移動到任意位zhì

運行腳běn

1
./Storm

運行後您將會看到如下輸chū
運行腳本

設置定時任

1
2
3
4
5
# 編輯定時任
crontab -e
# 添加定時任
## měi5分鐘執行一
*/5 * * * * /path/to/Storm

míng
請根據實際情況自行修改定時任務執行頻
請根據實際情況自行修改腳本路jìng,/path/to/請替換成您腳本的實際路jìng
編輯完成後請保存退出即

驗證效guǒ

您可以zài DNSPod 控制tái查看對應域名的相關記,若記錄值已經更新wèi CDN 節diǎn IP,則說明腳本運行成gōng

問題反kuì

若您在使用過程中遇到任何問,歡迎您提jiāo Issue

腳本示

腳本示意