用.NET做DDNS動態域名解析和SSL證書申請

本文主要介紹 IPv6 配置 DDNS 解析和 SSL 證書申請工具的開發歷程和其中的相關知識。工具使用.NET開發,已開源,目前該工具的域名解析只支持阿里云。文中提及或使用的 .NET 開源項目:SangServerTool(DDNS,SSL證書申請工具),FastTunnel(內網穿透工具),Certes(ACME證書申請庫),CommandLineParser(命令行解析庫)

背景

前幾天用.NET玩IoT設備,拿出了角落吃灰的Jetson Nano。近期也買了一堆傳感器,還在路上,準備到手之后,好好搗鼓一番。Nano設備呢,雖然沒有一直開機,但是連上了智能插座,隨時待命。

這里不禁要吐槽一下小愛同學,我把插座命令為了“Jetson Nano”,然后怎么叫它,小愛就是不應。行吧,我只能叫他“二蛋”了,啊,不,“小電腦”(然后還被時不時聽成“手電筒”)。

為了讓后期的使用可以隨時隨地,更順手些,那網絡的處理是必不可少的。

如何在外網訪問內網服務

如果你也有一臺樹莓派或者Jetson設備,想讓其在外網提供服務,那么一般有這么幾條路:

1.在路由器中將設備設置為DMZ區2.在路由器中配置虛擬主機3.借助其他第三方內網穿透工具

因為現在一般都是光寬帶了,前兩種呢需要拿到光貓的管理員賬戶,賬戶需要費些功夫。除非你是橋接的網絡,用的自家路由器撥號。

第三種,如果你有一臺外網的服務器,可以借助開源項目?FastTunnel[1]?隧道開實現。這是一個.NET開發的開源的內網穿透工具。當然你也可以使用其他的第三方內網穿透工具,這里不再舉例。

工具雖好,然則不能全速走寬帶的公網帶寬著實非完美的方案。那么有沒有更好的方案呢?當然有了,現在IPv6如此普及,待我ipconfig一觀:

4f728e791fb3fbc1b4aac24011fdda58.png

ipconfig

果然比沙子還多,誠不欺我。但當我拿出之前的 nodejs 項目修改了IP監聽后,興致勃勃的用手機瀏覽器訪問了這個 IPv6 站點,我不禁開始懷疑人生了。服務沒法訪問就算了,還 ping 不通。在折騰了幾番電腦防火墻和管理員身份啟動之后,已是半夜。無奈只好躺在床上簡單搜索了幾番答案,便去找周公探討究竟是哪里出了問題。

翌日,再次打開電腦我才發現,果然不能老熬夜啊,我監聽的IP竟然是?0.0.0.0?,這是IPv4的!IPv6要用?::?。這次等我再次用手機流量訪問網站,果然就順利了許多。完全不需要什么電腦防火墻給開入站規則用管理員去權限嘛,直接就進來了。

知識點:

1.包含端口號的 IPv6 地址?http://[0:0:0:0:0:ffff:4137:270a]:9080/2.IPv6 監聽的?::?和 IPv4 的?0.0.0.0?等效3.IPv6 監聽的?::1?和 IPv4 的?127.0.0.1?等效,都是環回接口

什么是 DDNS

我想大家應該都清楚域名解析是什么,就是將不好記的IPv4地址變為好記的域名嘛。DDNS 多的D 呢,是 Dynamic ,顧名思義就是將我們老變的寬帶IP變成固定的域名訪問。

之前我們拿到了一串那么長的 IPv6 地址,不僅是分配的IP老變的問題,再說他也不好記啊。

這時,我們除了使用常見的 DDNS 服務商的服務外,我們也可以拿出我們程序猿之前給女朋友買的,那些便宜的,女朋友并不喜歡的,域名來,優勢當然就是,自己的域名,自己選的,想怎么解析前綴就怎么解析。

好的,那么假設你有一個阿里云域名(要已備案),通過?解析管理接口[2]?我們很容易就能自己做一個 DDNS 服務出來。

SSL證書自動申請

既然 DDNS 要自己整活,那之前寫的自動域名證書續簽服務也可以直接整合進來,做個新的工具。畢竟,現在是個網站都用 https 了。

證書自動申請這里使用的是?Certes[3]?庫來實現 Let’s Encrypt 證書的自動續簽。

