从端口找到进程
抓包定位到端口之后,下一步就是把端口映射到进程。ss 是 Linux 上查看 socket 与进程归属的常用工具:带 -p 能显示占用连接的进程,配合状态过滤可以只看已建立的连接,几步就能把抓到的包和具体程序对应起来,这是排查异常连接时的标准动作。
基本信息
| 适用平台 | Linux,属于 iproute2 工具包,多数发行版预装 |
|---|---|
| 常用组合 | ss -tnp、ss -lnp |
| 权限要求 | -p 需要足够权限才显示进程信息 |
| 状态过滤 | 支持 established、time-wait 等状态 |
典型使用场景
- 抓包发现异常连接后,找出是哪个进程在收发
- 排查端口被谁占用
- 确认监听端口与服务实例是否一一对应
- 统计各状态连接数量,判断是否有连接堆积
- 与服务重启时间对照,确认连接归属变化
常用命令
常用命令
ss -tnp state established '( sport = :8080 )'
# 只看源端口 8080 的已建立连接,含进程信息
ss -lnp | grep 8080
# 查看监听 8080 的进程,确认是哪个服务实例
ss -s
# 各状态连接数量汇总,用来判断是否存在连接堆积或端口压力字段逐项读法
| 字段 | 含义 | 注意 |
|---|---|---|
| State | 连接状态 | 已建立与 TIME_WAIT 要分开看待 |
| Recv-Q / Send-Q | 收发队列长度 | 持续非零说明应用处理不过来 |
| Local / Peer | 本端与对端地址端口 | 与本端抓包结果对照 |
| Process | 进程名与 PID | 需要权限才显示 |
容器场景下宿主机的 ss 看不到容器内的进程,需要进入容器的网络命名空间或使用容器内的工具查看。对照时注意 PID 命名空间不同,宿主与容器里的 PID 不是同一个编号。
TIME_WAIT 这类已经没有进程关联的连接查不到进程属于正常现象,不要据此怀疑工具或权限。同名进程存在多实例时,要用 PID 与启动参数区分,只看进程名很容易认错对象。
排查顺序
- 从抓包里确定可疑的地址与端口组合
- 用 ss 按端口过滤,找出对应的连接与进程
- 确认进程的启动时间与抓包时间线是否吻合
- 队列持续非零时进一步查看应用日志与资源占用
- 容器环境切换到对应命名空间再复核一次