這兩天在家里用樹莓派折騰了一個家用服務器,主要用來做 mac 的 Time Machine ,還有就是當做下載機和 nas ,想着平時上班時間家里沒人用網絡,空着也是空着,就可以利用空閑帶寬下個美劇啥的。所以在服務器上裝了個遠程迅雷和 transmission ,這些網上教程一大把,跟着教程做很快就能搞好。
但是我遇到的問題就是,家用的寬帶不是固定 IP 的,如果路由器斷個網重新連接就會被分配到不同的 ip ,一旦 ip 換了那就沒辦法通過外網連接到服務器上了。之前也嘗試過在路由器上綁定花生殼,但是實際使用效果不是很好,不是很清楚花生殼的動態更新機制,好幾次家里網絡已經更新了 ip 但是花生殼那邊沒有及時更新。
花生殼的方案不行,那就只有找別的方法了。同時我順便了解了下花生殼能夠動態解析域名的原因,原來使用的是 DDNS 服務,關於 DDNS ,網上的解釋是:
DDNS ( Dynamic Domain Name Server )是動態域名服務的縮寫。
DDNS 是將用戶的動態 IP 地址映射到一個固定的域名解析服務上,用戶每次連接網絡的時候客戶端程序就會通過信息傳遞把該主機的動態 IP 地址傳送給位於服務商主機上的服務器程序,服務器程序負責提供 DNS 服務並實現動態域名解析。 --百度百科
這不正是我需要的功能么,正好我自己也有域名,我的域名是在阿里雲上注冊的,所以我就去阿里雲上看有沒有提供動態域名解析服務,果不其然在網站上找到了修改解析記錄的 api 文檔。
由於我比較擅長的是 java(其實也是唯一擅長的),所以我下了他們的 JAVA SDK ,申請好Access Key 很快就接入成功了,但是感覺在 Linux 服務器上用 Java 來執行更新好像是件很 Low 的事,正常的使用方式應該用腳本才對啊。正好最近我在自學 Phthon ,所以順便邊學邊做用 python 腳本來實現吧。
好啦,以上的都是廢話,下面的才是正題。
1.首先你得有個阿里雲的域名
2.到阿里雲管理控制台申請Access Key
3.下載Python sdk,SDK 主要幫我們封裝好了一些數據格式轉換和對接的方法,能夠方便我們快速接入,當然如果你足夠牛逼的話,你也完全可以全部自己寫。
4.進行接入操作。我的主要思路是運行該腳本的時候先去阿里雲獲取域名綁定的 ip 地址,再跟
當前服務器 ip 地址做對比,如果 ip 相同則說明沒改變,不需要操作。如果 ip 不同則修改域名綁定的 ip 地址。
5.服務器部署。在服務器上通過 corntab 設置一項定時計划,讓服務器定期執行該腳本。 linux 設置定時計划命令:
crontab -e
幾個注意點:
1.請記得保管好你的 Access Key ,所以我沒有在我的代碼里直接寫 Access Key Id 和 Access Key Secret ,我把他們單獨放在一個 key.json 文件中,同時將這個文件排除出 git ,保證只有我自己知道,因為一旦這兩個值泄露了那別人就可以直接修改你的域名了。
2.阿里雲通過 RecordId 來區分每條域名解析記錄,但是他們之前文檔上對於這個參數的描述只寫了“解析記錄的 ID ”,沒有寫如何獲取這條解析記錄 ID ,我去我的阿里雲控制台上找了好久都沒找到,到后來我突然想到 sdk 上有獲取域名信息的 api ,我試着用這個果然返回的信息里有這個字段,后來聯系了他們客服,他們也說在控制台上沒辦法找到,也只有通過 api 獲取域名信息才能找到,后來他們也在文檔中注明了這個字段的獲取方式。
3.更新域名解析主要用到的是阿里雲 sdk 包里 aliyun/api/rest/Dns20150109UpdateDomainRecordRequest.py 方法,我為了偷懶直接在這個方法里寫死了一些需要固定傳入的參數,如果你要對自己的域名做解析的話記得去修改這些參數值。
4.我已經把這個項目發到 github 上,歡迎有需要的使用,同時也歡迎一起交流,github 地址
![]() |
1
話說… 樓主… 如果只是為了 DDNS 可以用 Dnspod 有 API 可以直接操作…
並且通過 cron 定時任務,一行腳本的事… */15 * * * * curl -k -X POST https://dnsapi.cn/Record.Ddns -d 'login_email=登錄郵箱&login_password=登錄密碼&format=json&domain_id=域名編號&record_id=記錄編號&record_line=默認&sub_domain=子域名' 每 15 分鍾更新一次 |
![]() |
2
當然… 我贊同所有以學習為目的的折騰,上面的回復僅僅針對 DDNS 的多種實現方式…
|
![]() |
3
何必這麼麻煩,而且 DDNS 的可靠性太差,更新也慢
1 、租個 vps ,裝上 nginx+php 或 python 2 、樹莓派定期執行 wget 或 curl 到 vps 的網址,最好加上驗證比如 a.com/get?key=1234 3 、訪問 vps 上的網頁,得到最新的 remote_addr |
![]() |
4
ddns 更新應該不慢吧。我用路由器掛 he 的 ipv6 隧道就要用到它們給的 ddns 功能,我見每次重撥后域名對應的 ip 都有及時更新啊。
|
![]() |
7
@
abelyao
1.你這個果然好簡單,一行代碼能搞定,我之前真的不知道還有這個,又學到了一個新技能,非常感謝👍 2.我的域名是放在阿里雲上的,如果要用 dnspod 的話得把我的域名轉過去才行,我對阿里雲的服務還是比較滿意的,暫時不想換 3.好吧被你說中了,其實我真的只是自己閑着沒事干想嚇折騰下而已==! |
![]() |
8
|
![]() |
9
|
![]() |
11
花生殼更新不及時是路由器的問題,不是花生殼的問題。
花生殼也有 API 。 |
![]() |
12
@
xgowex 我覺得應該也是,但是路由器只能填花生殼賬號信息,沒辦法對更新頻率做設置。好吧,是我誤會花生殼了,他是個好同志==!
|
![]() |
14
@
wuhanpizi 果然是這樣啊,只能怪我之前了解的太少了,但是我這個都已經弄好了懶得再換了,不過又學到了一種新的實現方法也挺好的,非常感謝!
|
![]() |
15
看到前面我就想起 tunnel 了
|
![]() |
16
Dnspod 或者 cloudxns 可以參考我這里的腳本
https://github.com/xdtianyu/scripts/tree/master/ddns ,我在 ddwrt 和 openwrt 上用了很久了。
https://www.xdty.org/?s=Ddns
|
![]() |
17
@
abcbit 好想知道具體怎樣做的。被動態 IP 搞死~
|
![]() |
18
我的動態域名也放在阿里雲,其他域名都在 DNSPOD ,主要是阿里雲年付 40 塊就可以買到 TTL 1 秒的付費服務!!!!
1 秒,什么概念! 不過我一般用 30 秒,因為 1 秒太誇張了,基本上每次訪問都要去獲取 DNS 。另外阿里雲 DNS 同步速度挺快的,家里用 PPPoE ,然后使用 python 寫了個腳本調用 API ,再使用 crontab 設一個任務每分鍾獲取。 用了半年,非常平穩。 請原諒我再一次地推銷我的文章: 通過 python 將阿里雲 DNS 解析作為 DDNS 使用 >> 文章短鏈接 >> https://c4.hk/2l |
![]() |
19
呼,過了幾個路由,感覺還是得用內網穿透了
|
![]() |
22
@
abelyao 你好,可以回復一下我嗎,大哥,我現在急需弄一個阿里雲動態 DNS,用做廠里的 VPN 連接,你這招是怎么弄的啊,謝謝,你能留一下 QQ 嗎,
|
![]() |
23
@
miaol 大哥,我現在急需一個你這樣的阿里雲 DNS ——因為現在用的是花生殼的 DDNS,不穩定,能教一下嗎。1.2 步可以看懂,到第三步我就看不懂了,我沒編程基礎,能教下小白嗎,謝謝
|
![]() |
24
@
snowice123 回復你了你也收不到了啊……
|