Let’s Encrypt 是一個證書頒發機構(CA)。要從 Let’s Encrypt 獲取網站域名的證書,只需要證明對域名的實際控制權即可。有兩種驗證方式,通過域名解析添加 TXT 記錄,或是在網站添加指定的驗證文件(實現訪問指定地址返回要求的字符串即可,不過不支持有通配符的申請)。

那么假設你有一個域名,通過接口解析管理這也很好實現。

SangServerTool

將兩個功能整合成一個小工具,我起名叫?SangServerTool?,開源地址:https://github.com/marin1993/SangServerTool 。

依賴 .NET 跨平臺的特性,可以方便的在各種服務器上使用。

作為一個控制臺應用程序,在參數解析上使用?CommandLineParser[4]?這個命令行解析庫。這個庫提供了簡潔明了的 API,用于操作命令行參數和相關任務,并提供幫助界面。

03ea8a3351001779bc71f54d0a30ae46.png

CommandLineParser

SangServerTool 包含兩款工具:

?服務器 DDNS 工具,用于內網服務動態域名解析,支持 IPv6?服務器 SSL 證書申請工具

目前僅支持阿里云,其他云服務的實現可以自行添加。

提供獨立的?linux-x64、linux-arm、linux-arm64、win-x64 下載[5]。其他平臺可自行通過源碼編譯發布。

這個服務的啟動一般來說不需要一直運行。DDNS可以在設備開啟時檢測一次,以后每間隔一段時間檢測一次,如一小時。SSL證書申請,可以每天0點固定檢查一次即可,將要過期時,程序會自動進行續期,更新證書。注意 nginx 等服務需要重新加載一下證書,可配置?Certificate:okshell?來實現申請成功調用你指定的腳本文件。

工具的使用可以通過傳入不同的參數和配置文件來實現不同的功能。DDNS和SSL證書申請作為工具,只需要根據自己的需求設置好計劃任務即可,下面介紹這兩個功能的基本使用。

DDNS

參數說明:

參數說明
-c, --configRequired. Set config json file.
設置配置文件路徑
--delay(Default: 0) How many seconds delay?
啟動后延遲多少秒進行檢查處理,默認為 0,防止開機啟動過早導致出現一些問題
--del(Default: false) Is delete DDNS?
刪除配置文件中設置的DDNS域名解析,默認為 false ,如果為 true,則嘗試刪除后退出
--v6(Default: false) Is ipv6?
使用 IPv6 來解析,默認獲取 IPv4
--ip(Default: ) If set will be used. Otherwise automatically obtained.
You can set 'ifconfig', It will check from 'https://ifconfig.me/ip' to get you Internet IP.
默認為空字符,如果傳入了指定 IP ,則使用這個 IP 來解析。
可以傳入 'ifconfig' 值,該值則表示通過網絡獲取網絡出口 IP 來解析

如:使用本地的 IPv6 進行 DDNS 設置

SangServerTool ddns -c "test.json" --v6=1

如:刪除 DDNS 的域名解析

SangServerTool ddns -c "test.json" --del=1

該功能的配置文件使用?Access?和?DDNS?這兩段。

