BIND9 允许您使用dlopen
驱动程序在运行时链接动态可加载区域 (DLZ) 模块。此功能的单元测试通过了我的环境,但是当我尝试named
使用链接的已编译共享对象文件运行时,出现此错误:
dlz_dlopen failed to open library '/usr/lib/dlz_example.so' - /usr/lib/dlz_example.so: failed to map segment from shared object
我已经在 BIND9 GitLab here中打开了一张票,其中包含有关我的特定问题的详细信息。
更一般地说,我想知道人们在尝试加载共享对象或使用 DLZ 模块时是否对常见问题有任何洞察力。我的直觉是我不了解它们的工作原理,并且有一些愚蠢的错误配置导致了这个问题。当然,调试技巧也很受欢迎。
ISC 知识库页面“在 BIND 中使用 DLZ”:https ://kb.isc.org/docs/aa-00995
因此,您使用的是 Debian 或 Ubuntu,它们默认启用 AppArmor 并限制
named
守护进程可以读取、写入、mmap 或执行的位置。任何从“错误”位置加载模块的尝试都将被内核拒绝并登录dmesg
。默认策略位于
/etc/apparmor.d/usr.sbin.named
且仅允许两个位置:/usr/lib/bind/*.so rm
– 对于大多数打包模块/{usr/,}lib/@{multiarch}/samba/bind9/*.so rm
– 适用于 Samba AD DC 区域可以进行自定义添加
/etc/apparmor.d/local/usr.sbin.named
(如文件底部的#include 语句所示)。该文件没有任何开始/结束分隔符,只有附加规则本身,例如:要在编辑后重新加载配置文件,请使用: