XYCOVO CONSOLE KURISU · WEB 渗透 / AI 辅助攻防 ONLINE
#020 · 2025-03-20✓ PASS

NFS 文件共享

RHEL9 环境下 NFS 网络文件系统的完整配置指南,涵盖 NFSv3/NFSv4 区别、/etc/exports 配置、客户端挂载及 autofs 自动挂载。
linux网络安全nfs文件共享AUTHOR: KURISU

NFS(Network File System)允许远程主机通过网络挂载文件系统,并像本地磁盘一样交互操作,是 Linux 环境下最常用的网络文件共享方案。


一、NFS 概述

网络文件系统 (NFS) 允许远程主机通过网络挂载文件系统,并像它们挂载在本地那样与这些文件系统进行交互。这让系统管理员可以将资源整合到网络的集中服务器中。

NFS 服务器参考 /etc/exports 配置文件,来确定是否允许客户端访问任何导出的文件系统。一旦被验证,所有文件和目录操作都对用户有效。

Red Hat Enterprise Linux 使用内核级支持和服务流程组合提供 NFS 文件共享。所有 NFS 版本都依赖于客户端和服务器间的远程过程调用(RPC)。


二、NFS 所需的服务

运行 NFS 服务器或挂载 NFS 共享需要以下系统服务:

服务说明
nfsdNFS 服务器内核模块,处理共享 NFS 文件系统请求
rpcbind接受本地 RPC 服务的端口保留,响应 RPC 服务请求 (NFSv3)
rpc.mountd处理来自 NFSv3 客户端的 MOUNT 请求,验证导出权限
rpc.nfsd定义服务器公告的显式 NFS 版本和协议,对应 nfs-server 服务
lockd内核线程,实现网络锁管理器 (NLM) 协议,允许 NFSv3 客户端锁文件
rpc.statd实现网络状态监控器 (NSM) 协议,通知客户端服务器重启 (NFSv3)
rpc.rquotad为远程用户提供用户配额信息
rpc.idmapd为 NFSv4 提供用户/组 ID 映射,需配置 /etc/idmapd.conf

NFSv4 的 RPC 服务变化

NFSv4 将挂载和锁定协议合并到协议本身中,服务器监听已知的 TCP 端口 2049。因此 NFSv4 不需要 rpcbindlockdrpc-statd 服务。NFS 服务器上仍然需要 nfs-mountd 服务来设置导出,但不涉及任何线上操作。


三、NFS 主机名格式

在挂载或导出 NFS 共享时,可以使用以下格式指定主机:

格式示例
单台机器(FQDN)client.example.com
单台机器(IP)192.168.1.100
IP 网络(CIDR)192.168.0.0/24
IP 网络(子网掩码)192.168.100.8/255.255.255.0
Netgroups@group-name

四、/etc/exports 配置文件

/etc/exports 文件控制哪些文件系统被导出到远程主机,并指定选项。它遵循以下语法规则:

  • 空白行将被忽略
  • 以井号 # 开始的行是注释
  • 可以使用反斜杠 \ 换行长行
  • 每个导出的文件系统都应该独立一行
  • 授权主机列表必须用空格分开
  • 选项必须紧跟在主机标识符后面的括号中,中间没有空格

导出条目结构

/exported/directory host1(options1) host2(options2)

重要/etc/exports 文件的格式要求非常精确。以下两行含义完全不同:

# 仅允许 bob.example.com 读写 /home
/home bob.example.com(rw)

# bob.example.com 只读(默认),其他用户可读写(注意括号前的空格)
/home bob.example.com (rw)

默认选项

选项说明
ro只读。远程主机无法修改数据 (默认)
rw读写。允许远程主机修改文件系统中的数据
sync同步写入。NFS 服务器在请求写入磁盘后才回复 (默认)
async异步写入。提高性能但可能在服务器崩溃时丢失数据
wdelay延迟写入。若预期有更多写入请求则延迟写磁盘 (默认)
no_wdelay禁用延迟写入,仅当指定 sync 时可用
root_squash将远程 root 用户映射为 nobody,防止远程 root 特权 (默认)
no_root_squash不禁用 root 挤压,远程 root 保留特权
all_squash将所有远程用户映射为匿名用户
anonuid / anongid指定匿名用户的 UID 和 GID

