.Net Core跨平台應用研究-HelloDDNS
-玩轉DDNS
摘要
為解決自己搭建的內網服務器需要域名而因沒有超級用戶密碼不能開啟光貓內置DDNS功能的問題,自己動手,基於.net core,實現動態域名的自助解析更新功能。
起因
最近學習ABP開源項目框架,因測試和展示需要,需部署基於asp.net core的web應用。手上有一個閑置了兩年的35互聯基於windows IIS的虛擬主機空間,聯系服務商升級支持.net core運行時,增加無托管應用程序池,等了兩天,技術支持回復不能予以支持,建議購買雲主機。
登錄35的管理控制台,看了看35雲主機的價格,2核4G內存10M出口帶寬的雲主機,1年不下5K大洋的價格,讓人無語。
聽說馬雲baba的阿里雲性價比不錯,登錄阿里雲,2核4G的ECS,1年價格也不低於1.5K。
錯過了雙11,也錯過了雙12,腫么辦?
想到家里100M的電信寬帶,20M的上行速率,是不是可以利用下呢?
正好最近在折騰基於arm64的Linux嵌入式平台(ubuntu core內核),已經成功實現了.net core應用跨平台部署(詳見之前《.Net Core跨平台應用研究-HelloArm(串口篇)》文章),只要解決了外部網絡訪問及域名解析問題,手上就是現成的雲主機啊。
習大大說,擼起袖子加油干。
說干就干。
(原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文為作者原創,未經許可,請勿轉載。
自已動手,豐衣足食
.Net Core Web應用部署
首先,需要解決web app的部署。發布.net core Web項目的Linux(arm64)平台運行版本,部署到Linux。具體步驟參見筆者另一篇文章《.Net Core跨平台應用研究-HelloArm(串口篇)》,在此不再贅述。
配置外網訪問
登錄電信提供的光貓,開啟端口映射功能。(不懂的同學請自行百度或必應)
通過www.ip138.com,查看自己的外網地址(本人直接使用的光貓路由功能,未使用二級路由),或登錄光貓查看WLAN信息,獲取自己的外網IP地址。
關掉手機WIFI,用4G上網,通過手機瀏覽器訪問http://外網IP:Port,訪問發布的Web站點,bingo,訪問成功。
有同學會問,為什么要關掉手機wifi用流量訪問?通常這些小型的家用路由器之類,是不會具有NAT回環配置功能的,無法從內網通過外網IP再NAT到內網IP。我的光貓,也不例外。
DDNS簡介
稍懂網絡知識的同學應該知道,家庭寬帶用戶,每次撥號上網得到IP地址是非固定的(固定IP地址的帶寬線路用戶,每年至少需要幾萬大洋哦,非土豪用戶,一般不會申請 固定IP),光貓斷個電或由於某些原因重新啟動一下,IP就發生了變化。
如何解決這個問題呢?此時,本文的主角終於快要出現了。
我們知道,TCP/IP網絡中的計算機,是通過IP地址進行尋址訪問的,由於IP地址不好記憶,人們發明了一種便於標識IP的方式:域名。通過域名與IP進行綁定,解決IP地址難以記憶的問題。
域名到IP地址的解析,是由DNS服務所完成。
DNS通常只實現靜態注冊IP地址的解析,我們這種經常會變化的IP地址怎么辦呢?
這年頭,只要有需求,就會有對應的產品或服務。針對這種IP地址經常發生變化又需要有域名的情況,一種叫DDNS的服務應運而生。
顧名思義,DDNS就是動態DNS,當IP地址發生變化時,只要能及對所轄域名的DNS服務器進行更新,則可保證對應域名的解析服務可用。當然,DDNS在IP發生變化時,會有一個失效時間,但只要更新及時,失效時間很短,用於測試和展示的話,基本不影響使用。
DDNS使用
中國的互聯網絡,從電話撥號上網,到ADSL,到現在的光纖入戶,經歷了好幾代的演進。目前,大部分的接入設備-光貓,都是具備DDNS功能的,只不過該功能屬於高階功能,通常需要具有管理員權限才能使用。
使用DDNS服務,需要先到DDNS服務商注冊,注冊成功后,可下載DDNS客戶端軟件(pc端)或配置開啟光貓DDNS功能,即可實現DDNS服務的自助更新。
DDNS服務商
筆者接觸互聯網較早(沒有從事互聯網行業,感覺錯失幾個億,在此汗一個),知道國內較早提供DDNS服務的是花生殼,國外提供DDNS的有dynu.com、noip.com等。
另外在折騰路由器的過程中,用過的內置支持DDNS的光貓,在此記錄一下:
- 華為HG8245光貓,支持3322、dynu;
- 烽火HG2201T光貓,支持oray(花生殼);
- ……
蛋疼的中興F450(V2)
因升級到100M帶寬,電信給提供了一個支持1000M的光貓,型號為中興F450。根據網絡上目前能查詢到的資料,一翻折騰,確定目前中興F450(V2版本)的光貓無法在免拆機的情況獲取到超級管理員帳號。
在沒有超管密碼的情況下,無法進入高級網絡應用功能設置,不能開啟光貓內置的動態域名支持(其實我也不知道它支持哪家的動態域名哈)。
生命不休,折騰不止
雖然本人的動手能力,足以通過拆機連接TTL串行接口的方式,以串行終端登錄的方式獲取中興光貓的超級管理用戶密碼,一方面,考慮到光貓還在保修期(最近升級更換的新光貓呵),另一方,之前對DNS,DDNS的工作機制有一定的了解,知道DDNS廠家通常除了DDNS Client工具外,也有API接口可供用戶自行開發集成。
本着自已動手,豐衣足食的原則,決定自己實現DDNS定期更新功能。
DDNS API協議研究
獲取相關DDNS協議
(原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文為作者原創,未經許可,請勿轉載。
ORAY
通過一翻搜索,查詢到花生殼的協議文檔,鏈接在這里,支持瀏覽器手動更新和原始Http Get請求:
1.使用URL驗證
適用於瀏覽器或應用程序(fetch, curl, lwp-request),可以在URL中包含驗證信息。
http://username:password@ddns.oray.com/ph/update?hostname=yourhostname&myip=ipaddress
2.原始HTTP GET請求
實際的HTTP請求,類似下面的代碼。 其中 base-64-authorization 請使用 Base64 加密 username:password 后的字符替換。
GET /ph/update?hostname=yourhostname&myip=ipaddress HTTP/1.0
Host: ddns.oray.com
Authorization: Basic base-64-authorization
User-Agent: Oray
請注意必須使用GET請求,POST是不被允許的。
更新參數
目前僅允許提交以下參數
參數 說明
hostname 需要更新的域名,此域名必須是開通花生殼服務。多個域名使用,分隔,默認為空,則更新護照下所有激活的域名。例:hostname=test.oray.com,customtest.oray.com
myip 需要更新的IP地址,可以不填。如果不指定,則由服務器獲取到的IP地址為准。
看了花生殼的動態域名更新協議,心中有底了,very easy。
DYNU
因本人以前有申請過DYNU的免費域名,順便也查了下接口文檔,文檔地址如下(某些地區需要梯子呵):
https://www.dynu.com/DynamicDNS/IP-Update-Protocol
主要內容如下:
GET /nic/update?myip=198.144.117.32 HTTP/1.1
Host: api.dynu.com
Authorization: Basic [BASE64-ENCODED-USERNAME:PASSWORD-PAIR]
User-Agent: [DEVICE-MODEL-MAKE-VERSION]
Oray和Dynu的接口協議簡直是一個模子出來的,不知道是誰模仿了誰,本人不想深究,好用就行。
NO-IP
群中有網友提到No-IP,本人沒有注冊過相關帳號,相關資料在此,無需翻牆,有需要的同學拿走不謝。
https://www.noip.com/integrate/request
http://username:password@dynupdate.no-ip.com/nic/update?hostname=mytest.testdomain.com&myip=1.2.3.4
萬事具備 ,只欠編碼……
(原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文為作者原創,未經許可,請勿轉載。
編碼實踐
創建類庫項目
打開宇宙最強IDE,名字我就不說了,你懂的,新建一個類庫項目,選擇.NET Standard類庫。

為什么選擇.NET Standard類庫,.net跨平台的之首選佳品。相關知識自行百度/必應補充。
類庫實現以下功能:
夜深了,還是直接上圖吧

創建dotnet core控制台程序
為啥選擇dotnet core,原因很簡單,跨平台。本人需要部署到Linux系統平台。
外甥打燈籠-照舊(舅),上圖

HttpClient和HttpClientFactor
原來准備直接使用HttpClient,參考一些文章后,我發現HttpClient的使用會導致一些問題:
.NET Core 中 HttpClientFactory 如何解決 HttpClient 臭名昭著的問題
What is HttpClientFactory?
https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore
.NET Core 2.1中的HttpClientFactory最佳實踐
https://www.cnblogs.com/xiaoliangge/p/9476568.html
Microsoft.Extensions.Http
網上博客文章中,介紹IHttpClientFactory的可真不少,但是都沒有提到需要安裝其所需要Package,最后經過東搜西搜,花費了一翻不小的力氣,還是在官方文檔中找到了解決方法(好懷念有Google的日子啊)
需要安裝Microsoft.Extensions.Http包
官方文檔出處:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2
完成程序,運行:

給出筆者部署到Linux系統下的運行效果

運行后的日志文件記錄

至此,一台強大的,完全自主擁有的linux雲主機橫空出世,不要999,只要99,你值得擁有!
使用說明
flyfire.DDNS客戶端
基於.net core2.2環境,支持windows和linux.
默認使用了oray的免費動態域名服務
啟動時解析一次域名服務,解析域名和IP是否一致,如不一致,更新DDNS。
每十分鍾檢查一次,域名和公網IP不一致,則更新DDNS。
更新后會輸出更新結果到控制台。
控制台輸出可通過標准輸出重定向輸出到日志文件。此行划重點,要考的呵。
使用標准輸出重定向,可以不用自己寫日志功能,可直接將程序異常和控制台輸出定向到日志文件,是廣大程序員一大偷懶神器。
使用oray免費殼域名需要注冊和實名認證。https://www.oray.com/
ddns使用方式
在程序所在目錄,通過命令行方式,傳入你的域名及帳號相關參數
使用oray域名
dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword
使用dynu域名
dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword http://api.dynu.com /nic/update
使用noip域名
http://username:password@dynupdate.no-ip.com/nic/update?hostname=mytest.testdomain.com&myip=1.2.3.4
dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword http://dynupdate.no-ip.com /nic/update
linux下腳本配置(ubuntu)
創建腳本文件
在程序目錄下創建一個腳本文件,例如 ddns.sh
文件內容如下:
cd $(dirname $0)
pwd
nohup dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword 2>&1 >>log.txt
授予權限
chmod 777 ./ddns.sh
運行腳本
./ddns.sh
腳本將啟動程序,並且程序不會隨shell的關閉而退出。同時,程序輸出被重定向到日志文件log.txt。
將腳本文件加入到linux的開機啟動配置文件,即可實現開機自動運行。
windows下輸出重定向
dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword 2>&1 >>log.txt
本項目已開源至:https://github.com/flyfire-cn/flyfire.DDNS
類庫flyfire.DDNS已發布至:https://www.nuget.org/packages/flyfire.DDNS/
有需要的同學,請自行獲取。
(原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文為作者原創,未經許可,請勿轉載。
在今天這個特別的日子,謹以此文獻給所有堅守在一線的程序員/媛,祝天下有情人終成眷屬。
也感謝我的家人,長久以來為我默默的付出。
注:本次折騰過程中,還出現了一個意外。在配置光貓NAT端口映射時,發現死活無法生效,開始還以為是光貓功能有問題,差點准備換光貓了(手上還有HW -HG8245光貓,因是華為早期產品,功耗有點大,無線信號稍弱,退休閑置中),無意中發現WLAN中得到的IP地址,居然是一個10開頭的地址,原來電信把我給分配到了一個大局域網中了。
同學們如果遇到這種情況,不要慌,給10000號打報修電話(本人使用電信寬帶),要求使用公網IP,通常電信客服會幫你搞定。
