跳到主要内容

原生模块(开发者)

一般用途不需要模块。本指南适用于想要使用本机库扩展 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。