rpcbind 与 111 端口
111 是 SUN RPC 的端口映射服务 rpcbind(旧称 portmapper)的端口。它本身不提供服务,只负责登记与查询:某个 RPC 程序当前监听在哪个端口,客户端先问 111 拿到答案,再去连真正的服务。NFSv3 时代的文件共享、mountd 与 statd 都依赖这套机制。攻击者用 rpcinfo 就能枚举出目标上全部 RPC 服务与端口,再针对性攻击 NFS,所以 111 属于经典的高危暴露面。NFSv4 已把所需能力收敛到 2049 单端口。
基本信息
| 服务 | rpcbind(原 portmapper) |
|---|---|
| 协议 | TCP 与 UDP(均监听 111) |
| 作用 | 为 RPC 程序号提供端口查询与注册 |
| 依赖方 | NFSv3、NIS、部分备份与监控代理 |
| 配置文件 | /etc/nfs.conf 可固定 mountd 与 statd 端口 |
| 安全等级 | 严禁公网暴露 |
典型使用场景
- NFSv3 文件共享环境,客户端挂载前需要端口发现
- NIS 或依赖 RPC 的老旧应用在启动时向 rpcbind 注册
- 备份代理与监控插件通过 RPC 调用远程服务
- 资产盘点与安全评估:用 rpcinfo 确认目标开放了哪些 RPC 服务
- 排障:确认某程序是否真的注册成功、端口是否与预期一致
枚举目标 RPC 服务与挂载点
枚举目标 RPC 服务与挂载点
rpcinfo -p 192.0.2.10 # 列出程序号、协议与端口,等于一份服务清单
rpcinfo -p localhost # 本机自查,确认哪些程序仍在注册
showmount -e 192.0.2.10 # 进一步列出 NFS 导出目录
ss -lntup | grep ':111 ' # 确认本机 rpcbind 的监听范围常见 RPC 程序号
| 程序名 | 程序号 | 说明 |
|---|---|---|
| portmapper | 100000 | 即 rpcbind 自身 |
| nfs | 100003 | 文件服务主体 |
| mountd | 100005 | 负责导出列表与挂载请求 |
| nlockmgr | 100021 | 文件锁管理 |
| status | 100024 | 状态监控,配合 statd |
固定动态端口,便于防火墙收敛
固定动态端口,便于防火墙收敛
# /etc/nfs.conf
[mountd]
port=20048
[statd]
port=32765
outgoing-port=32766
# 重启相关服务后用下面命令复核端口是否已按配置固定
# rpcinfo -p localhost无 NFSv3 需求时的收敛做法
无 NFSv3 需求时的收敛做法
systemctl disable --now rpcbind rpcbind.socket # 直接停用,只保留 NFSv4 的 2049
rpcinfo -p localhost 2>&1 | head # 停用后应报无法连接
firewall-cmd --permanent --remove-port=111/tcp && firewall-cmd --reload公网暴露 111 等同于公开内网服务清单,攻击者可据此找到 NFS、mountd 与锁服务并直接尝试挂载共享目录。
NFSv4 场景不需要 111:升级到 v4 后可以把 rpcbind 停掉,防火墙只需放行 2049,暴露面明显缩小;这也是新环境优先选 v4 的原因之一。
固定端口是防火墙收敛的前提:mountd 与 statd 默认使用随机端口,把端口范围固定下来后,防火墙规则才能做到精确放行,而不必放开一大段高位端口。