Debian13NFS部署
一、服务端配置
1.安装NFS服务
#debian
apt install nfs-kernel-server -y
#centos
dnf install nfs-utils -y
安装完成后,服务会自动启动并设置开机自启
检查其状态:
systemctl status nfs-server
CentOS 与 Debian 最大的不同点
CentOS 默认开启 SELinux,它会阻止 NFS 访问非标准的目录。你需要修改 SELinux 布尔值或上下文。
方法 A(推荐):修改 SELinux 布尔值
允许 NFS 读写主目录或通用目录:
# 允许 NFS 导出任何目录(读写)
setsebool -P nfs_export_all_rw 1
# 如果只需要只读
setsebool -P nfs_export_all_ro 1
方法 B:修改目录安全上下文
如果你只想共享特定目录,可以使用此方法:
# 设置目录为 NFS 共享类型
semanage fcontext -a -t nfsd_rw_t "/data/nfs_share(/.*)?"
# 应用上下文
restorecon -Rv /data/nfs_share
2.创建共享目录
创建一个共享的目录,例如 /srv/nfs_share:
# 创建目录
mkdir -p /srv/nfs_share
# 设置权限(为了测试方便,暂时给予所有权限,生产环境请根据需求设置)
# nobody:nogroup 是一个通用的无权限用户,适合公共共享目录
chown -R nobody:nogroup /srv/nfs_share
chmod -R 755 /srv/nfs_share
755(用户完全控制)555(所有者、组、其他用户都只有读和执行权限)或 444(仅读权限)
常见的权限表示形式有:
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
3.配置NFS导出
配置导出规则谁可以访问
vim /etc/exports
配置文件
# 格式: 共享路径 客户端网段(选项)
/srv/nfs/share 192.168.1.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
# 推荐选项说明:
# rw: 读写 | sync: 同步写入(安全)| no_subtree_check: 提升性能
# crossmnt: 支持子目录挂载 | fsid=0: NFSv4 根导出(必需)
#一个 NFS 服务器上,`fsid=0` 只能出现一次
参数说明:
| 参数 | 说明 |
|---|---|
| rw | 允许读写访问 |
| ro | 只读访问(默认) |
| sync | 同步写入(数据立即写入磁盘,保障数据安全) |
| async | 异步写入(性能更高,数据可能丢失风险) |
| no_subtree_check | 禁用子树检查(提升性能,推荐) |
| subtree_check | 启用子树检查(安全但影响性能) |
| no_root_squash | 保留 root 用户权限(慎用,安全风险) |
| root_squash | 将 root 用户映射为匿名用户(默认) |
| all_squash | 不管访问NFS Server目录的用户身份如何,它的权限都是匿名用户 |
| crossmnt | 允许跨越文件系统边界支持子目录挂载 | fsid=0: NFSv4 根导出(必需) |
| anonuid/anongid | 指定匿名用户 UID/GID(nobody 对应 65534) |
| insecure | 允许NFS客户端不使用NFS保留端口(通常是1024以上的端口) |
| fsid=0 | 它标识了该共享目录是 NFS 伪文件系统的根目录在一个 NFS 服务器上,fsid=0 只能出现一次。如果配置了多个 fsid=0,会导致挂载问题,fsid=0 通常与 crossmnt 参数一起使用,以允许跨挂载点访问在某些高可用性场景中,fsid=0 是实现 NFS 高可用性的必要条件 |
示例
#允许单个 IP 访问(读写)
/srv/nfs_share 192.168.1.100(rw,sync,no_subtree_check)
#允许整个网段访问(读写)
/srv/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check)
#只读共享
/srv/nfs_share 192.168.1.0/24(ro,sync,no_subtree_check)
#允许客户端的 root 用户保留 root 权限,默认NFS 会将客户端映射为匿名用户
#这个权限可能会带来安全风险,因为客户端的 root 用户可以对共享目录进行任意操作
/data 192.168.1.100(rw,no_root_squash)
#映射为服务器的匿名用户
/data 192.168.1.100(rw,all_squash)
#指定匿名用户的 UID 和 GID,通常与 all_squash 或 root_squash 一起使用。
/data 192.168.1.100(rw,all_squash,anonuid=1001,anongid=1001)
生效配置
exportfs -a
systemctl restart nfs-kernel-server
# 重载配置(无需重启服务)
exportfs -ra
# 验证导出
exportfs -v
# 启动并设置开机自启
systemctl enable --now nfs-kernel-server rpcbind
# 验证服务状态
systemctl status nfs-kernel-server rpcbind
4.防火墙配置
debian防火墙
#使用预定义应用规则(推荐)
#any app nfs自动开放 NFS 所需多个端口(如 111, 2049, 20048, 32769 等)
allow from 192.168.1.0/24 to any app nfs
#手动开放端口(NFSv4 通常只需 2049)
ufw allow 2049/tcp
#或者
# 允许NFS流量(NFSv4主要使用2049端口)
ufw allow from 192.168.1.0/24 to any port nfs
ufw allow from 192.168.1.0/24 to any port 111 # rpcbind端口
ufw allow from 192.168.1.0/24 to any port 32767:32799 proto tcp# NFS辅助端口
#window的nfs开放所有端口✓
ufw allow from 192.168.1.2 to any port 111
ufw allow from 192.168.1.2 to any port 1024:65535 proto tcp
# 重新加载防火墙规则
ufw reload
# 查看当前规则
ufw status verbose
ufw allow from 192.168.1.0/24 to any app nfs
app nfs:基于 UFW 应用配置文件(推荐)UFW 为常见服务预置了应用配置文件,位于
/etc/ufw/applications.d/UFW 自动展开为多个端口规则,覆盖 NFSv3/v4 所需的所有通信端口,包括:
portmapper (rpcbind):111/tcp, udp nfsd:2049/tcp, udp mountd:20048/tcp, udp statd:32769/tcp, udp
这确保了 NFS 客户端能完整完成端口映射、挂载、文件读写全过程
centos防火墙
# 1. 添加防火墙规则(允许 nfs, rpc-bind, mountd 服务)
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
# 2. 如果你的 NFS 版本是 v4(默认),通常上面就够了。
# 如果你需要 NFS v3 支持,还需要允许特定的端口(如果配置了固定端口)或直接允许协议。
# 对于大部分现代环境,执行以下命令重载防火墙即可:
firewall-cmd --reload
# 查看当前生效的规则
firewall-cmd --list-all
二、客户端配置
1.安装NFS客户端
#debian
apt install nfs-common -y
#centos
dnf install nfs-utils -y
2.创建挂载点
mkdir -p /mnt/nfs
临时挂载(假设服务器 IP 为 192.168.1.100)
mount -t nfs 192.168.1.100:/srv/nfs/share /mnt/nfs
mount -t nfs4 服务器IP:/ /mnt/nfs # NFSv4 挂载根(因 fsid=0)
永久挂载:编辑 /etc/fstab 添加
vim /etc/fstab
添加以下内容
192.168.1.100:/srv/nfs/share /mnt/nfs nfs defaults 0 0
#示例
192.168.1.100:/data/nfs/share /mnt/nfs nfs4 _netdev,hard,intr,timeo=600,retrans=2,noatime 0 0
挂载选项说明:
defaults:使用默认选项(rw,suid,dev,exec,auto,nouser,async)
_netdev:告诉系统这是一个网络设备。系统会等待网络初始化完成后再尝试挂载,避免“网络未就绪导致挂载失败”的问题hard:硬挂载。如果 NFS 服务器宕机或无响应,客户端会一直尝试重试,直到服务器恢复。这能保证数据不丢失。intr:允许用户中断(Ctrl+C)一个因为 NFS 故障而卡住的进程。如果没有这个,你可能无法强制关闭卡死的文件操作。**
timeo=600****: 超时时间(单位是 0.1 秒,即 60 秒)。在hard模式下,第一次重试前的等待时间。retrans=2: 重试次数。noatime: 不更新文件的访问时间。这能显著减少 NFS 的 I/O 操作,提升性能。rw/ro: 读写 或 只读(默认是rw)如需更优性能,可添加
rsize=8192,wsize=8192(调整读写块大小)
进阶:解决开机挂载卡死问题
如果你的 NFS 服务器偶尔会关机,而你的客户端(Linux 机器)重启时可能会因为连不上 NFS 服务器而卡在启动界面(进入紧急模式),可以使用 Systemd 自动挂载 特性。
这是一种现代的、推荐的写法,只有当你真正访问那个目录时,它才会去挂载。
写法:
192.168.1.100:/data/nfs/share /mnt/nfs nfs4 _netdev,x-systemd.automount,x-systemd.idle-timeout=600,noatime 0 0
x-systemd.automount: 核心参数。开机时不立即挂载,而是创建一个挂载点。当你cd /mnt/nfs时,系统才会触发挂载动作。x-systemd.idle-timeout=600:(可选)如果 10 分钟(600秒)没有访问该目录,自动卸载,节省网络资源。
NFS Client挂载参数详解
| 参数 | 参数功能 | 默认参数 |
|---|---|---|
| fg、bg | 当在客户端执行挂载时,可选择是前台(fg)还是在后台(bg)执行。若在前台执行,则mount会持续尝试挂载,直到成功或挂载时间超时为止,若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其他程序操作。如果网络联机不稳定,或是服务器常常需要开关机,建议使用bg比较妥当。 | fg |
| soft、hard | 当NFS Client以soft挂载Server时,若网络或Server出现问题,造成Client和Server无法传输资料,Client就会一直尝试,直到timeout后显示错误才停止.若使用soft mount的话,可能会在timeout出现时造成资料丢失,故一般不建议使用。 若用hard模式挂载硬盘时,刚好和soft相反,此时Client会一直尝试连线到Server,若Server有回应就继续刚才的操作,若没有回应NFS Client会一直尝试,此时无法umount或kill,所以常常会配合intr使用。这是默认值。 | hard |
| intr | 当时用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,者避免出问题时系统整个被NFS锁死,建议使用intr。 | 无 |
| rsize、wsize | 读出(rsize)与写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务器端传输数据的缓冲存储量,一般来说,如果在局域网内(LAN),并且客户端与服务器端都具有足够的内存,这个值可以设置大一点,比如说65535(bytes),提升缓冲区块将可提升NFS 文件系统的传输能力。但设置的值也不要太大,最好以网络能够传输的最大值为限。 | Centos6 默认值: rsize=131072 wsize=131072 |
| proto=udp | 使用UDP协定来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用proto=udp多传输的数据会有比较好的纠错能力。 | proto=udp |
| 可通过man nfs查看上述参数信息。如果追求极致,可以使用如下挂载参数: mount -t nfs -o fg,hard,intr,rsize=131072,wsize=131072 172.16.1.31:/data/ /mnt | ||
| 但是如果考虑以简单、易用为原则,可直接选择默认值就可以 mount -t nfs 172.16.1.31:/data/ /mnt |
生效挂载
mount -a
3.Windows客户端安装
打开 控制面板 > 程序 > 启用或关闭Windows功能。
勾选 NFS客户端,然后点击确定。
挂载NFS共享目录
打开命令提示符(CMD)。
使用以下命令挂载NFS共享:
mount -o anon 192.168.1.100:/srv/nfs/share Z:
挂载成功后,可以在资源管理器中看到新增的网络驱动器。
我的电脑→映射网络驱动器→文件夹输入:\\\192.168.1.100\srv\nfs\share
需要读写权限的需要修改注册表
通过修改注册表将windows访问NFS时的UID和GID改成0即可,步骤如下 1、在运行中输入regedit,打开注册表编辑器; 2、进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default条目; 3、选择新建----QWORD值,新建AnonymousUid,AnonymousGid两个值,值为0;
卸载NFS挂载
#卸载
umount Z:
#卸载所有挂载:
umount -f -a
三、NFSv4高级配置(推荐)
NFSv4 相比 v3 更安全、易管理,以下是 Debian 13 推荐配置:
1. 禁用旧版 NFS 协议(增强安全性)
编辑/etc/default/nfs-kernel-server,添加以下内容:
vim /etc/default/nfs-kernel-server
添加:
RPCNFSDOPTS="-N 2 -N 3" # 禁用NFSv2和v3
RPCMOUNTDOPTS="--manage-gids -N 2 -N 3"
2. 重启服务使配置生效
systemctl restart nfs-kernel-server rpcbind
3. 验证 NFS 版本
# 服务器端查看支持版本
cat /proc/fs/nfsd/versions
# 客户端指定NFSv4挂载
mount -t nfs4 192.168.1.100:/srv/nfs/shared /mnt/nfs
mount -t nfs -o vers=4 服务端IP:/共享目录 /挂载点
四、故障排查
1. 挂载失败:权限被拒绝
检查服务器
/etc/exports中客户端 IP / 网段是否正确确认共享目录权限(nobody:nogroup 或指定用户)
检查目录权限、
exports中root_squash/anonuid设置检查防火墙是否放行 NFS 流量(2049 端口)
服务状态:
systemctl status nfs-server确保是 active (running)。NFSv4 无法挂载确保
fsid=0已设置,客户端使用nfs4类型挂载
2. 写入文件时权限不足
- 确认服务器共享目录
chmod权限(至少 755) - 检查
/etc/exports中是否包含rw选项 - 生产环境建议使用相同 UID/GID的用户访问
3. 服务启动失败
检查
/etc/exports运行:
exportfs -v查看当前系统实际导出的目录和参数是否正确。确认 rpcbind 服务已正常运行:
systemctl status rpcbind有时需要重启
rpcbind服务:systemctl restart rpcbind查看日志排查:
journalctl -u nfs-kernel-server -f
常用管理命令
| 命令 | 用途 |
|---|---|
| exportfs -ra | 重新加载 exports 配置 |
| exportfs -v | 查看当前导出的 NFS 共享 |
| umount /mnt/nfs_server | 卸载客户端挂载点 |
| systemctl stop nfs-kernel-server | 停止 NFS 服务 |
| showmount -e 192.168.1.100 | 查看服务器导出的共享列表 |
五、安全加固建议(生产环境)
限制客户端访问:在/etc/exports中使用具体 IP / 网段,避免*
使用 NFSv4:禁用 v2/v3,启用身份验证和加密
防火墙精细化:仅放行必要端口给指定客户端
权限最小化:避免777权限,使用特定用户组控制访问
定期更新:apt upgrade -y保持系统和组件最新