凌峰创科服务平台

Ubuntu NFS服务器配置如何实现?

目录

  1. 概述
  2. 服务器端配置
    • 步骤 1: 更新系统并安装 NFS 服务器
    • 步骤 2: 创建要共享的目录
    • 步骤 3: 配置 NFS 导出文件 (/etc/exports)
    • 步骤 4: 应用 NFS 配置并启动服务
    • 步骤 5: 防火墙配置
  3. 客户端配置
    • 步骤 1: 安装 NFS 客户端工具
    • 步骤 2: 创建本地挂载点
    • 步骤 3: 挂载 NFS 共享
    • 步骤 4: 设置开机自动挂载 (/etc/fstab)
  4. 高级配置选项
  5. 常见问题排查
  6. 安全注意事项

概述

NFS 工作在客户端/服务器模型中:

Ubuntu NFS服务器配置如何实现?-图1
(图片来源网络,侵删)
  • 服务器: 一台运行 NFS 服务的机器,它“导出”(共享)一个或多个目录。
  • 客户端: 另一台机器,它通过 NFS 协议“挂载”服务器上共享的目录,就像访问本地文件一样。

本教程将使用两台机器作为示例:

  • NFS 服务器: 168.1.100
  • NFS 客户端: 168.1.101

请将以下 IP 地址替换为你自己环境的实际 IP 地址。


服务器端配置

在运行以下命令前,请确保你拥有 sudo 权限。

步骤 1: 更新系统并安装 NFS 服务器

更新你的软件包列表,然后安装 nfs-kernel-server 包,这是 Ubuntu 上最常用的 NFS 服务器实现。

Ubuntu NFS服务器配置如何实现?-图2
(图片来源网络,侵删)
sudo apt update
sudo apt install nfs-kernel-server -y

步骤 2: 创建要共享的目录

为了安全起见,我们建议为 NFS 共享创建一个专门的目录,并设置适当的权限。

# 创建共享目录,/srv/nfs/share
sudo mkdir -p /srv/nfs/share
# 设置目录所有者为当前用户(可选,方便管理)
# 将 your_username 替换为你的实际用户名
sudo chown -R $USER:$USER /srv/nfs/share
# 设置目录权限,确保客户端可以读写
sudo chmod -R 777 /srv/nfs/share

注意: 777 权限非常开放,仅用于演示,在生产环境中,你应该根据需要设置更严格的权限(如 775)和正确的用户/组。

步骤 3: 配置 NFS 导出文件 (/etc/exports)

/etc/exports 文件定义了哪些目录被共享,以及哪些客户端可以访问它们,以及访问权限。

使用你喜欢的文本编辑器打开该文件,nano

Ubuntu NFS服务器配置如何实现?-图3
(图片来源网络,侵删)
sudo nano /etc/exports

在文件末尾添加以下内容,这是最基本和最常用的配置:

# <共享目录>   <客户端IP>(选项1,选项2,...)
/srv/nfs/share    192.168.1.101(rw,sync,no_subtree_check)

配置详解:

  • /srv/nfs/share: 你要共享的目录路径。
  • 168.1.101: 允许访问的客户端 IP 地址,你可以使用通配符:
    • 允许任何客户端(不安全)。
    • 168.1.0/24: 允许 168.1.* 网段的所有客户端。
    • example.com: 允许 example.com 域内的所有客户端。
  • 括号内是访问选项,用逗号分隔。
  • rw: Read-Write,允许客户端读写,这是最常用的选项。
  • ro: Read-Only,只读。
  • sync: 数据在请求写入后才确认回复,这保证了数据的一致性,但性能稍差。推荐在生产环境使用
  • async: 数据先在内存中处理,然后异步写入磁盘,性能更好,但有数据丢失的风险。
  • no_subtree_check: 如果共享目录是子目录,禁用子树检查可以提高性能。推荐使用
  • no_root_squash: 默认情况下,客户端的 root 用户会被映射为匿名用户(nfsnobody),设置此选项后,客户端的 root 用户在共享目录中将拥有 root 权限。非常危险,请谨慎使用! 通常用于无盘工作站等需要 root 权限的场景。
  • root_squash: 默认选项,将客户端的 root 用户映射为匿名用户,更安全。

