[食譜好菜] 用 C# 搭配 DNS 套件寫一個 DNS 服務

拜讀了一篇圖文並茂講解 DNS 查詢的文章之後,覺得好像可以自己動手寫一個 DNS 服務,但其實 Windows Server 幾乎都已經內建 DNS 服務,即使是 Linux 也有相對應的 DNS 套件,裝一下就可以用了,所以這篇文章雖然說要撰寫一個 DNS 服務,不過也就是當好玩,拿來練練手而已。

站在巨人的肩膀 - DNS 套件

要自製 DNS 服務我們大可不必從頭開始,到前人輩們留下來的武器庫 NuGet 搜尋 DNS,沒意外的話第一名就是 DNS 這個套件了,那它不只有 Server 相關的 API,也有 Client 相關的 API,所以它拿來向其他的 DNS 伺服器發送查詢也是可以的。

起手式

不過這篇文章的重點是 DNS Server,所以 DNS Client 的部分就不多介紹,那麼要用 DNS 套件建立一個 DNS 服務,只需要幾行程式碼就可以了。

var masterFile = new MasterFile();
var dnsServer = new DnsServer(masterFile, "1.1.1.1");

await dnsServer.Listen(ip: IPAddress.Parse("192.168.1.168"));

MasterFile

首先,我們大多時候會需要 MasterFile,它是用來記錄我們自訂 DNS Record 的地方,舉例來說,如果我想要把 www.google.com 的實際 IP 位址解析為 127.0.0.1,我們就可以這樣寫:

MasterFile.AddIPAddressResourceRecord(Domain.FromString("www.google.com"), IPAddress.Parse("127.0.0.1"));

查詢 www.google.com 時,回答的 IP 位址就變成了 127.0.0.1。

DnsServer

再來,我們要建立 DnsServer 的實例,第一個參數就是我們剛剛建立的 MasterFile,第二個參數是 EndServer,EndServer 的意思就是說當從 MasterFile 查詢不到記錄的時候,最終要向誰查詢,那我範例中的設定是 1.1.1.1,這是 Cloudflare 的 DNS 服務。

在 DnsServer 的建構式多載方法中,MasterFile 及 EndServer 可以二擇一,所以如果我們只傳入 MasterFile,那除了我們自訂的 DNS 記錄之外,其他的都查不到。

var dnsServer = new DnsServer(masterFile);

目前我還想不到自製 DNS 服務,它能應用在哪裡?如果有這方面經驗的朋友,感謝不吝分享,希望這一篇文章能幫助到大家對 DNS 有更進一步的了解。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學