我知道 Netlink 是在 Linux 中通信内核和用户空间的现代且正确的方式。
我有一个需要可配置的内核模块,所以我使用 Netlink 让它与用户空间应用程序通信。
一切都很神奇,但在我看来,任何用户都可以与我的模块交谈。我可以使用权限等锁定应用程序,但该项目是开源的,因此任何用户都可以轻松编译用户空间应用程序。因此,任何用户都可以配置我的内核。这对我来说并不合适。
似乎我在这里遗漏了一些非常重要的东西,但我找到的 Netlink 文档都是关于如何让它运行的,而不是它如何适应现实世界。
如何限制对模块的 Netlink 套接字的访问?如果这是不可能的,还有什么可以做的呢?
我有几个需要与用户空间交互的内核模块。因此,每个模块都有一个 Netlink 套接字。
我的问题是这些套接字相互干扰。这是因为它们都注册到同一个 Netlink 地址族(因为一开始可用的地址族不多 - 最大值为 32,并且超过一半已经被保留),而且因为它们都将自己绑定到相同的 pid(内核 pid - 零)。
我希望地址家族有更多的空间。或者,更好的是,我希望可以将我的套接字绑定到其他 pid。如果一次只能打开 32 个套接字,为什么 Netlink 是首选的用户内核通道?
netlink 地址(端口)由 32 位整数组成。端口 0(零)是为内核保留的,指的是每个 netlink 协议族的内核端套接字。其他端口号通常指用户空间拥有的套接字,尽管这不是强制的。
最后一个说法现在看来是一个谎言。内核使用常量作为 pid,并且不导出更多通用函数:
if (netlink_insert(sk, 0))
goto out_sock_release;
Run Code Online (Sandbox Code Playgroud)
我想我可以重新编译内核并增加地址族限制。但这些是内核模块;我不应该这样做。
我错过了什么吗?