Skip to main content

Linux NFS 服务配置

1. NFS 服务简介 🌐

NFS 是一种允许客户端通过网络访问远程服务器文件系统的协议。通过 NFS,用户可以像访问本地磁盘一样使用远程文件夹。

适用场景

  • 集中化存储管理
  • 数据共享
  • 负载均衡

2. NFS 服务原理 ⚙️

NFS 使用 RPC(远程过程调用)机制与客户端通信:

  1. 服务器端 将文件夹共享出来,指定可访问的主机和权限。
  2. 客户端 挂载共享文件夹后,可通过网络访问共享的内容。

2.1 工作流程

工作原理描述:

  1. 客户端发起请求

    • 客户端(如工作站)通过 NFS 协议向服务器请求访问共享的文件系统。
  2. NFS 守护进程

    • 服务器端运行 NFS 守护进程(如 nfsd),负责处理 NFS 请求。
    • nfsd 负责实际的文件系统操作,读取或写入文件等。
  3. RPC(远程过程调用)

    • NFS 使用 RPC 来处理远程调用。客户端通过 rpcbind 服务查找 NFS 服务的端口号。
  4. 挂载过程

    • 客户端发送挂载请求到服务器的 mountd 守护进程。
    • mountd 检查 /etc/exports 文件中的配置,确定是否允许客户端挂载,并返回一个文件句柄(File Handle),客户端可以使用这个句柄来访问文件系统。
  5. 文件访问

    • 客户端使用文件句柄直接与 nfsd 交互,进行文件操作(如读、写、创建、删除等)。
  6. 文件锁定

    • 当客户端需要锁定文件时,会通过 lockd 守护进程来管理文件锁定,防止多个客户端同时修改文件。
  7. 响应

    • 服务器通过 NFS 协议将响应(如文件内容、操作成功或失败的信息)发送回客户端。

工作原理简图:

2.2 NFS 协议版本

  • NFSv3:支持异步操作,性能较好。
  • NFSv4:更安全,支持状态化操作。

以下是 NFSv4 常用端口号的表格:

服务组件NFS 版本协议端口号备注
Portmapper (rpcbind)v4TCP/UDP111用于所有 RPC 服务的端口映射,尽管 NFSv4 使用单一端口,但仍可能需要 rpcbind 辅助服务的注册
NFS Daemon (nfsd)v4TCP/UDP2049NFS 数据传输端口,所有 NFSv4 通信都在这个端口上进行
Kerberosv4TCP/UDP88如果启用 Kerberos 认证,用于 NFSv4 的安全性服务

备注

  • NFSv4 简化了端口使用,所有的 NFS 通信都在单一端口 2049 上进行。
  • rpcbind 仍然可能用于辅助服务的注册,但 NFSv4 本身不依赖于 mountd 的单独端口。
  • 启用 Kerberos 认证时,需要开放 88 端口以支持 Kerberos 服务。

3. 安装 NFS 服务 🛠️

3.1 安装 NFS 服务端

在服务器上安装 NFS 软件包:

# Debian/Ubuntu
sudo apt update && sudo apt install nfs-kernel-server -y

# CentOS/RHEL
sudo yum install nfs-utils -y

3.2 安装 NFS 客户端

在客户端安装 NFS 客户端工具:

# Debian/Ubuntu
sudo apt install nfs-common -y

# CentOS/RHEL
sudo yum install nfs-utils -y

4. 配置 NFS 服务端 🗂️

4.1 编辑共享目录

选择需要共享的目录并设置权限:

sudo mkdir -p /mnt/shared_data  # 创建共享目录
sudo chmod 777 /mnt/shared_data # 设置读写权限

4.2 配置导出文件

编辑 NFS 的导出配置文件 /etc/exports

sudo nano /etc/exports

添加如下内容:

/mnt/shared_data *(rw,sync,no_root_squash)

参数说明

  • rw:读写权限。
  • sync:同步模式,提高数据一致性。
  • no_root_squash:允许客户端的 root 用户拥有 root 权限。

4.3 启动和重启服务

sudo systemctl restart nfs-kernel-server  # Debian/Ubuntu
sudo systemctl restart nfs-server # CentOS/RHEL

检查服务状态:

sudo systemctl status nfs-server
tip

