BIND9 可讓您在執行時間使用驅動程式連結動態可載入區域 (DLZ) 模組dlopen
。此功能的單元測試在我的環境中通過,但是當我嘗試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 中開票了這裡,其中包括有關我的具體問題的詳細資訊。
更一般地說,我想知道人們是否對嘗試載入共享物件時的常見問題有任何見解,或者有使用 DLZ 模組的經驗。我的預感是,我不了解它們的工作原理,並且存在一些愚蠢的錯誤配置導致了該問題。當然,調試技巧也值得讚賞。
ISC 知識庫頁面「在 BIND 中使用 DLZ」:https://kb.isc.org/docs/aa-00995
答案1
因此,您使用的是 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 語句所示)。該檔案沒有任何開始/結束分隔符,只有附加規則本身,例如:
/usr/local/lib/*.so rm,
若要在編輯後重新載入設定文件,請使用:
apparmor_parser --replace /etc/apparmor.d/usr.sbin.named