NFS生产环境端口固化需同步配置三层:在/etc/sysconfig/nfs中设RQUOTAD_PORT=30001、LOCKD_TCPPORT=30002、LOCKD_UDPPORT=30002、MOUNTD_PORT=30003、STATD_PORT=30004;在/etc/modprobe.d/lockd.conf中添加options lockd nlm_tcpport=30002和options lockd nlm_udpport=30002;在/etc/services中追加各服务对应TCP/UDP端口映射;最后按rmmod/modprobe→restart rpcbind→restart nfs-server顺序重启,并用rpcinfo -p验证所有端口严格匹配且TCP/UDP双协议存在。

NFS 在生产环境中最让人头疼的,就是它依赖 RPC 机制动态分配端口。rpcbind(原 portmap)只固定占 111 端口,而 mountd、nlockmgr(即 lockd)、rquotad、statd 这几个关键服务默认每次启动都随机选端口,导致防火墙规则一重启就失效,安全策略形同虚设。
解决思路很明确:不让它们随机,全部绑定到你指定的、可控的端口上,并确保内核模块、用户态服务、RPC 注册三者完全对齐。以下是适用于主流国产及 CentOS/RHEL 系统(UOS、麒麟、openEuler、CentOS 7+/Rocky/AlmaLinux)的实操配置要点。
明确需固化的核心服务与端口范围
必须固定的是以下四个服务(`nfs` 和 `rpcbind` 本身端口固定:2049 和 111,无需额外设置):
- mountd:负责处理挂载请求,TCP/UDP 都要固定
- nlockmgr / lockd:文件锁管理,TCP/UDP 必须一致
- rquotad:磁盘配额服务,可选但建议固定
- statd:NFS 状态监控,必需,影响客户端异常恢复
推荐使用 30001–30004 这个干净区间(避开特权端口和常见冲突),例如:
| 服务 | TCP 端口 | UDP 端口 |
|---|---|---|
| rquotad | 30001 | 30001 |
| lockd | 30002 | 30002 |
| mountd | 30003 | 30003 |
| statd | 30004 | 30004 |
分层配置:从内核模块到服务注册全对齐
单一修改某一层(比如只改 `/etc/sysconfig/nfs`)往往无效,因为内核 `lockd` 模块、用户态 `rpc.statd`、`rpc.mountd` 各自读取不同配置源。必须同步覆盖三层:
- 用户态服务配置:写入 /etc/sysconfig/nfs(RHEL/CentOS/openEuler/UOS)或 /etc/nfs.conf(部分新版本 openEuler)
- 内核模块参数:通过 /etc/modprobe.d/lockd.conf 或 /etc/sysctl.conf 设置 `nlm_tcpport`/`nlm_udpport`
- RPC 名称映射:补全 /etc/services,让 `rpcinfo` 能正确解析服务名 → 端口
示例(通用写法,适配多数系统):
# 写入 /etc/sysconfig/nfs RQUOTAD_PORT=30001 LOCKD_TCPPORT=30002 LOCKD_UDPPORT=30002 MOUNTD_PORT=30003 STATD_PORT=30004 <h1>写入 /etc/modprobe.d/lockd.conf</h1><p>options lockd nlm_tcpport=30002 options lockd nlm_udpport=30002</p><h1>写入 /etc/services(追加)</h1><p>rquotad 30001/tcp rquotad 30001/udp lockd 30002/tcp lockd 30002/udp mountd 30003/tcp mountd 30003/udp statd 30004/tcp statd 30004/udp
重启顺序与验证要点
顺序错误会导致旧端口残留或模块未重载。务必按此顺序执行:
- 先 reload 内核模块:
rmmod lockd; modprobe lockd(或echo 1 > /proc/sys/vm/drop_caches后重启) - 再重启基础服务:
systemctl restart rpcbind - 最后重启 NFS 主体:
systemctl restart nfs-server nfs-lock nfs-idmap(UOS/麒麟可用nfs替代)
验证是否真正生效,不用看配置文件,直接运行:
rpcinfo -p localhost
输出中所有 mountd、nlockmgr、statd、rquotad 行的 port 列必须严格等于你设定的数值(如 30003、30002 等),且 TCP/UDP 两行都要出现——缺一不可。
防火墙放行策略必须匹配协议+端口+来源
仅开放 TCP 不够,NFS 大量使用 UDP(尤其锁协商、状态通知)。生产环境应按最小权限原则,只允许可信网段访问:
- 用
firewalld(推荐):新建 service 文件或直接添加 rich rule - 用
iptables:必须同时放行 TCP 和 UDP 的 111、2049、30001–30004
firewalld 示例(以 UOS/openEuler 为例):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.20.0/24" port port="111" protocol="tcp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.20.0/24" port port="111" protocol="udp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.20.0/24" port port="2049" protocol="tcp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.20.0/24" port port="2049" protocol="udp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.20.0/24" port port="30001-30004" protocol="tcp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.20.0/24" port port="30001-30004" protocol="udp" accept' firewall-cmd --reload
完成之后,客户端执行 showmount -e server_ip 应立即返回,且 mount -t nfs server_ip:/path /mnt 不卡顿——这才是端口固化真正落地的标志。

















