摘要
為解決自己搭建的內網伺服器需要域名而因沒有超級使用者密碼不能開啟光貓內建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,本人沒有註冊過相關帳號,相關資料在此,無需FQ,有需要的同學拿走不謝。
https://www.noip.com/
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 臭名昭著的問題
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: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,通常電信客服會幫你搞定。
原文地址:https://www.cnblogs.com/flyfire-cn/p/10381298.html
.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。