配置示例

# 基本只读导出
/data 192.168.115.141(ro)

# 读写导出,异步写入
/another/exported/directory 192.168.0.3(rw,async)

# 多主机不同权限
/home 192.168.1.0/24(rw,sync) 10.0.0.0/8(ro)

# 指定匿名用户
/public 192.168.1.0/24(rw,all_squash,anonuid=65534,anongid=65534)

五、安装与启动 NFS 服务器

安装 NFS

# 安装 nfs-utils 软件包
dnf install nfs-utils -y

启动 NFS 服务器

# 启动并设置开机自启
systemctl enable --now nfs-server

# 查看服务状态
systemctl status nfs-server

六、防火墙配置

NFSv4 只需要开放 nfs 服务:

# 放行 NFS 服务
firewall-cmd --permanent --add-service=nfs

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

# 验证已放行的服务
firewall-cmd --list-services

七、客户端挂载 NFS

查看服务器导出的目录

# 在客户端查看 NFS 服务器导出的共享
showmount -e 192.168.115.128
# Export list for 192.168.115.128:
# /data 192.168.115.141

手动挂载

# 创建挂载点
mkdir -p /nfsclient/client-data

# 挂载 NFS 共享
mount 192.168.115.128:/data /nfsclient/client-data

# 验证挂载
df -h /nfsclient/client-data
# Filesystem             Size  Used Avail Use% Mounted on
# 192.168.115.128:/data   45G  4.5G   41G  11% /nfsclient/client-data

开机自动挂载(/etc/fstab)

# 编辑 /etc/fstab 添加以下行
echo "192.168.115.128:/data  /nfsclient/client-data  nfs  defaults  0  0" >> /etc/fstab

保存配置后,重启主机会自动挂载。


八、autofs 自动挂载

由于网络问题,NFS 服务器与客户端的连接不会一直存在。当挂载了 NFS 服务器之后,任何一方脱机都可能造成另外一方等待超时。autofs 服务解决了这个问题:

  • 当客户端有使用 NFS 文件系统的需求时才自动挂载
  • 当 NFS 文件系统使用完毕后,让 NFS 自动卸载

autofs 配置流程

# 1. 客户端安装 autofs
yum install autofs -y

# 2. 配置主映射文件 /etc/auto.master
# 格式:本地端目录  具体挂载配置文件
echo "/client  /etc/auto.suibian" >> /etc/auto.master

# 3. 配置具体挂载文件 /etc/auto.suibian
# 格式:本地端子目录  挂载参数  服务器:服务器对应目录
echo "upload 192.168.168.128:/nfs/upload" > /etc/auto.suibian

# 4. 重启 autofs 服务
systemctl restart autofs

# 5. 触发自动挂载(访问目录时自动挂载)
cd /client/upload

只有当用户实际访问 /client/upload 目录时,autofs 才会自动将远程 NFS 共享挂载到该位置。


九、NFSv3 与 NFSv4 对比

特性NFSv3NFSv4
端口需要 rpcbind (动态端口)固定 TCP 2049
锁协议独立 NLM 协议 (lockd)集成在 NFS 协议中
状态监控rpc.statd集成在协议中
挂载协议独立 MOUNT 协议集成在协议中
防火墙友好需要开放多个端口只需 TCP 2049
ID 映射UID/GID 直接传递基于字符串的名称映射

十、最佳实践

  1. 优先使用 NFSv4:仅需开放 TCP 2049 端口,更利于防火墙配置
  2. root_squash 安全保障:默认已启用,不要随意禁用 no_root_squash
  3. 使用 autofs:避免网络问题导致的挂载超时,按需挂载更稳定
  4. 配置防火墙:仅在需要时放行 NFS 服务,结合 Zone 限制访问来源
  5. SELinux 配合:如果开启 SELinux,需要使用 semanage 配置 NFS 上下文
# 查看 SELinux NFS 相关布尔值
getsebool -a | grep nfs

← #019 TCP/IP 与 OSI 模型…#021 安全课程综合笔记:HTTP 协议… →