跳至主要内容

原生模組(開發者)

一般用途不需要模組。本指南適用於想要使用本機程式庫擴充 Windows 或 Linux 服務的功能的開發人員和管理員。此模組在具有服務權限的服務內運作。僅安裝受信任的程式碼並保留管理員擁有的模組檔案、依賴項和設定檔。

載入模組​

該服務從設定檔旁邊的 modules.d 目錄讀取 *.conf 檔案。預設位置是:

作業系統模組設定位置庫格式
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

在每個檔案中,寫入庫的絕對路徑,每行一個。例如/etc/mudfish-dns/modules.d/10-policy.conf的內容為:

/usr/lib/mudfish-dns/modules/policy.so

按檔案名稱順序讀取,並在每個檔案內按行順序讀取。空白行和以 # 開頭的行將被忽略。不要將路徑括在引號中或使用環境變數或行尾註解。這些表達式不被解釋。在Windows中,在檔案中寫入整個絕對路徑,包括帶有空格的路徑。

新增、變更或刪除模組後,重新啟動服務。 Linux 使用下列指令:

sudo systemctl restart mudfish-dns.service

對於 Windows,在服務管理中重新啟動 Mudfish DNS 服務。應用程式中的 啟動 DNS 、 停止 DNS 和 應用設定 不會重新載入模組。如果無法讀取設定檔、路徑不正確或發生載入和初始化錯誤,服務將無法啟動。允許缺少或空的模組目錄。

在開發過程中,您可以重複指定--module參數以按參數順序載入庫。在這種情況下,它取代了 modules.d 自動載入。 --config FILE 也會更改設定檔旁邊的模組目錄位置。 --restore-dns 在不載入任何模組的情況下執行復原。

鉤子實現​

讀取mudfish_dns_module.h header或下載mudfish_dns_module.h。此標頭定義了模組使用的結構、掛鉤、操作和資料生命週期規則。本指南使用 C ABI v2。將mudfish_dns_module_init_v2()匯出到外部,在裝鉤前用MUDFISH_DNS_MODULE_ABI_V2檢查通過的結構尺寸。如果初始化成功,則傳回0。

掛鉤通話時間
on_dns_query接受解析的查詢後,查詢或轉送快取之前。
on_dns_response選擇回應後,將其儲存在快取中或將其傳回給客戶端之前。緩存的響應也會通過這個鉤子。
on_web_hello在初始 HTTP Host/TLS SNI 測試之後,在連接或處理初始資料之前。
on_web_data讀取後續客戶端資料或伺服器資料之後,但在傳輸之前。

DNS操作​

v2 DNS 掛鉤 成功時返回 0 並設定 result->action。

操作效果
MUDFISH_DNS_CONTINUE繼續正常處理下一個模組。
MUDFISH_DNS_ALLOW結束目前鉤鏈並繼續正常的 DNS 查詢或傳回選定的回應。
MUDFISH_DNS_BLOCK返回 REFUSED。
MUDFISH_DNS_DROPDNS 丟棄而不發送回應。
MUDFISH_DNS_ANSWER使用您提供的位址 IPv4/IPv6 和 TTL 產生回應。
MUDFISH_DNS_REPLACE它使用 模組提供的完整 DNS 有線格式回應。

v2 DNS 不要直接從鉤子返回操作常數。如果函數傳回 0 以外的值或結果無效,則引發 SERVFAIL。 ALLOW 目前僅終止鉤鏈,不會繞過網域規則、通訊方法接受或憑證檢查。除 DROP 之外的查詢結果也會經過回應掛鉤。

Webhook 直接返回 MUDFISH_DNS_CONTINUE 或 MUDFISH_DNS_REJECT。如果網路請求被拒絕,連線將被終止。 Webhook 需要開啟 Web 保護,且解密的 HTTPS 內容不可用。

緩衝區、執行緒、快取​

輸入事件和緩衝區是唯讀的,並且僅在回調執行期間有效。回退響應必須使用模組擁有的內存,並且必須保持有效,直到該模組的下一次回調或退出。不要傳回從堆疊記憶體或事件借用的指標。 DNS ID、opcode,備用回應中的問題必須與原始查詢相符。來自一個實例的回調會依序執行,但可以從不同的執行緒呼叫。保持回調簡短,並且不要跨 ABI 邊界傳播異常。

建立、替換、阻塞和處置的結果不會儲存在主機快取中。替換快取的回應不會更改原始快取條目。主機清除替換回應中的 AD 標誌,並且不執行任何 DNSSEC 驗證或重新簽署。修改簽章資料的模組必須自行處理無效的簽章。

範例和標題​

下面的頁麵包含完整的範例原始程式碼和必要的標題。無需單獨下載 Mudfish DNS 原始碼樹。

文件內容
policy.c — DNS 策略範例DNS 允許、封鎖、丟棄查詢,產生回應 IP,更改回應位址和 TTL。還包括 Linux 建置和測試命令。
mudfish_dns_module.h — 模組頭ABI 聲明、掛鉤簽章、操作常數和緩衝區所有權規則。

建置之前,將 policy.c 和 mudfish_dns_module.h 下載到同一目錄。範例中的建置命令建立庫 Linux 和 .so。