.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(序列槽篇)》文章),隻要解決了外部網絡通路及域名解析問題,手上就是現成的雲主機啊。
習大大說,撸起袖子加油幹。
說幹就幹。
自已動手,豐衣足食
.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協定
ORAY
通過一翻搜尋,查詢到花生殼的協定文檔,連結在這裡,支援浏覽器手動更新和原始Http Get請求:
1.使用URL驗證
适用于浏覽器或應用程式(fetch, curl, lwp-request),可以在URL中包含驗證資訊。
http://username:[email protected]/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,本人沒有注冊過,相關資料在此,無需FQ,有需要的同學拿走不謝。
https://www.noip.com/
https://www.noip.com/integrate/request
http://username:[email protected]/nic/update?hostname=mytest.testdomain.com&myip=1.2.3.4
萬事具備 ,隻欠編碼……
編碼實踐
建立類庫項目
打開宇宙最強IDE,名字我就不說了,你懂的,建立一個類庫項目,選擇.NET Standard類庫。
為什麼選擇.NET Standard類庫,.net跨平台的之首選佳品。相關知識自行百度/必應補充。
類庫實作以下功能:
夜深了,還是上圖吧
建立dotnet core控制台程式
為啥選擇dotnet core,原因很簡單,跨平台。本人需要部署到Linux系統平台。
照舊,上圖
HttpClient和HttpClientFactor
原來準備直接使用HttpClient,參考一些文章後,我發現HttpClient的使用會導緻一些問題:
.NET Core 中 HttpClientFactory 如何解決 HttpClient 臭名昭著的問題
https://www.zhibaoku.com/2018/10/31/net-core-zhong-httpclientfactory-ruhejiejue-httpclient-choumingzhaozhudewenti/
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
完成程式,運作:
本項目已開源至:https://github.com/flyfire-cn/flyfire.DDNS
類庫flyfire.DDNS已釋出至:https://www.nuget.org
有需要的同學,請自行擷取。
注:本次折騰過程中,還出現了一個意外。在配置光貓NAT端口映射時,發現死活無法生效,開始還以為是光貓功能有問題,差點準備換光貓了(手上還有HW -HG8245光貓,因是華為早期産品,功耗有點大,無線信号稍弱,退休閑置中),無意中發現WLAN中得到的IP位址,居然是一個10開頭的位址,原來電信把我給配置設定到了一個大區域網路中了。
同學們如果遇到這種情況,不要慌,給10000号打報修電話,要求使用公網IP,通常電信客服會幫你搞定。
posted on 2019-02-14 23:32 赫山老妖 閱讀(...) 評論(...) 編輯 收藏