{"Access": {"AK": "阿里云 AccessKeyId",  //AccessKeyId"SK": "阿里云 AccessKeySecret" //AccessKeySecret},"DDNS": {"ddns": "xxx.domain.com",  // DDNS要解析的域名"basedomain": "domain.com"  // 主域名}
}

這一功能的核心其實是電腦網卡IP的獲取,需要判斷網卡的類型,排除回環和臨時和本地的 IPv6 地址(臨時IPv6不會第一個FirstOrDefault()就可以了)。

/// <summary>
/// 獲取電腦網卡IP
/// </summary>
/// <param name="isV6">是獲取IPv6</param>
/// <returns></returns>
public static string? CurrentIPAddress(bool isV6 = false)
{var family = isV6? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork;List<string> exps = new List<string> { "docker0", "lo", "l4tbr0" };var ips = NetworkInterface.GetAllNetworkInterfaces().Where(p => !exps.Contains(p.Name)) // 排除docker、lo等.Select(p => p.GetIPProperties()).SelectMany(p => p.UnicastAddresses).Where(p => p.Address.AddressFamily == family && !IPAddress.IsLoopback(p.Address));//IPv6 時去除本地的if (family == AddressFamily.InterNetworkV6){ips = ips.Where(p => !p.Address.IsIPv6LinkLocal);}return ips.FirstOrDefault()?.Address.ToString();
}

SSL

參數說明:

參數說明
-c, --configRequired. Set config json file.
設置配置文件路徑
--retry(Default: 2) How many retries?
驗證域名時重試幾次,默認2次
--delay(Default: 10) How many seconds to retry?
驗證域名時重試間隔多少秒,默認10秒

如:申請域名重試 3 次

SangServerTool ssl -c "test.json" --retry=3

該功能的配置文件使用?Access?、?Certificate?、?ACME?、CSR?,文章不詳細介紹配置文件,詳細配置文件說明可前往倉庫查閱。

在配置?Certificate?信息時:

?如果是新申請的只需要配置好證書?cerpath?和證書私鑰?privatekey?的存放路徑,程序會自行生成。若已經有證書會私鑰配置好其位置會自行更新證書或使用當前已有的私鑰。?domains?支持多個域名,使用空格隔開?okshell?證書更新后執行的腳本文件,如果服務器不能熱加載證書,記得配置好,通過腳本文件進行重啟服務

在配置?ACME?信息時:

?如果第一次使用僅需要寫上你的郵箱?email?和存放 ACME 賬戶的私鑰文件位置?account,證書過期會收到郵件提醒?如果之前已有賬戶,可以使用已有的賬戶私鑰,配置給?account

關于?CSR?,這段配不配都無所謂,畢竟是免費的證書,也不會生效,只是驗證了域名的歸屬權。

DDNS 配置使用示例

下面以 Jetson Nano 為例,演示其 DDNS 功能的配置使用。Windows 系統可通過“任務計劃程序”進行類似操作。

1.首先,前往倉庫的 releases 下載程序上傳到 Jetson Nano,然后添加執行權限。2.按照說明編寫自己的配置文件3.編寫開機啟動服務

sudo vi /etc/systemd/system/ddns.service

文件內容如下:

[Unit]
Description=SangServerTool DDNS
After=network.target
ConditionPathExists=/home/sangsq/.tools/SangServerTool[Service]
Type=forking
ExecStart=/home/sangsq/.tools/SangServerTool ddns -c /home/sangsq/.tools/config.json --v6=1 --delay=30
TimeoutSec=0
StandardOutput=journal+console
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

ConditionPathExists?為剛上傳的程序文件地址,當其存在這個服務才會啟動

ExecStart?這里要寫程序和配置文件的全路徑,在這里我用的是 IPv6 地址進行解析。保險起見,服務啟動后延遲 30 秒后開始執行,主要是接口查詢需要訪問阿里云服務器,剛啟動的時候,直接運行可能會報 DNS 解析的錯誤,也許使用?After=network-online.target?會解決,不過沒有測試這個。

1.設置開機啟動服務

sudo systemctl enable ddns.service

1.添加計劃任務

除了開機啟動外,我們也可以通過計劃任務,半個小時執行以下程序,檢查 IP 是否有變化。

sudo crontab -e

添加計劃任務

*/30  *  *  *  * /home/sangsq/.tools/SangServerTool ddns -c /home/sangsq/.tools/config.json --v6=1

這里去除了延遲的檢測,因為不是剛開機了。

1.其他

SSL 證書申請也可以通過計劃任務處理,每天 0 點檢查一次,如果服務器不能熱加載證書,記得在配置文件配置好?okshell?,來實現 web 服務器的重啟。

后記

這篇文章隨著軟件的開發迭代,修修改改,終于算是告一段落。后續好好整活這個臺小電腦,再補充寫一些其他的硬件設備。

目前手機的網絡應該是都有 IPv6 地址的,但是如果你使用的網絡只接入了 IPv4,那么你就不能訪問純IPv6的服務器。如果運營商支持,但是你的路由器不支持,你也是無法使用 IPv6 網絡的。如果你想檢測自己的 IPv6 可用性,可以訪問這個?IPv6 檢測網站[6]?。

References

[1]?FastTunnel:?https://gitee.com/Hgui/FastTunnel
[2]?解析管理接口:?https://help.aliyun.com/document_detail/29771.html
[3]?Certes:?https://github.com/fszlin/certes
[4]?CommandLineParser:?https://github.com/commandlineparser/commandline
[5]?linux-x64、linux-arm、linux-arm64、win-x64 下載:?https://github.com/marin1993/SangServerTool/releases/latest
[6]?IPv6 檢測網站:?http://test-ipv6.com/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284911.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

匯編學習(一)

看的是王爽老師的《匯編語言》第三版基礎知識 一.匯編語言的誕生上古時期在匯編語言還未出現的時候&#xff0c;那時的程序員還只能用二進制也就是所謂的機器語言寫代碼&#xff0c;將0和1編成的程序代碼打在紙帶或卡片上&#xff0c;再將紙帶卡片輸入計算機&#xff0c;進行運…

Java 網絡編程1

talnet工具與Socket類 如今單機的程序已經不太能適合用戶的需要&#xff0c;網絡編程變得比以往更加重要。首先需要認識一下talnet工具&#xff0c;可以使用該工具來連接服務器在終端中輸入,可以進入本地的80端口 talnet 127.0.0.1 80 需要我們輸入ip地址和端口號&#xff0c;使…

【GIS風暴】GeoJSON數據格式案例全解

在了解GeoJSON數據之前,先來通過一個網站和一個簡單的代碼案例,看一下GeoJSON的神奇魅力吧! 網站:http://geojson.io 打開上述網站,在左側的代碼區域粘入中國區域GeoJSON代碼,如下所示: 中國地圖: 地名:

mysqldump參數大全

參數 參數說明 --all-databases , -A 導出全部數據庫。 mysqldump -uroot -p --all-databases --all-tablespaces , -Y 導出全部表空間。 mysqldump -uroot -p --all-databases --all-tablespaces --no-tablespaces , -y 不導出任何表空間信息。 mysqldump -uroot -p --a…

[轉]2020年5月程序員工資統計,平均14542元

平均工資 2020年5月全國招收程序員312761人。2020年5月全國程序員平均工資14542元&#xff0c;工資中位數12500 元&#xff0c;其中95%的人的工資介于5250元到35000元。 一線城市工資 2020年5月北京招收軟件工程師24478人。2019年5月北京軟件工程師平均工資19273元&#xff0…

云原生IDE:iVX免費的首個通用無代碼開發平臺

一、iVX簡單介紹 1、iVX是什么東東? iVX 是一個 “零代碼” 的可視化編程語言&#xff0c;擁有方便的 在線集成開發環境 &#xff0c;不需要下載開發環境&#xff0c;打開瀏覽器即可隨時隨地的進行項目編輯&#xff1b;iVX 擁有 “一站式” 的云資源&#xff0c;通過這一套一…

.NET GC工作流程

前言在上文[如何獲取GC的STW時間]一文中&#xff0c;我們聊到了如何通過監聽GC發出的診斷事件來計算STW時間。里面只簡單的介紹了幾種GC事件和它的流程。群里就有小伙伴在問&#xff0c;那么GC事件是什么時候產生的&#xff1f;分別是代表什么含義&#xff1f;那么在本文就通過…

libco協程庫源碼解讀

2019獨角獸企業重金招聘Python工程師標準>>> 協程,又被稱為用戶級線程,是在應用層被調度,可以減少因為調用系統調用而阻塞的線程切換的時間.目前有很多協程的實現,由于微信內部大量使用了其直研的的libco協程庫&#xff0c;所以我選擇了騰訊開源的libco協程庫進行研…

【ArcGIS風暴】如何將矢量數據(點、線、面)折點坐標轉為GeoJSON格式?

本文以案例的形式,講述在ArcGIS和QGIS專業軟件中,將矢量數據轉為GeoJSON的方法。 擴展閱讀:【GIS風暴】GeoJSON數據格式案例全解 文章目錄 一、ArcGIS將矢量數據轉為GeoJSON二、QGIS將矢量數據轉為GeoJSON一、ArcGIS將矢量數據轉為GeoJSON ArcGIS中提供的【要素轉JSON】工具…

TypeScript 3.9 正式發布!平均編譯時長從 26 秒縮短至 10 秒

作者 | 微軟官方博客 譯者 | 核子可樂 策劃 | 小智 稿源 | 前端之巔 今天&#xff0c;微軟在其官方博客宣布&#xff1a;TypeScript 3.9 版本已經正式發布&#xff0c;詳情見下文。 有些朋友可能對 TypeScript 還不太熟悉&#xff0c;這是一種以 JavaScript 為基礎開發的語…

(二)Harbor WEB的使用

接上一篇《安裝Harbor》&#xff0c;安裝好之后&#xff0c;接下來我們就進行Harbor web界面的操作吧&#xff01; 轉載請標明出處&#xff1a;http://www.cnblogs.com/huangjc/p/6270405.html 瀏覽器登陸Harbor&#xff08;默認用戶密碼&#xff1a;admin/Harbor12345&#x…

iVX低代碼平臺系列制作簡單的登錄界面

一、前言 iVX是啥&#xff0c;不理解的小伙伴可以猛戳這里 ----------------------點我 二、iVX平臺和現有編程語言的對比 三、iVX平臺和現有編程語言的對比 1、快速學習&#xff08;周期短&#xff09; iVX邏輯上相對是比較簡單的 所以初學者的話只需要從邏輯和具體功…

【CASS精品教程】CASS9.1等高線的繪制完整案例教程

在地形圖中,等高線是表示地貌起伏的一種最重要的手段。在CASS成圖時,可自動生成精度高的等高線,本文講解CASS9.1生成等高線的完整操作流程。 文章目錄 1. 展高程點2. 建立數字地面模型3. 修改數字地面模型4. 繪制等高線5. 等高線的修飾6. 繪制三維模型擴展閱讀: ArcGIS實驗…

Process.Start 為什么會引發“系統找不到指定的文件”異常

前言偶然發現&#xff0c;如果想用如下代碼在 .NET 6 中打開指定 URL&#xff1a;Process.Start("https://baidu.com");會引發異常&#xff1a;而同樣的代碼在 .NET Framework 中是可以正常執行的。難道&#xff0c;.NET 6 下的實現邏輯不一樣&#xff1f;深入探究通…

JVM 類型的生命周期學習

Java虛擬機通過裝載、連接和初始化一個JAVA類型&#xff0c;使該類型可以被正在運行的JAVA程序所使用&#xff0c;其中&#xff0c;裝載就是把二進制形式的JAVA類型讀入JAVA虛擬機中&#xff1b;而連接就是把這種讀入虛擬機的二進制形式的類型數據合并到虛擬機的運行時狀態中去…

js對象數組中的某屬性值 拼接成字符串

var arr[{id: "600", pId: null, name: "圖形的變化"},{id: "630", pId: "600", name: "投影與視圖"},{id: "631", pId: "630", name: "投影"},{id: "632", pId: "630",…

898A. Rounding#數的舍入

題目出處&#xff1a;http://codeforces.com/problemset/problem/898/A 題目大意&#xff1a;找一個數最近的整十的數 #include<iostream> using namespace std; int main(){int a,b;cin>>a;ba;while(1){if(a%100){cout<<a<<endl;return 0;}if(b%100){…

開店星簡直就是國內優秀的開源商城系統天花板

一、場景 1、大學生畢業設計做商城系統背景 好家伙、又到開學季節了&#xff0c;師妹讓我幫忙給指導大四的項目&#xff0c;作為畢業設計和為后面找工作積累項目經驗&#xff0c;要搞一個買賣二手閑置品的商城小程序和PC端商城、希望能夠快速學習、接入、修改部分功能&#xff…

【CASS精品教程】CASS9.1土方量的計算方法匯總

CASS9.1中,計算土方量的方法有:DTM法土方計算、斷面法進行土方量計算、方格網法土方計算、等高線法土方計算、區域土方量平衡等。本文以案例的形式,詳細講解土方量的計算過程。 文章目錄 一、DTM法土方計算二、斷面法進行土方量計算三、方格網法土方計算四、等高線法土方計算…

html標簽缺省(自帶)樣式大全

html標簽默認樣式整理 作者&#xff1a;佚名 來源&#xff1a;互聯網 時間&#xff1a;07-30 16:54:48 文為大家整理了html標簽默認樣式屬性及瀏覽器默認樣式等等&#xff0c;喜歡css布局的朋友們可以學下&#xff0c;希望對大家有所幫助html, address,blockquote,body, dd, …