NFS 服务器配置指南
第一部分:服务器端配置
安装 NFS 服务
需要在服务器上安装 nfs-utils 软件包,它包含了 NFS 服务器和客户端所需的所有工具。

# 更新软件包列表 sudo yum update -y # 安装 NFS 软件包 sudo yum install -y nfs-utils
创建共享目录
选择一个或多个目录作为共享资源,这里我们创建一个 /data/nfs_share 目录作为示例,并设置适当的权限。
# 创建共享目录 sudo mkdir -p /data/nfs_share # 设置目录所有者为 nobody:nobody (这是 NFS 匿名用户常用的身份) # 或者你也可以指定一个具体的用户和组,root:root sudo chown -R nobody:nobody /data/nfs_share # 设置目录权限为 755 (所有者可读写执行,组和其他用户可读执行) sudo chmod -R 755 /data/nfs_share # (可选) 在共享目录中放入一个测试文件 echo "This is a test file for NFS sharing." | sudo tee /data/nfs_share/test.txt
配置 NFS 导出文件
NFS 的核心配置文件是 /etc/exports,这个文件定义了哪些目录可以被哪些客户端访问,以及访问的权限。
打开 /etc/exports 文件进行编辑:
sudo vi /etc/exports
格式为:
<共享目录> <客户端地址>(<选项1>,<选项2>,...)

选项说明:
- ro (read-only): 客户端只能读取。
- rw (read-write): 客户端可以读写。
- sync (同步): 写入操作会同步到磁盘后才返回成功,这是默认且最安全的选项。
- async (异步): 写入操作先在内存中完成,稍后再写入磁盘,性能更好,但断电可能导致数据丢失。
- no_root_squash: 客户端的 root 用户(UID=0)在挂载后仍然保持 root 权限。(非常危险,请谨慎使用!)
- root_squash: 客户端的 root 用户(UID=0)在挂载后会被映射成匿名用户(通常是
nobody),这是默认且推荐的选项,用于增强安全性。 - all_squash: 所有用户(包括 root)都会被映射成匿名用户。
- anonuid 和 anongid: 指定匿名用户映射后的 UID 和 GID,通常与
no_root_squash或all_squash一起使用。
配置示例:
在 /etc/exports 文件中添加以下内容:
# 示例 1: 允许单个客户端 IP (192.168.1.100) 读写访问 /data/nfs_share 192.168.1.100(rw,sync) # 示例 2: 允许整个子网 (192.168.1.0/24) 只读访问 /data/nfs_share 192.168.1.0/24(ro,sync) # 示例 3: 允许任何客户端读写访问 (不推荐用于生产环境) /data/nfs_share *(rw,sync,no_root_squash) # 示例 4: 为特定客户端设置特殊权限 # 允许 192.168.1.50 的 root 用户保持 root 权限,其他用户被 squash /data/nfs_share 192.168.1.50(rw,sync,no_root_squash)
配置完成后,保存并退出编辑器。

