基于Cloudflare DNS 部署 IPv6 DDNS

需求

自己有一個樹莓派,在家可以拿到公網(wǎng)IPv6地址丹禀。
但I(xiàn)Pv6地址經(jīng)常變化粤铭,所以需要將IPv6地址映射到域名上吴侦。這樣后面配置各種服務(wù)會方便很多屋休。

參考內(nèi)容:

[1] 知乎專欄, "基于 Cloudflare DNS API 部署 IPv6 DDNS", https://zhuanlan.zhihu.com/p/69379645
[2] Cloudflare API v4 Documentation, "Update DNS Record", https://api.cloudflare.com/#dns-records-for-a-zone-update-dns-record
[3] Cloudflare API v4 Documentation, "List DNS Records", https://api.cloudflare.com/#dns-records-for-a-zone-list-dns-records

本文基本上是按照文章[1]做的,只是稍有一些細(xì)節(jié)的更新备韧。除此之外具體的API細(xì)節(jié)還參考了官方的API Doc[2, 3]劫樟。

需求資源

  • 一個域名,并且已經(jīng)托管到Cloudflare织堂。我們這里假設(shè)是 114514.love叠艳。
  • 擁有公網(wǎng)IPv6的一個server。我的是一臺裝好了官方系統(tǒng)的Raspberry Pi 3B易阳。

主要流程

1. 獲取相關(guān)的Key

進(jìn)入cloudflare的主頁 -> 左側(cè)Websites -> 點擊中間的域名附较,進(jìn)入域名設(shè)置部分。Overview的右側(cè)有一欄是API潦俺,在這里看到ZoneID和AccountID拒课。而API Key則需要點擊API token的獲取徐勃,會要求驗證密碼。


API部分長成這樣

請務(wù)必保存好自己的這些Key早像,并記錄下如下內(nèi)容:

  • 你注冊Cloudflare的郵箱僻肖。例:senpei@imn.org
  • Zone ID。每一個域名為一個Zone卢鹦,這個ID則代表了是哪個域名下臀脏。比如我們假設(shè)這里Zone ID是Sleep-Black_Tea-ZoneID
  • API token冀自。通過上面Get your API token獲取到揉稚。我們假設(shè)咱們的token是nnnaaaAAAA!!!-APIToken
  • 除此之外我們還需要一個DNS Record ID熬粗。請參考下面的過程獲取到這個ID窃植。我們先假設(shè)這個ID是 OneSummerDREAM-RecordID

2. 添加AAAA記錄并獲取其ID

進(jìn)入cloudflare的主頁 -> 左側(cè)Websites -> 點擊中間的域名荐糜,進(jìn)入域名設(shè)置部分巷怜。點擊DNS,右側(cè)選擇Add record暴氏。我們增加一條DNS解析記錄延塑。如下圖所示(圖是P的)。

一個解析的樣例答渔。(圖是P的9卮)

解釋一下每個部分的含義:

  • Type:AAAA表示為ipv6的解析。
  • Name:這里寫了summer沼撕,那么我們之后使用域名的時候就是輸入 summer.114514.love宋雏。
  • Content: 這里先寫一個空白的v6地址。之后我們會使用自己的API對其進(jìn)行修改务豺。
  • Proxy Status:把橘紅色可以點掉磨总,我們這里只需要它做DNS解析。
  • TTL:可以設(shè)置一個你認(rèn)為合適的時間笼沥。時間越長蚪燕,DNS服務(wù)更新的就越慢。

搞定了之后奔浅,我們需要參考官方API文檔[2]里面的內(nèi)容馆纳,使用GET方法獲得這個summer.114514.love所對應(yīng)的Record ID。你可以使用任何一種你習(xí)慣的方式汹桦。官方樣例里面直接用的是curl鲁驶。既然我們都在樹莓派下是一個linux環(huán)境,那么這里就直接運行curl進(jìn)行結(jié)果的獲任杪妗:

curl -X GET "https://api.cloudflare.com/client/v4/zones/Sleep-Black_Tea-ZoneID/dns_records?type=AAAA&name=summer.114514.love&page=1&per_page=100&order=type&direction=desc&match=all" \
     -H "X-Auth-Email: senpei@imn.org" \
     -H "X-Auth-Key: nnnaaaAAAA!!!-APIToken" \
     -H "Content-Type: application/json"

