nfs只读导出需配置ro选项并结合root_squash或all_squash映射:默认root_squash将客户端root映射为nfsnobody,all_squash则映射所有用户;还需设置合理目录权限、运行exportfs -ra重载、防火墙放行2049端口,并禁用no_root_squash等高危选项。

要在Linux中通过NFS安全地配置只读导出(ro)并结合用户权限映射(如all_squash或root_squash),核心是控制谁可以访问、能做什么、以及以什么身份操作文件。NFS本身不带认证,所以必须靠导出规则和UID/GID映射来堵住权限越界风险。
明确只读导出的基本写法
编辑 /etc/exports,为共享目录指定 ro 选项,并限制客户端范围:
- 只允许某网段只读挂载:/srv/nfs/public 192.168.1.0/24(ro,sync,no_subtree_check)
- 只允许单个IP只读访问:/srv/nfs/docs 192.168.1.10(ro,sync,root_squash)
- 禁止所有客户端写入——哪怕配置了 rw,只要服务器端文件系统本身权限为只读(如挂载时加 ro 选项),实际仍无法写入
用 Squash 映射消除 root 权限隐患
NFS默认启用 root_squash(无需显式写出),这是关键防线:客户端的 root 用户在服务端会被强制映射为 nfsnobody(或 UID/GID 65534)用户,失去特权。若需进一步收紧,可主动使用 all_squash:
- root_squash:仅压缩 root 用户,普通用户保留原 UID/GID(适合内部可信用户)
- all_squash:所有用户(含普通用户)都映射为匿名用户,彻底剥离身份关联(适合公共只读共享)
- 搭配 anonuid 和 anongid 指定映射目标,例如:all_squash,anonuid=65534,anongid=65534
配套加固要点不能漏
只设 ro 和 squash 还不够,还需同步落实:
- 确保导出目录本身权限合理,例如:chmod 755 /srv/nfs/public,且属主不是 root(可用 nfsnobody)
- 重启服务后运行 exportfs -ra 重载规则,并用 showmount -e localhost 验证导出是否生效、参数是否正确
- 防火墙放行 NFS 必要端口(通常为 2049/tcp,若用固定端口还需放开 rpcbind 等相关端口)
- 禁用高危选项:no_root_squash 绝对不要出现在只读共享配置中;insecure 也建议避免,除非客户端明确要求非特权端口
验证是否真正生效
在客户端挂载后,尝试以下操作确认防护有效:
- 用普通用户挂载,检查能否 ls 目录内容(应可)
- 尝试 touch testfile 或 echo "x" > file(应报 Permission denied)
- 用 root 用户挂载后,检查创建的文件属主是否为 nfsnobody(而非 root)