如果你想将 NFS 共享的配置分散到不同的文件中,你可以创建 /etc/exports.d 目录, 保存多个 /etc/exports.d/*.exports 配置文件。


5. 挂载 NFS 共享目录 📂

5.1 检查共享目录

在客户端查看可用的共享目录:

showmount -e <服务器IP>

5.2 挂载共享目录

临时挂载:

sudo mount -t nfs <服务器IP>:/mnt/shared_data /mnt/nfs_client

永久挂载:
编辑 /etc/fstab 文件:

sudo nano /etc/fstab

添加以下内容:

<服务器IP>:/mnt/shared_data /mnt/nfs_client nfs defaults 0 0

保存并加载:

sudo mount -a

6. NFS 常用操作 🔧

6.1 查看已挂载的 NFS 目录

mount | grep nfs

6.2 卸载 NFS 目录

sudo umount /mnt/nfs_client

6.3 重启 NFS 服务

sudo systemctl restart nfs-kernel-server  # Debian/Ubuntu
sudo systemctl restart nfs-server # CentOS/RHEL

7. 安全性与优化 🔐

7.1 防火墙配置

开放 NFS 所需端口(默认 2049):

sudo ufw allow from <客户端IP> to any port 2049  # UFW 防火墙
sudo firewall-cmd --add-service=nfs --permanent # Firewalld 防火墙
sudo firewall-cmd --reload

7.2 配置权限

修改配置,限制访问的主机范围,例如只允许 192.168.1.0/24 的设备访问:

/mnt/shared_data 192.168.1.0/24(rw,sync)

8. NFS 权限覆盖规则

8.1 NFS 权限优先级(从高到低)

在 NFS 配置中,权限的覆盖优先级是多方面的,特别是在多个配置文件或规则指向同一个分享目录时,了解覆盖规则对于权限管理至关重要。以下是 NFS 权限覆盖的完整优先级,从高到低排序:

  1. 服务器文件系统权限 (最高优先级)
  2. 用户 UID/GID 映射
  3. 导出配置文件中的规则优先级
  4. 客户端挂载选项
  5. 动态 ACL(访问控制列表)权限
  6. 内核限制和防火墙规则(最低优先级)
详情

1. **服务器文件系统权限(最高优先级)** **影响范围**:适用于分享目录的所有访问者,无论客户端如何配置。 **规则**: - 服务器上的文件和目录权限(如 `chmod` 和 `chown`)最终决定客户端的实际访问能力。 - 即使导出配置和挂载选项允许写权限,但文件系统权限不足时,访问依然会被拒绝。

  1. 用户 UID/GID 映射
    影响范围:决定客户端用户如何映射到服务器上的用户权限。
    规则

    • 客户端用户 UID/GID 被映射到服务器本地用户 UID/GID,从而确定实际权限。
    • 默认情况下,root 用户被映射为 nobody,除非导出配置中设置 no_root_squash
    • UID/GID 不匹配会导致权限不足问题。
  2. 导出配置文件中的规则优先级
    影响范围:控制每个客户端的基础权限(读写、同步等)。
    规则

    • 匹配顺序:NFS 根据 /etc/exports 中规则的声明顺序匹配客户端。
    • 如果同一目录有多条规则匹配同一客户端,靠后的规则覆盖靠前的规则
      示例:
      /data client1(rw) client2(ro)
      /data *(ro)
      • client1client2,第一条规则生效。
      • 对其他客户端,第二条规则生效。
  3. 客户端挂载选项
    影响范围:进一步限制客户端的访问能力。
    规则

    • 客户端可以选择限制访问(如只读 ro、禁止 suid nosuid)。
    • 挂载选项无法提升权限,只能进一步限制已有权限。
      示例:服务器配置 rw,但客户端挂载时选择 ro,则客户端对目录只有只读权限。
  4. 动态 ACL(访问控制列表)权限
    影响范围:如果服务器的文件系统支持 ACL,则其权限可能会动态覆盖文件系统默认权限。
    规则

    • ACL 通过 setfaclgetfacl 配置,优先级低于文件系统权限,但在某些情况下更具体化。
    • 动态 ACL 可以为特定用户设置额外权限。
  5. 内核限制和防火墙规则(最低优先级)
    影响范围:通过 IPtables、防火墙或 SELinux 进一步限制访问。
    规则

    • 防火墙规则可能会拒绝特定客户端的访问请求,表现为超时或连接失败。
    • SELinux 强制访问控制(MAC)可能限制分享目录,即使配置文件允许访问。

8.2 多个配置文件指向同一分享目录时的规则

最近原则

当多个配置文件指向同一分享目录时,规则的生效逻辑非常类似 CSS 的 最近原则

  1. 规则匹配顺序

    • NFS 按 /etc/exports 文件的声明顺序匹配规则,后声明的规则覆盖前声明的规则。
    • 如果不同配置文件(例如通过 include 指定)指向同一目录,文件加载顺序决定优先级。
  2. 目录子集覆盖

    • 更具体的目录规则(子目录)优先于较宽泛的规则(父目录)。
      示例:
      /data *(ro)
      /data/subdir *(rw)
      • /data/subdir 的访问权限优先按子目录规则(rw)处理。
  3. IP 和客户端名称匹配优先级

    • 精确匹配 IP > 子网匹配 > 通配符匹配(如 *)。
      示例:
      /data 192.168.1.100(rw) 192.168.1.0/24(ro) *(ro)
      • IP 为 192.168.1.100 的客户端按 rw 规则处理。

通过以上规则和优先级,能够清晰了解 NFS 权限的覆盖逻辑,并避免配置冲突。😊

总结 🌟

NFS 是一个简单而高效的文件共享解决方案。通过本教程,你可以快速部署和管理 NFS 服务,为多台设备提供统一的文件访问!试试配置你的 NFS 服务吧,加油!🚀

希望这篇教程帮助你理解和使用 NFS 服务!别忘了收藏在线知识库www.zxzsk.com )哦!😊