url里面具體的參數(shù)請參考doc里面的說明钥弯∫挤#總之應(yīng)該可以拿到一個返回值的結(jié)果,結(jié)果直接打印在terminal里面會比較亂寿羞,但整理之后應(yīng)該大概長成下面這個樣子:

{
  "success": true,
  "errors": [],
  "messages": [],
  "result": [
    {
      "id": "OneSummerDREAM-RecordID",
      "zone_id": "Sleep-Black_Tea-ZoneID",
      "zone_name": "114514.love",
      "name": "summer.114514.love",
      "type": "AAAA",
      "content": "::1",
      ... # 以下省略
    }
  ]
}

我們需要的是result下面的id猖凛,這個就是該條目的Identifier。請記錄下來绪穆。

3. 寫DNS更新腳本并定時運行

更新現(xiàn)有的DNS條目可以參考官方文檔[3]辨泳。寫一個PUT即可完成。我們本地的腳本需要完成的工作為:

  1. 獲取本機(jī)的IPv6地址玖院。
  2. 調(diào)用官方給的API菠红,用PUT更新上去。
  3. 能跑通后难菌,把這個腳本設(shè)成每x分鐘運行一次试溯。

當(dāng)然更優(yōu)的方式是保存下來IPv6地址,只在變化的時候運行更新腳本郊酒。不過我懶了暫時沒寫這個遇绞。由于個人更熟悉Python操作,所以這個腳本我是用的Python寫的燎窘,放出來僅供參考摹闽。Python版本3.6,由于用到了f-string更低的版本請自行修改褐健。

import request

def update_addr(ipv6):
    email = 'senpei@imn.org'
    zone_id = 'Sleep-Black_Tea-ZoneID'
    api_key = 'nnnaaaAAAA!!!-APIToken' 
    record_id = 'OneSummerDREAM-RecordID'

    url_target = f'https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{record_id}'
    headers = {
        'X-Auth-Email': email,
        'X-Auth-Key': api_key,
        'Content-type': 'application/json',
    }
    data = {
        'type': 'AAAA',
        'name': 'blackpi.100097.xyz',
        'content': ipv6,
        'ttl': 300,
        'proxied': False,
    }
    resp = requests.put(url_target, headers=headers, json=data)
    return resp

而其中ipv6的地址則是使用了正則表達(dá)式獲雀堵埂:

import os
import re

def get_ipv6():
    command = 'ip -6 addr show dev eth0 | grep global'
    x = os.popen(command).read()
    result = re.findall(r'(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})', x, re.I)
    ipv6 = result[0][0]
    return ipv6

以上。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚜迅,一起剝皮案震驚了整個濱河市舵匾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谁不,老刑警劉巖坐梯,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拍谐,居然都是意外死亡烛缔,警方通過查閱死者的電腦和手機(jī)馏段,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門轩拨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人院喜,你說我怎么就攤上這事亡蓉。” “怎么了喷舀?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵砍濒,是天一觀的道長淋肾。 經(jīng)常有香客問我,道長爸邢,這世上最難降的妖魔是什么樊卓? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮杠河,結(jié)果婚禮上碌尔,老公的妹妹穿的比我還像新娘。我一直安慰自己券敌,他們只是感情好唾戚,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著待诅,像睡著了一般叹坦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卑雁,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天募书,我揣著相機(jī)與錄音,去河邊找鬼测蹲。 笑死锐膜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弛房。 我是一名探鬼主播道盏,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼文捶!你這毒婦竟也來了荷逞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤粹排,失蹤者是張志新(化名)和其女友劉穎种远,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顽耳,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡坠敷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了射富。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膝迎。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胰耗,靈堂內(nèi)的尸體忽然破棺而出限次,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布卖漫,位于F島的核電站费尽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羊始。R本人自食惡果不足惜旱幼,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望突委。 院中可真熱鬧速警,春花似錦、人聲如沸鸯两。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钧唐。三九已至忙灼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钝侠,已是汗流浹背该园。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留帅韧,地道東北人里初。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像忽舟,于是被迫代替她去往敵國和親双妨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容