原生模块(开发者)
一般用途不需要模块。本指南适用于想要使用本机库扩展 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 头文件或下载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 线格式响应。 |
v2 DNS 不要直接从钩子返回操作常量。如果函数返回 0 以外的值或结果无效,则引发 SERVFAIL。 ALLOW 目前仅终止钩链,不会绕过域规则、通信方法接受或证书检查。除 DROP 之外的查询结果也会经过响应挂钩。
Web 钩子 直接返回 MUDFISH_DNS_CONTINUE 或 MUDFISH_DNS_REJECT。如果网络请求被拒绝,连接将被终止。 Web 钩子 需要打开 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 库。