保存并关闭文件 (Ctrl+X, 然后按 Y, 最后按 Enter)。

步骤 4: 应用 NFS 配置并启动服务

修改了 /etc/exports 文件后,需要让 NFS 服务器重新加载配置。

# 使新的导出配置生效
sudo exportfs -a
# 启动并启用 nfs-kernel-server 服务
sudo systemctl start nfs-kernel-server
sudo systemctl enable nfs-kernel-server
# 检查服务状态,确保为 active (running)
sudo systemctl status nfs-kernel-server

步骤 5: 防火墙配置

如果服务器上启用了 ufw (Uncomplicated Firewall),你需要为 NFS 服务开放端口,NFS 使用多个动态端口,因此最简单的方法是使用 rpcbind 服务来管理这些端口。

# 允许 rpcbind 服务,NFS 依赖它
sudo ufw allow rpcbind
# 允许 nfs 服务
sudo ufw allow nfs
# 如果你的客户端 IP 是固定的,也可以只允许来自该 IP 的访问
# sudo ufw allow from 192.168.1.101 to any port nfs

然后启用防火墙(如果尚未启用):

sudo ufw enable

客户端配置

在客户端机器 (168.1.101) 上执行以下操作。

步骤 1: 安装 NFS 客户端工具

sudo apt update
sudo apt install nfs-common -y

步骤 2: 创建本地挂载点

在客户端创建一个目录,作为远程 NFS 共享的挂载点。

sudo mkdir -p /mnt/nfs_share

步骤 3: 挂载 NFS 共享

使用 mount 命令手动挂载。

# 语法: sudo mount <服务器IP>:<共享目录> <本地挂载点>
sudo mount 192.168.1.100:/srv/nfs/share /mnt/nfs_share

验证是否挂载成功:

# 查看挂载信息
df -hT
# 输出应该包含类似下面的一行
# 192.168.1.100:/srv/nfs/share  25G  4.5G   21G  18% /mnt/nfs_share
# 在挂载点创建一个文件测试
sudo touch /mnt/nfs_share/test_file.txt

然后回到服务器上,检查 /srv/nfs/share 目录下是否出现了 test_file.txt,如果出现,说明挂载成功。

步骤 4: 设置开机自动挂载 (/etc/fstab)

为了在客户端重启后自动挂载 NFS 共享,需要编辑 /etc/fstab 文件。

# 备份 fstab 文件是个好习惯
sudo cp /etc/fstab /etc/fstab.bak
# 编辑 fstab
sudo nano /etc/fstab

在文件末尾添加以下行:

# <服务器IP>:<共享目录>  <本地挂载点>  nfs  _netdev,auto,bg,soft,intr  0  0
192.168.1.100:/srv/nfs/share  /mnt/nfs/share  nfs  defaults  0  0

/etc/fstab 选项详解:

  • defaults: 使用默认的挂载选项 (rw, suid, dev, exec, auto, nouser, async)。
  • _netdev: 告诉系统这是一个需要网络设备就绪的设备,在启动网络后才挂载。非常重要!
  • soft: 如果服务器无响应,客户端会返回一个错误,而不是无限期挂起。hard (默认) 会一直等待,直到服务器恢复。
  • intr: 允许中断挂载操作(例如用 Ctrl+C)。
  • bg: 如果首次挂载失败,会在后台尝试重新挂载。
  • 最后两个 0 0 表示不进行备份和文件系统检查。

保存文件后,你可以通过以下命令测试 fstab 是否正确配置:

# 卸载已挂载的目录
sudo umount /mnt/nfs/share
# 根据 fstab 重新挂载所有文件系统
sudo mount -a

如果命令没有报错,说明 fstab 配置正确,再次使用 df -hT 验证。


