
RustNfsSvc 是一个高性能的 Windows NFS网络文件系统服务器使用 Rust 编写。支持 NFSv3、NFSv4.1 和 NFSv4.2使 Linux/Unix 客户端能够透明挂载 Windows 目录。功能特性NFSv3— 完整协议支持MOUNT、PORTMAP、NFSv3 过程NFSv4.1— COMPOUND 操作、SEQUENCE、OPEN、CLOSE、READ、WRITE、READDIR、LOCK/LOCKU、SETATTR 等NFSv4.2— READ_PLUS、COPY、SEEK、CLONE以及 RFC 7862 定义的 9 个 stub 操作原生 Windows 服务— 可安装/卸载为 Windows 服务支持开机自启双栈 NFS— 在同一端口2049上同时运行 NFSv3、NFSv4.1 和 NFSv4.2MOUNT 协议— NFSv3 MOUNT 协议端口 20048PORTMAP— RPC 端口映射服务端口 111TCP UDP异步 I/O— 基于 Tokio 构建支持高并发灵活配置— 基于 TOML 的配置文件支持按导出目录的访问控制CIDRTLS 加密— 内置 TLS 支持rustls加密 NFS 传输流量SEC-015结构化日志— 滚动日志文件可配置日志级别和轮转策略项目结构RustNfsSvc/ ├── src/ │ ├── main.rs # 入口CLI 参数解析install/uninstall/service/独立运行 │ ├── path_ext.rs # Windows \\?\ 扩展路径辅助MAX_PATH 修复 │ ├── service.rs # Windows 服务生命周期通过 sc.exe 安装/卸载运行模式 │ ├── config.rs # 配置加载与验证 │ ├── exports.rs # 导出目录管理与文件句柄解析 │ ├── logging.rs # 日志初始化与轮转 │ └── nfs/ │ ├── mod.rs # 统一 NFS 服务器TCP UDPv3 v4TLS │ ├── nfs4.rs # NFSv4.1/4.2 协议实现约 4100 行 │ ├── protocol.rs # NFSv3 协议实现 │ ├── mount.rs # MOUNT 协议v1/v3 │ └── portmap.rs # PORTMAP / RPCBIND 服务 ├── build.rs # 构建脚本 ├── config.example.toml # 配置示例 ├── install.bat # 一键安装脚本 ├── uninstall.bat # 一键卸载脚本 ├── Cargo.toml # 包清单 ├── README_zh.md # 中文说明文档 └── README.md # 英文说明文档快速开始前置要求Rust 1.70从 rustup.rs 安装Windows 10/11 或 Windows Server 2016Visual Studio Build ToolsC 工作负载构建cargobuild--release编译产物位于target/release/rustnfssvc.exe。配置如果在rustnfssvc.exe同目录下存在config.toml将作为默认配置使用。复制示例配置并编辑copy config.example.tomlC:\ProgramData\RustNfsSvc\config.toml编辑C:\ProgramData\RustNfsSvc\config.toml设置导出路径和客户端访问规则。运行独立运行模式用于测试rustnfssvc.exe作为 Windows 服务运行需要管理员权限:: 安装 install.bat :: 启动 net start rustnfssvc :: 停止 net stop rustnfssvc :: 卸载 uninstall.bat配置说明配置文件从C:\ProgramData\RustNfsSvc\config.toml加载。完整配置参考见config.example.toml。[nfs] listen_address 0.0.0.0:2049 enable_v3 true enable_v4 true threads 4 bind_ip 0.0.0.0 # 绑定到特定 IP 以增强安全性 max_connections 128 # 全局并发连接上限 max_conn_rate_per_ip 60 # 单 IP 连接速率限制每 60s 窗口 enable_udp true # 启用 UDP使用 TLS 时建议设为 false [tls] # SEC-015TLS 加密 enabled false cert_path # PEM 证书路径启用时必填 key_path # PEM 私钥路径PKCS8 或 PKCS1 RSA 均可 [[exports.entries]] path C:\\Shared alias shared allowed_clients [192.168.1.0/24] options [rw, sync, no_subtree_check] [logging] level info file C:\\ProgramData\\RustNfsSvc\\logs\\rustnfssvc.log max_log_size_mb 100 max_log_files 10导出选项选项说明rw读写访问默认ro只读访问sync同步写入async异步写入no_subtree_check禁用子树检查性能更好insecure允许来自 ≥ 1024 端口的连接no_root_squash允许 root 用户以 root 身份访问文件TLS 加密配置RustNfsSvc 支持内置 TLS 加密 NFS TCP 流量。启用后服务器使用rustlsring 后端加密所有 NFS/MOUNT/PORTMAP TCP 连接。启用 TLS生成证书— 为服务器创建 PEM 格式的证书和私钥# 使用 OpenSSLopenssl req-x509-newkeyrsa:2048-keyoutserver.key-outserver.crt-days365-nodes\-subj/CNnfs-server-addextsubjectAltNameIP:192.168.1.1# 将密钥转为 PKCS8 格式rustls 推荐openssl pkcs8-topk8-nocrypt-inserver.key-outserver.key.pkcs8配置— 编辑config.toml[tls] enabled true cert_path C:/etc/rustnfssvc/server.crt key_path C:/etc/rustnfssvc/server.key # 接受 PKCS8 或 PKCS1 RSA 格式禁用 UDP— TLS 仅支持 TCP。启用 TLS 时设置enable_udp false。重启服务— 重启使 TLS 生效。客户端使用 stunnel 挂载Linux NFS 客户端原生不支持 TLS。使用stunnel建立加密隧道在客户端Linux上安装 stunnelsudoaptinstallstunnel4# Debian/Ubuntusudoyuminstallstunnel# RHEL/CentOS创建/etc/stunnel/nfs.conf[nfs] client yes accept 127.0.0.1:2049 connect 服务器IP:2049 verifyChain yes CApath /etc/ssl/certs ; 或直接指定服务器证书 ; CAfile /path/to/server.crt启动 stunnelsudosystemctl start stunnel4通过本地隧道挂载sudomount-tnfs4-overs4,minorversion1127.0.0.1:/别名/mnt/shared注意使用 stunnel 时NFS 挂载地址始终是127.0.0.1本地隧道端点而非服务器的真实 IP。服务器端使用 stunnel替代方案如果不使用内置 TLS也可以在服务器端运行 stunnel 来包装 NFS 端口在服务器Windows上从 stunnel 官网 下载 Windows 版本。创建stunnel.conf[nfs] accept 2049 connect 127.0.0.1:12049 cert C:/etc/rustnfssvc/server.crt key C:/etc/rustnfssvc/server.key配置 RustNfsSvc 监听内部端口[nfs] listen_address 127.0.0.1:12049先启动 stunnel再启动 RustNfsSvc。stunnel 将加密端口 2049 上的流量并转发到内部 NFS 端口。客户端挂载NFSv4.2推荐sudomount-tnfs4-overs4,minorversion2服务器IP:/别名/mnt/sharedNFSv4.1sudomount-tnfs4-overs4,minorversion1服务器IP:/别名/mnt/sharedNFSv3sudomount-tnfs-overs3服务器IP:/别名/mnt/shared验证ls/mnt/sharedechohello from NFS/mnt/shared/test.txt架构┌─────────────────────┐ Linux NFS 客户端 ───│ NFSv4.2 (TCP/2049) │───┐ Linux NFS 客户端 ───│ NFSv4.1 (TCP/2049) │───┤ Linux NFS 客户端 ───│ NFSv3 (TCP/2049) │───┤ Linux NFS 客户端 ───│ NFSv3 (UDP/2049) │───┤ └─────────────────────┘ │ ┌─────────────────────┐ │ mount.nfs ──────────│ MOUNT (TCP/20048) │───┤ mount.nfs ──────────│ MOUNT (UDP/20048) │───┤ └─────────────────────┘ │ ┌─────────────────────┐ │ rpcinfo ────────────│ PORTMAP (TCP/111) │───┤ rpcinfo ────────────│ PORTMAP (UDP/111) │───┤ └─────────────────────┘ │ ▼ ┌─────────────────┐ │ ExportsManager │ │ (C:\exports\...) │ └─────────────────┘统一监听器— 在端口 2049 上通过单个 TCP/UDP 监听器同时处理 NFSv3、NFSv4.1 和 NFSv4.2 请求按 RPC 程序版本分发ExportsManager— 管理文件句柄解析、目录枚举和针对本地 Windows 文件系统的文件 I/O会话管理— NFSv4.1/4.2 会话使用槽位/序列跟踪实现恰好一次语义开发# 以调试模式运行cargorun# 运行测试cargotest# 格式化代码cargofmt# 代码检查cargoclippy协议合规性协议RFC状态NFSv3RFC 1813已支持NFSv4.0RFC 3010部分支持NFSv4.1RFC 5661已支持NFSv4.2RFC 7862已支持MOUNT v1RFC 1094已支持MOUNT v3RFC 1813已支持PORTMAP v2RFC 1057已支持NFSv4.2 操作RFC 7862操作操作码状态说明READ_PLUS68✅ 已支持增强读取返回数据/空洞信息COPY60✅ 已支持服务器端文件复制仅同服务器SEEK69✅ 已支持查找文件中下一个数据或空洞偏移CLONE71✅ 已支持服务器端文件范围克隆读写ALLOCATE59Stub返回 NOTSUPPDEALLOCATE62Stub返回 NOTSUPPIO_ADVISE63Stub返回 NOTSUPPLAYOUTERROR64Stub返回 NOTSUPPLAYOUTSTATS65Stub返回 NOTSUPPOFFLOAD_CANCEL66Stub返回 NOTSUPPOFFLOAD_STATUS67Stub返回 NOTSUPPWRITE_SAME70Stub返回 NOTSUPPCOPY_NOTIFY61Stub返回 NOTSUPP注意Stub 操作返回NFS4ERR_NOTSUPP。COPY 仅支持同服务器内复制不支持跨服务器复制。CLONE 为简化的 readwrite 实现未使用 BlockClone API。SEEK 使用简化模型SEEK4_HOLE 返回文件大小因为 Windows 不通过标准 API 暴露稀疏文件空洞信息。许可证GPL-3.0