Linux查找和定位服务、进程和端口对应关系
- 2025-12-09 19:27:00
- 丁国栋
- 原创 9
如何找到111端口对应的服务?
root@user-MZ73-LM1-000:~# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 4096/docker-proxy
tcp 0 0 0.0.0.0:9090 0.0.0.0:* LISTEN 4172/docker-proxy
tcp 0 0 0.0.0.0:11445 0.0.0.0:* LISTEN 1873054/xxf
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1/init
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 3080/nginx: master
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 2215309/python3.12
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 3624077/python3.12
tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN 2062/systemd-resolv
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 3345/dnsmasq
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 2062/systemd-resolv
tcp 0 0 0.0.0.0:39000 0.0.0.0:* LISTEN 3080/nginx: master
tcp 0 0 0.0.0.0:39090 0.0.0.0:* LISTEN 3080/nginx: master
tcp6 0 0 :::9000 :::* LISTEN 4154/docker-proxy
tcp6 0 0 :::9090 :::* LISTEN 4190/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 1/init
tcp6 0 0 :::111 :::* LISTEN 1/init
root@user-MZ73-LM1-000:~# grep 111 /etc/services
sunrpc 111/tcp portmapper # RPC 4.0 portmapper
sunrpc 111/udp portmapper
dicom 11112/tcp
root@user-MZ73-LM1-000:~#
从输出中可以看到111端口对应的服务是sunrpc,这是一个标准的RPC端口映射服务。
- 通过
netstat -ntlp查看:111端口在监听,PID为1(init进程),但实际是systemd在管理 - 通过
grep 111 /etc/services查看:确认111端口对应的是sunrpc服务
查看哪个进程实际在监听111端口
# 使用lsof查看具体进程
sudo lsof -i :111
# 或者查看systemd管理的服务
sudo systemctl status rpcbind
# 或
sudo systemctl status rpcbind.socket
查看RPC服务状态
# 查看RPC端口映射
rpcinfo -p localhost
# 查看PID 1实际运行了什么服务
ps aux | grep 111
# 或者
ss -ltnp | grep :111
111端口(sunrpc)说明
- 服务名称:sunrpc (Remote Procedure Call)
- 常见实现:rpcbind(旧称portmap)
- 作用:NFS(网络文件系统)和其他RPC服务使用它来注册和查找端口号
- 安全性:通常只在内部网络使用,如果暴露在公网可能有安全风险
RPC bind portmap service 有什么用?
RPC bind/portmap 服务是远程过程调用(RPC) 系统的核心组件,它的主要作用是端口映射和服务的动态注册与发现。
主要功能和作用
- 端口映射服务
- 就像一个电话总机,告诉客户端"哪个服务在哪个端口"
- RPC服务启动时随机选择端口,然后向portmap注册
- 客户端需要访问服务时,先查询portmap获取实际端口号
- 工作流程示例
客户端 → portmap(111端口): "NFS服务在哪?"
portmap → 客户端: "NFS在端口2049"
客户端 → 端口2049: 直接连接NFS服务
实际应用场景
- NFS(网络文件系统)
- 必需的服务,没有portmap就无法使用NFS
- NFS服务器启动时向portmap注册
- NFS客户端挂载时先查询portmap
- NIS(网络信息服务)
- 用于集中管理用户账户、密码等
- 需要portmap进行服务定位
- 其他RPC服务
- 集群管理工具
- 分布式计算服务
- 某些数据库服务
查看实际运行的RPC服务
# 查看已注册的RPC服务
rpcinfo -p localhost
输出示例:
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100005 1 udp 20048 mountd
100003 3 tcp 2049 nfs
安全考虑
- 历史漏洞
- 早期版本有多个安全漏洞
- 可能被用于DoS攻击或信息泄露
- 现代实践
- 如果不需要NFS,可以禁用
- 默认只监听127.0.0.1(回环接口)
- 可以使用防火墙限制访问
- 在云环境中通常建议禁用
禁用服务(如果不需要)
# Ubuntu/Debian
sudo systemctl stop rpcbind
sudo systemctl disable rpcbind
# RHEL/CentOS
sudo systemctl stop rpcbind
sudo systemctl disable rpcbind
查看是否必需
# 检查是否有服务依赖NFS
mount | grep nfs
systemctl list-dependencies --reverse rpcbind
可以看到111端口是监听的所有IP地址,如0.0.0.0和:::,怎么改为只监听回环接口?
将RPC bind(portmap)服务从监听所有接口(0.0.0.0和:::)改为只监听回环接口(127.0.0.1和::1)是重要的安全最佳实践。以下是几种方法:
方法1:通过systemd socket配置(推荐)
- 查看当前服务
sudo systemctl status rpcbind.socket
- 修改socket配置
# 创建或编辑socket配置
sudo systemctl edit rpcbind.socket
- 添加以下内容
[Socket]
ListenStream=127.0.0.1:111
ListenDatagram=127.0.0.1:111
ListenStream=[::1]:111
ListenDatagram=[::1]:111
- 重启服务
sudo systemctl daemon-reload
sudo systemctl restart rpcbind.socket
发表评论