高级配置选项

NFSv4 配置 (推荐)

NFSv4 是更新的版本,它简化了防火墙配置(只使用一个 TCP 端口 2049),并提供了更好的安全性和性能。

服务器端:

  1. 安装 NFSv4 相关包:

    sudo apt install nfs-kernel-server nfs4-acl-tools
  2. 修改 /etc/default/nfs-kernel-server,启用锁定管理器:

    sudo nano /etc/default/nfs-kernel-server

    找到并取消注释这行:

    # RPCMOUNTDOPTS="--manage-gids"

    改为:

    RPCMOUNTDOPTS="--manage-gids"
  3. 强烈建议 在 NFSv4 中设置一个共享的域名,编辑 /etc/idmapd.conf

    sudo nano /etc/idmapd.conf

    Domain 的值修改为你的网络域名(localdomainlan):

    #Domain = localdomain
    Domain = lan
  4. 重启 NFS 服务:

    sudo systemctl restart nfs-kernel-server

客户端:

  1. 安装客户端工具:

    sudo apt install nfs-common
  2. 同样,客户端也需要配置 /etc/idmapd.conf,使其与服务器上的 Domain 值一致。

  3. 挂载时指定 NFSv4 版本:

    sudo mount -t nfs4 -o vers=4 192.168.1.100:/ /mnt/nfs_share

    注意,在 NFSv4 中,共享路径是相对于服务器导出的根目录的,如果服务器导出 /srv/nfs/share,那么客户端挂载时路径就是 ,实际访问的是 /mnt/nfs_share/share


常见问题排查

  1. mount.nfs: access denied by server

    • 原因: 服务器 /etc/exports 文件配置错误或客户端 IP 不在允许列表中。
    • 解决: 检查服务器上的 /etc/exports 文件,确保客户端 IP 地址正确,并执行 sudo exportfs -r 重新导出。
  2. mount.nfs: an incorrect mount option was specified

    • 原因: /etc/exports 文件中的选项有拼写错误或使用了不支持的选项。
    • 解决: 检查 /etc/exports 文件的语法。
  3. rpc.statd: unable to contact statd on server

    • 原因: 服务器端的 statd 服务未运行或防火墙阻止了 RPC 端口。
    • 解决: 在服务器上确保 nfs-statd 服务正在运行 (sudo systemctl status nfs-statd),并检查防火墙规则。
  4. 挂载后,客户端显示 Permission denied

    • 原因 1: 服务器共享目录权限不正确,检查 ls -ld /srv/nfs/share 的输出,确保客户端用户有读写权限。
    • 原因 2: 服务器开启了 root_squash(默认),而客户端正在使用 root 用户操作,这是正常的安全行为,建议在客户端创建一个普通用户来操作。
    • 原因 3: 客户端和服务器之间的用户/组 ID 不匹配,NFS 默认使用 UID/GID 来识别用户,如果服务器上的用户 www-data (UID 33) 在客户端上不存在,那么客户端上以 www-data 身份创建的文件,在服务器上会显示为 nobody
  5. 如何查看 NFS 服务器导出了什么?

    • 在服务器上运行:
      showmount -e
    • 在客户端上可以查看服务器导出的列表:
      showmount -e 192.168.1.100

安全注意事项

  • 网络隔离: NFS 应该在受信任的内网环境中使用,绝对不要将其暴露在公共互联网上。
  • 谨慎使用 no_root_squash: 这会允许客户端的 root 用户完全控制你的共享文件,存在巨大的安全风险。
  • 使用 ro (只读): 如果客户端只需要读取文件,请务必在服务器端配置 ro 权限。
  • 使用防火墙: 始终使用防火墙(如 ufw)限制只有特定的客户端 IP 才能访问 NFS 服务。
  • 定期更新: 保持你的系统和 NFS 软件包为最新版本,以修复已知的安全漏洞。
分享:
扫描分享到社交APP
上一篇
下一篇