搭建 NFS 网络存储与挂载

用 NFS 把一台服务器的目录共享给多台机器,像访问本地磁盘一样读写——附内网安全配置要点。

当多台服务器需要共用同一份文件(比如共享代码、上传目录、日志归档),把文件复制来复制去既低效又容易不一致。NFS(Network File System)让一台机器把某个目录"导出",其他机器直接挂载到本地路径,读写如同本地磁盘。下面以 Ubuntu/Debian 为例,走一遍服务端与客户端配置。

服务端:导出共享目录

先安装 NFS 服务并准备好要共享的目录。

sudo apt update
sudo apt install -y nfs-kernel-server
sudo mkdir -p /srv/share
sudo chown nobody:nogroup /srv/share

配置 /etc/exports

导出规则写在 /etc/exports,一行一条,格式是 目录 允许的网段(选项):

# 只允许 10.0.0.0/24 内网访问,可读写
/srv/share  10.0.0.0/24(rw,sync,no_subtree_check,root_squash)

常用选项说明:

  • rw:允许读写(只读用 ro)
  • sync:写入落盘后才返回,更安全(async 更快但有丢数据风险)
  • rootsquash:把客户端的 root 映射成匿名用户,务必保留,防止客户端 root 直接改服务端文件
  • nosubtreecheck:关闭子树检查,提升稳定性

改完让配置生效并放行防火墙:

sudo exportfs -ra          # 重新加载 exports
sudo exportfs -v           # 查看当前导出
sudo systemctl enable --now nfs-kernel-server
sudo ufw allow from 10.0.0.0/24 to any port nfs

客户端:挂载使用

客户端装上工具,把远端目录挂到本地。假设服务端内网 IP 是 10.0.0.10:

sudo apt install -y nfs-common
sudo mkdir -p /mnt/share
sudo mount -t nfs 10.0.0.10:/srv/share /mnt/share
df -h /mnt/share           # 确认挂载成功

开机自动挂载(fstab)

手动 mount 重启后会丢失,写进 /etc/fstab 才能持久:

# /etc/fstab 追加一行
10.0.0.10:/srv/share  /mnt/share  nfs  defaults,_netdev,nofail  0  0

其中 netdev 告诉系统等网络就绪再挂载,nofail 避免 NFS 不可用时卡住开机。

安全提醒

NFS 的默认协议没有加密也没有强身份认证,权限主要靠"来源 IP + 网段"控制,一旦暴露到公网极易被扫描利用。请务必:

  • 只在内网使用,绝不把 NFS 端口(2049)暴露到公网
  • 在 /etc/exports 里严格限制网段,不要用 或过大的网段
  • 始终保留 rootsquash,必要时用 allsquash 进一步收紧
  • 用安全组/防火墙只放行可信内网来源;跨机房传输走 VPN 或专线

NFS 还是对象存储?

两者定位不同,别硬套:

  • NFS 适合需要 POSIX 文件语义、随机读写、多机共享同一目录的场景(如共享构建产物、临时数据),但扩展性和跨地域能力有限。
  • 对象存储(S3 兼容)适合海量、静态、一次写多次读的文件(备份、图片、视频),天然高可用、可跨地域,但通过 HTTP API 访问,不支持就地随机改写。

简单判断:要"像磁盘一样用"选 NFS,要"海量存档 + 全球分发"选对象存储。

小结

NFS 的核心是服务端 exports 导出、客户端 mount 挂载,配合 fstab 持久化。安全上必须坚守"只走内网、限制网段、保留 rootsquash"三条底线。共享目录选 NFS,海量归档选对象存储,按访问模式选型即可。