跳到主要内容

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
提示

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

5. 挂载 NFS 共享目录 📂

5.1 检查共享目录

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

showmount -e <服务器IP>

PixPin_2025-01-26_00-54-06

如果防火墙未配置好,会显示超时!

5.2 挂载共享目录

临时挂载:

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

永久挂载:

编辑 /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 防火墙配置

示例

# 开放 portmap/rpcbind
firewall-cmd --add-port=111/tcp --permanent
firewall-cmd --add-port=111/udp --permanent

# 开放 NFS
firewall-cmd --add-port=2049/tcp --permanent
firewall-cmd --add-port=2049/udp --permanent

# 开放动态固定端口
firewall-cmd --add-port=4000/tcp --permanent

# 重载防火墙
firewall-cmd --reload

用途

  1. TCP/UDP 111

    • 服务:portmaprpcbind
    • 用于 RPC 服务的端口映射。
  2. TCP/UDP 2049

    • 服务:NFS 服务端主要端口
    • 用于实际的文件传输。
  3. mountd端口 4000

    • 服务:rpc.mountdrpc.statdrpc.lockd

    • 动态分配端口,具体端口可以通过配置进行固定。这里固定4000端口。

      注意,在 NFS 配置文件中(如 /etc/nfs.conf 或启动参数)指定端口:

      [mountd]
      port=4000

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. 内核限制和防火墙规则(最低优先级)

总结 🌟

NFS 是一个简单而高效的文件共享解决方案,通过 NFS 服务,为多台设备提供统一的文件访问!首次配置可以暂时关掉防火墙,降低难度!