歡迎光臨
每天分享高質量文章

.Net Core跨平臺應用研究-HelloDDNS(動態域名篇)

摘要

       為解決自己搭建的內網服務器需要域名而因沒有超級用戶密碼不能開啟光貓內置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:[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

      萬事具備 ,只欠編碼……

  (原文)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 臭名昭著的問題

      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

      完成程式,運行:

 

      給出筆者部署到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:[email protected]/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,通常電信客服會幫你搞定。

原文地址:https://www.cnblogs.com/flyfire-cn/p/10381298.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com


 

受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可通過二維碼轉賬支持公眾號。

    閱讀原文

    赞(0)

    分享創造快樂