凌峰创科服务平台

centos nfs服务器配置

NFS 服务器配置指南

第一部分:服务器端配置

安装 NFS 服务

需要在服务器上安装 nfs-utils 软件包,它包含了 NFS 服务器和客户端所需的所有工具。

centos nfs服务器配置-图1
(图片来源网络,侵删)
# 更新软件包列表
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>,...)

centos nfs服务器配置-图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)都会被映射成匿名用户。
  • anonuidanongid: 指定匿名用户映射后的 UID 和 GID,通常与 no_root_squashall_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)

配置完成后,保存并退出编辑器。

centos nfs服务器配置-图3
(图片来源网络,侵删)

启动并启用 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

如果没有报错,说明配置正确。


第四部分:常见问题排查

  1. 权限被拒绝 (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 用户对目录有读写权限。
  2. NFS 服务器挂载点不存在 (mount point does not exist)

    • 原因: 客户端的挂载点目录不存在,使用 mkdir -p 创建它。
  3. RPC: 程序未注册 (RPC: Program not registered)

    • 原因: 服务端的 rpcbindnfs-server 服务没有启动,检查服务状态并启动它们。
  4. 无法解析主机名

    • 原因: 客户端无法通过 IP 地址访问服务器,检查网络连通性 (ping 192.168.1.100) 和防火墙设置。

第五部分:安全建议

  • 最小化暴露: 尽量不要使用 通配符,只开放给信任的特定 IP 地址或子网。
  • 使用 root_squash: 除非有特殊需求,否则始终使用 root_squash 来防止客户端的 root 用户获得服务器上的过高权限。
  • 使用防火墙: 确保 firewalldiptables 正确配置,只允许必要的 NFS 端口。
  • 考虑 NFSv4: 如果环境支持,优先使用 NFSv4,它通过单个 TCP 端口(2049)工作,简化了防火墙配置,并且提供了更好的安全性(如 Kerberos 认证)。
  • 定期更新: 保持系统和 NFS 软件包为最新版本,以修复已知的安全漏洞。
分享:
扫描分享到社交APP
上一篇
下一篇