1. 项目概述:为什么在 Rocky Linux 8 上手动配置 NFS 挂载值得你花这 20 分钟
NFS(Network File System)不是什么新潮概念,但直到今天,它依然是企业内网里最稳、最轻、最不挑人的文件共享方案。你不需要装 Docker、不用配 Kubernetes Volume、更不用折腾对象存储网关——只要两台机器在同一局域网,一台开个共享目录,另一台执行一条 mount 命令,就能像访问本地硬盘一样读写远程文件。我在金融后台做日志归集时用它同步审计日志,在广电媒资系统里挂载素材库,在高校 HPC 集群中分发训练数据集,三年没换过一行配置,也没重启过服务。Rocky Linux 8 作为 RHEL 8 的社区继承者,内核是 4.18,默认启用 firewalld 和 SELinux,这两者恰恰是 NFS 挂载失败的“头号双煞”。网上搜到的教程要么照搬 CentOS 7 的 systemctl stop firewalld 粗暴关防火墙,要么漏掉 nfs-utils 的 rpcbind 兼容性处理,结果就是: mount.nfs: Connection refused 、 mount error(112): Host is down 、 Permission denied 这三类报错轮番轰炸。这不是 NFS 本身的问题,而是 Rocky Linux 8 的安全基线和旧式 NFS 文档之间存在一道没被填平的沟。这篇内容不讲原理堆砌,只说你在终端里敲什么、为什么敲、敲错后怎么看日志、怎么不动声色地修好——所有操作均基于真实生产环境复现,命令可直接复制粘贴,参数全部标注来源依据,连 showmount -e 返回空和 exportfs -v 不生效这种“查不到原因”的典型现场,我都给你录了三次重现实验。
2. 整体设计思路与关键决策逻辑:为什么必须放弃“关防火墙”思维
2.1 架构选型:NFS v3 还是 v4?Rocky Linux 8 默认走哪条路?
Rocky Linux 8 的 nfs-utils 包(版本 2.3.3+)默认同时支持 NFS v3 和 v4.2,但 内核模块加载策略和防火墙放行规则完全不同 。v3 依赖 rpcbind 服务动态分配端口(111/TCP+UDP),而 v4 将所有通信收敛到 2049 端口(TCP/UDP),无需 rpcbind 。很多教程直接推荐 v4,理由是“更安全、更简单”。但实测发现:当客户端是较老的嵌入式设备、某些 NAS 或 Windows Subsystem for Linux(WSL2)时,v4 的 SECINFO 协商常失败,报错 mount.nfs: access denied by server while mounting ;而 v3 在 Rocky Linux 8 上兼容性极强,只要 rpcbind 启动正常,几乎零故障。我最终选择 NFS v3 + rpcbind 显式启用 方案,原因有三:
- 可追溯性高 :
rpcinfo -p能清晰看到每个 NFS 服务绑定的端口,出问题时tcpdump -i any port 111 or port 2049抓包一眼定位是 RPC 层还是 NFS 层断链; - firewalld 规则粒度可控 :v3 需要放行
rpc-bind服务(自动映射 111 端口)+nfs服务(映射 2049 及动态端口),而 v4 只需nfs服务,看似简单,但nfs服务在 firewalld 中实际包含2049/tcp、2049/udp、111/tcp、111/udp四条规则,本质仍是 v3 的端口集合,只是封装了一层; - SELinux 上下文适配成熟 :Rocky Linux 8 的
selinux-policy-targeted包对/var/lib/nfs/目录的public_content_t类型定义完整,v3 的exportfs生成的rmtab、xtab文件权限模型比 v4 的nfsdcltrack数据库更透明。
提示:不要被
nfsstat -m输出的vers=4.2迷惑——这是客户端协商结果,不代表服务端强制启用 v4。我们通过/etc/nfsmount.conf强制指定Defaultvers=3,确保行为可预期。
2.2 安全边界设计:firewalld 不是障碍,而是配置说明书
网上大量教程教人执行 systemctl disable firewalld && systemctl stop firewalld ,这在测试环境可以,但在生产环境等于裸奔。Rocky Linux 8 的 firewalld vendor preset 是 enabled,意味着系统重装或内核更新后会自动恢复启用。真正该做的是把 NFS 所需的网络通道“白名单化”。firewalld 的 --permanent 模式不是摆设,它是配置持久化的唯一可靠方式。临时添加规则(不加 --permanent )在 firewall-cmd --reload 后会丢失,而 --reload 又是日常维护高频操作。我坚持 永久规则 + 显式重载 + 服务级放行 三步法:
- 第一步:用
firewall-cmd --add-service=nfs --permanent添加预定义服务,它自动关联2049/tcp、2049/udp、111/tcp、111/udp; - 第二步:单独添加
rpc-bind服务(firewall-cmd --add-service=rpc-bind --permanent),因为nfs服务定义中不包含rpcbind的 UDP 端口,而showmount命令依赖 UDP 111; - 第三步:执行
firewall-cmd --reload生效,而非systemctl restart firewalld——后者会中断已有连接,而--reload仅更新规则表,不影响运行中挂载。
这个设计让防火墙从“拦路虎”变成“配置校验器”:如果 showmount -e server_ip 失败,但 telnet server_ip 111 成功,说明是 RPC 层问题;如果 telnet 也失败,则一定是防火墙或网络层拦截。
2.3 权限模型取舍:root_squash 还是 no_root_squash?别让 /etc/exports 成为提权入口
/etc/exports 文件里的 no_root_squash 选项常被滥用。它的本意是允许 root 用户在客户端以 root 权限修改服务端文件,适用于集群计算节点间共享 /tmp 或 /scratch 。但在 Rocky Linux 8 的 SELinux 环境下, no_root_squash 会绕过 nf


384

被折叠的 条评论
为什么被折叠?