启动并启用 NFS 服务
启动 NFS 相关的服务,并设置它们在系统启动时自动运行。
# 启动 rpcbind 服务 (NFS 的基础服务) sudo systemctl start rpcbind sudo systemctl enable rpcbind # 启动 nfs-server 服务 sudo systemctl start nfs-server sudo systemctl enable nfs-server # 启动 nfs-lock 服务 (用于文件锁) sudo systemctl start nfs-lock sudo systemctl enable nfs-lock # 启动 nfs-idmap 服务 (用于用户 ID 映射) sudo systemctl start nfs-idmap sudo systemctl enable nfs-idmap
检查服务状态
确保所有 NFS 相关服务都已成功启动。
sudo systemctl status nfs-server rpcbind nfs-lock nfs-idmap
你应该会看到所有服务的状态都为 active (running)。
应用 NFS 导出配置
当你修改了 /etc/exports 文件后,需要让 NFS 服务重新加载配置。
# 方式一:重新导出所有目录(推荐) sudo exportfs -a # 方式二:重新加载 nfs-server 服务配置 sudo systemctl reload nfs-server
验证 NFS 导出
使用 exportfs 命令可以查看当前已经成功导出的目录列表。
sudo exportfs -v
输出应该类似于:
/data/nfs_share 192.168.1.100(rw,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data/nfs_share 192.168.1.0/24(ro,wdelay,no_root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
第二部分:防火墙和 SELinux 配置
配置防火墙
CentOS 默认使用 firewalld 防火墙,NFS 服务需要开放多个端口才能正常工作。
# 永久开放 NFS 服务所需的端口 sudo firewall-cmd --permanent --add-service=nfs sudo firewall-cmd --permanent --add-service=rpc-bind sudo firewall-cmd --permanent --add-service=mountd # 重新加载防火墙规则以应用更改 sudo firewall-cmd --reload
配置 SELinux (非常重要)
SELinux 是 CentOS 的一个关键安全功能,默认情况下,它可能会阻止 NFS 服务访问文件,为了简化配置,我们将其设置为 permissive 模式(只记录警告,不阻止操作),或者为共享目录设置正确的安全上下文。
临时禁用 SELinux(不推荐用于生产环境)
# 查看当前 SELinux 状态 sestatus # 临时设置为 permissive 模式 (重启后恢复) sudo setenforce 0
正确设置 SELinux 安全上下文(推荐)
这是最安全、最正确的方法,我们需要为共享目录设置正确的 public_content_t 上下文。
# 查看当前目录的上下文 ls -Z /data/nfs_share # 如果上下文不是 public_content_t,则进行设置 sudo semanage fcontext -a -t public_content_t "/data/nfs_share(/.*)?" # 应用新的 SELinux 策略 sudo restorecon -Rv /data/nfs_share # 再次查看确认上下文已更改 ls -Z /data/nfs_share
第三部分:客户端配置
我们可以在另一台 Linux 机器(客户端)上挂载这个 NFS 共享目录。
安装 NFS 客户端工具
如果客户端系统上没有 NFS 相关工具,需要先安装。
# 对于 CentOS/RHEL sudo yum install -y nfs-utils # 对于 Debian/Ubuntu sudo apt-get update sudo apt-get install -y nfs-common
创建本地挂载点
在客户端上创建一个目录作为挂载点。
sudo mkdir -p /mnt/nfs_client
挂载 NFS 共享
使用 mount 命令将服务器的共享目录挂载到客户端的挂载点。
# 格式: mount <服务器IP>:<共享目录> <本地挂载点> sudo mount 192.168.1.100:/data/nfs_share /mnt/nfs_client
验证挂载
检查是否挂载成功,并查看共享内容。
# 查看挂载信息 df -h # 你应该能看到类似下面的行 # 192.168.1.100:/data/nfs_share 50G 4.0G 47G 8% /mnt/nfs_client # 查看挂载点下的文件 ls -l /mnt/nfs_client # 应该能看到之前创建的 test.txt
设置开机自动挂载(可选)
为了让共享目录在客户端重启后仍然可用,需要将其写入 /etc/fstab 文件。
重要: 在 /etc/fstab 中使用 _netdev 选项,这告诉系统这是一个网络设备,需要在网络启动之后再尝试挂载。
# 编辑 /etc/fstab 文件 sudo vi /etc/fstab # 添加以下行 192.168.1.100:/data/nfs_share /mnt/nfs_client nfs defaults,_netdev 0 0
参数解释:
defaults: 使用默认的挂载选项(rw, suid, dev, exec, auto, nouser, async)。_netdev: 关键选项,表示这是一个网络设备。0: 表示dump命令是否备份该文件系统(0 表示不备份)。0: 表示fsck命令在启动时是否检查该文件系统(0 表示不检查,根目录通常为 1)。
保存文件后,可以运行以下命令测试 fstab 是否正确配置:
# 卸载后重新挂载所有 fstab 中的项 sudo mount -a
如果没有报错,说明配置正确。
第四部分:常见问题排查
-
权限被拒绝 (Permission denied)
- 原因1: 服务端目录权限问题,检查
ls -l /data/nfs_share的权限。 - 原因2: 服务端
/etc/exports配置了ro(只读),但你尝试写入。 - 原因3: SELinux 阻止了访问,检查
/var/log/audit/audit.log或/var/log/messages日志,使用ausearch -m AVC -ts recent查看相关事件。 - 原因4: 客户端用户映射问题,如果服务端配置了
root_squash,客户端的 root 用户会被映射为nobody,需要确保nobody用户对目录有读写权限。
- 原因1: 服务端目录权限问题,检查
-
NFS 服务器挂载点不存在 (mount point does not exist)
- 原因: 客户端的挂载点目录不存在,使用
mkdir -p创建它。
- 原因: 客户端的挂载点目录不存在,使用
-
RPC: 程序未注册 (RPC: Program not registered)
- 原因: 服务端的
rpcbind或nfs-server服务没有启动,检查服务状态并启动它们。
- 原因: 服务端的
-
无法解析主机名
- 原因: 客户端无法通过 IP 地址访问服务器,检查网络连通性 (
ping 192.168.1.100) 和防火墙设置。
- 原因: 客户端无法通过 IP 地址访问服务器,检查网络连通性 (
第五部分:安全建议
- 最小化暴露: 尽量不要使用 通配符,只开放给信任的特定 IP 地址或子网。
- 使用
root_squash: 除非有特殊需求,否则始终使用root_squash来防止客户端的 root 用户获得服务器上的过高权限。 - 使用防火墙: 确保
firewalld或iptables正确配置,只允许必要的 NFS 端口。 - 考虑 NFSv4: 如果环境支持,优先使用 NFSv4,它通过单个 TCP 端口(2049)工作,简化了防火墙配置,并且提供了更好的安全性(如 Kerberos 认证)。
- 定期更新: 保持系统和 NFS 软件包为最新版本,以修复已知的安全漏洞。
