本文主要介紹 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
一觀:
果然比沙子還多,誠不欺我。但當我拿出之前的 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,用于操作命令行參數和相關任務,并提供幫助界面。
SangServerTool 包含兩款工具:
?服務器 DDNS 工具,用于內網服務動態域名解析,支持 IPv6?服務器 SSL 證書申請工具
目前僅支持阿里云,其他云服務的實現可以自行添加。
提供獨立的?linux-x64、linux-arm、linux-arm64、win-x64 下載[5]。其他平臺可自行通過源碼編譯發布。
這個服務的啟動一般來說不需要一直運行。DDNS可以在設備開啟時檢測一次,以后每間隔一段時間檢測一次,如一小時。SSL證書申請,可以每天0點固定檢查一次即可,將要過期時,程序會自動進行續期,更新證書。注意 nginx 等服務需要重新加載一下證書,可配置?Certificate:okshell
?來實現申請成功調用你指定的腳本文件。
工具的使用可以通過傳入不同的參數和配置文件來實現不同的功能。DDNS和SSL證書申請作為工具,只需要根據自己的需求設置好計劃任務即可,下面介紹這兩個功能的基本使用。
DDNS
參數說明:
參數 | 說明 |
-c, --config | Required. 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, --config | Required. 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/