Linux查找和定位服务、进程和端口对应关系

2025-12-09 19:27:00
丁国栋
原创 9
摘要:本文借助一个例子,记录如何在Linux中查找和定位服务、进程和端口对应关系。

如何找到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端口映射服务。

  1. 通过netstat -ntlp查看:111端口在监听,PID为1(init进程),但实际是systemd在管理
  2. 通过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) 系统的核心组件,它的主要作用是端口映射和服务的动态注册与发现

主要功能和作用

  1. 端口映射服务
  • 就像一个电话总机,告诉客户端"哪个服务在哪个端口"
  • RPC服务启动时随机选择端口,然后向portmap注册
  • 客户端需要访问服务时,先查询portmap获取实际端口号
  1. 工作流程示例
客户端 → portmap(111端口): "NFS服务在哪?"
portmap → 客户端: "NFS在端口2049"
客户端 → 端口2049: 直接连接NFS服务

实际应用场景

  1. NFS(网络文件系统)
  • 必需的服务,没有portmap就无法使用NFS
  • NFS服务器启动时向portmap注册
  • NFS客户端挂载时先查询portmap
  1. NIS(网络信息服务)
  • 用于集中管理用户账户、密码等
  • 需要portmap进行服务定位
  1. 其他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

安全考虑

  1. 历史漏洞
  • 早期版本有多个安全漏洞
  • 可能被用于DoS攻击或信息泄露
  1. 现代实践
  • 如果不需要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配置(推荐)

  1. 查看当前服务
sudo systemctl status rpcbind.socket
  1. 修改socket配置
# 创建或编辑socket配置
sudo systemctl edit rpcbind.socket
  1. 添加以下内容
[Socket]
ListenStream=127.0.0.1:111
ListenDatagram=127.0.0.1:111
ListenStream=[::1]:111
ListenDatagram=[::1]:111
  1. 重启服务
sudo systemctl daemon-reload
sudo systemctl restart rpcbind.socket
发表评论
博客分类