原生模組(開發者)
一般用途不需要模組。本指南適用於想要使用本機程式庫擴充 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(),並在填入掛鉤前確認 ABI 版本為 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_DROP | DNS 丟棄而不發送回應。 |
MUDFISH_DNS_ANSWER | 使用您提供的位址 IPv4/IPv6 和 TTL 產生回應。 |
MUDFISH_DNS_REPLACE | 它使用 模組提供的完整 DNS 線路格式(wire format)回應。 |
v2 DNS 不要直接從鉤子返回操作常數。如果函數傳回 0 以外的值或結果無效,則引發 SERVFAIL。 ALLOW 目前僅終止鉤鏈,不會繞過網域規則、通訊方法接受或憑證檢查。除 DROP 之外的查詢結果也會經過回應掛鉤。
網頁掛鉤 直接返回 MUDFISH_DNS_CONTINUE 或 MUDFISH_DNS_REJECT。如果網路請求被拒絕,連線將被終止。 網頁掛鉤 需要開啟 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 程式庫。