KSMBD - SMB3 内核服务器¶
KSMBD 是一个 Linux 内核服务器,它在内核空间中实现 SMB3 协议,用于通过网络共享文件。
KSMBD 架构¶
与性能相关的操作子集位于内核空间中,而其他与性能无关的操作子集位于用户空间中。因此,历史上导致大量缓冲区溢出问题和危险的安全漏洞的 DCE/RPC 管理以及用户帐户管理在用户空间中作为 ksmbd.mountd 实现。与性能相关的文件操作(打开/读取/写入/关闭等)在内核空间 (ksmbd) 中进行。这也允许更容易地与 VFS 接口集成,以进行所有文件操作。
ksmbd (内核守护进程)¶
当服务器守护进程启动时,它会在初始化时启动一个 forker 线程(ksmbd/接口名称),并打开一个专用的端口 445 来监听 SMB 请求。每当新客户端发出请求时,Forker 线程将接受客户端连接,并为客户端和服务器之间的专用通信通道 fork 一个新线程。它允许并行处理来自客户端的 SMB 请求(命令),并允许新客户端建立新连接。每个实例都被命名为 ksmbd/1~n(端口号) 以指示已连接的客户端。根据 SMB 请求类型,每个新线程都可以决定将命令传递到用户空间 (ksmbd.mountd),目前 DCE/RPC 命令被识别为通过用户空间处理。为了进一步利用 Linux 内核,已选择将命令作为 workitems 处理并在 ksmbd-io kworker 线程的处理程序中执行。它允许处理程序的多路复用,因为内核会在负载增加时负责启动额外的 worker 线程,反之,如果负载减少,它会销毁额外的 worker 线程。因此,在与客户端建立连接后,专用的 ksmbd/1..n(端口号) 完全拥有接收/解析 SMB 命令的所有权。每个接收到的命令都是并行处理的,即,可以有多个并行处理的客户端命令。在接收到每个命令后,将为每个命令准备一个单独的内核 workitem,该 workitem 将进一步排队以由 ksmbd-io kworkers 处理。因此,每个 SMB workitem 都会排队到 kworkers。这允许默认内核最佳地管理负载共享,并通过并行处理客户端命令来优化客户端性能。
ksmbd.mountd (用户空间守护进程)¶
ksmbd.mountd 是一个用户空间进程,用于传输使用 ksmbd.adduser 注册的用户帐户和密码(用户空间 utils 的一部分)。此外,它还允许将从 smb.conf 解析的共享信息参数传递给内核中的 ksmbd。对于执行部分,它有一个守护进程,该守护进程持续运行并通过 netlink 套接字连接到内核接口,它等待请求(dcerpc 和共享/用户信息)。它处理 RPC 调用(至少几十个),这些调用对于来自 NetShareEnum 和 NetServerGetInfo 的文件服务器最重要。完整的 DCE/RPC 响应从用户空间准备好,并传递给客户端的相关内核线程。
KSMBD 功能状态¶
功能名称 |
状态 |
---|---|
方言 |
支持。SMB2.1、SMB3.0、SMB3.1.1 方言(有意排除存在安全漏洞的 SMB1 方言)。 |
自动协商 |
支持。 |
复合请求 |
支持。 |
Oplock 缓存机制 |
支持。 |
SMB2 租约 (v1 租约) |
支持。 |
目录租约 (v2 租约) |
支持。 |
多重信用 |
支持。 |
NTLM/NTLMv2 |
支持。 |
HMAC-SHA256 签名 |
支持。 |
安全协商 |
支持。 |
签名更新 |
支持。 |
预身份验证完整性 |
支持。 |
SMB3 加密 (CCM, GCM) |
支持。(支持 CCM/GCM128 和 CCM/GCM256) |
SMB direct (RDMA) |
支持。 |
SMB3 多通道 |
部分支持。计划在未来实现重放/重试机制。 |
接收端缩放模式 |
支持。 |
SMB3.1.1 POSIX 扩展 |
支持。 |
ACL |
部分支持。仅提供 DACL,SACL(审计)计划在未来实现。对于所有权(SID),ksmbd 生成随机 subauth 值(然后将其存储到磁盘),并使用从 inode 获取的 uid/gid 作为本地域 SID 的 RID。当前的 acl 实现仅限于独立服务器,而不是域成员。正在与 Samba 工具进行集成,以便将来支持作为域成员运行。 |
Kerberos |
支持。 |
持久句柄 v1,v2 |
计划在未来实现。 |
持久句柄 |
计划在未来实现。 |
SMB2 通知 |
计划在未来实现。 |
稀疏文件支持 |
支持。 |
DCE/RPC 支持 |
部分支持。通过来自 ksmbd.mountd 的 netlink 接口处理文件服务器所需的一些调用(NetShareEnumAll、NetServerGetInfo、SAMR、LSARPC)。正在研究通过 upcall 与 Samba 工具和库进行进一步集成,以支持其他 DCE/RPC 管理调用(以及未来对 Witness 协议的支持,例如)。 |
ksmbd/nfsd 互操作性 |
计划在未来实现。ksmbd 支持的功能包括租约、通知、ACL 和共享模式。 |
SMB3.1.1 压缩 |
计划在未来实现。 |
基于 QUIC 的 SMB3.1.1 |
计划在未来实现。 |
基于 RDMA 的签名/加密 |
计划在未来实现。 |
SMB3.1.1 GMAC 签名支持 |
计划在未来实现。 |
如何运行¶
下载 ksmbd-tools(https://github.com/cifsd-team/ksmbd-tools/releases)并编译它们。
请参阅 README(https://github.com/cifsd-team/ksmbd-tools/blob/master/README.md),了解如何使用 ksmbd.mountd/adduser/addshare/control utils
$ ./autogen.sh $ ./configure --with-rundir=/run $ make && sudo make install
创建 /usr/local/etc/ksmbd/ksmbd.conf 文件,并在 ksmbd.conf 文件中添加 SMB 共享。
请参阅 ksmbd-utils 中的 ksmbd.conf.example,有关配置共享的详细信息,请参阅 ksmbd.conf 手册页。
$ man ksmbd.conf
为 SMB 共享创建用户/密码。
请参阅 ksmbd.adduser 手册页。
$ man ksmbd.adduser $ sudo ksmbd.adduser -a <输入用于 SMB 共享访问的用户名>
在构建内核后插入 ksmbd.ko 模块。如果 ksmbd 已构建到内核中,则无需加载该模块。
- 在 menuconfig 中设置 ksmbd(例如 $ make menuconfig)
- [*] 网络文件系统 --->
<M> SMB3 服务器支持(实验性)
$ sudo modprobe ksmbd.ko
启动 ksmbd 用户空间守护进程
$ sudo ksmbd.mountd
使用 SMB3 客户端(cifs.ko 或 samba 的 smbclient)从 Windows 或 Linux 访问共享
关闭 KSMBD¶
- 杀死用户和内核空间守护进程
# sudo ksmbd.control -s
如何打开调试打印¶
每一层 /sys/class/ksmbd-control/debug
- 启用所有组件打印
# sudo ksmbd.control -d “all”
- 启用其中一个组件 (smb, auth, vfs, oplock, ipc, conn, rdma)
# sudo ksmbd.control -d “smb”
- 显示启用了哪些打印。
- # cat /sys/class/ksmbd-control/debug
[smb] auth vfs oplock ipc conn [rdma]
- 禁用打印
如果您再次尝试选择的组件,它将在没有方括号的情况下禁用。