2.7.3 端口与会话排查(ss/netstat/lsof)
本节聚焦端口与会话排查,常见目标包括:确认服务是否在监听、定位占用端口的进程、验证连接是否建立、识别异常连接与连接风暴。核心工具为 ss、netstat、lsof,结合 /proc 与日志进行闭环定位。
一、原理草图:端口、连接、进程关联
二、工具安装与校验
- 安装与确认(基于常见发行版)
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y iproute2 net-tools lsof
# RHEL/CentOS/Alma/Rocky
sudo yum install -y iproute net-tools lsof
# 验证
ss -V
netstat --version
lsof -v | head -n 2
- 作用说明
iproute2提供ssnet-tools提供netstatlsof用于文件句柄/端口与进程映射
三、ss:快速定位监听与连接
- 常用命令与解释
# 监听端口与进程
ss -lntp
# -l: listen,-n: 数字显示,-t: TCP,-p: 进程
# 监听 TCP/UDP
ss -lntu
# 所有 TCP 连接及进程
ss -antp
# 协议栈统计摘要
ss -s
- 完整排查示例:服务不可达
PORT=8080
echo "[1] 查看监听"
ss -lntp | grep ":${PORT} "
echo "[2] 查看连接状态分布"
ss -antp | grep ":${PORT} "
echo "[3] 统计状态数量"
ss -antp | awk 'NR>1{print $1}' | sort | uniq -c | sort -nr
预期效果:
- 若无 LISTEN → 服务未启动或端口配置错误
- SYN-RECV 激增 → 可能被洪泛/防火墙异常
- TIME-WAIT 激增 → 连接短频或主动关闭过多
四、netstat:兼容与历史对照
- 常用命令与解释
# 监听端口与进程
netstat -lntp
# 所有连接
netstat -antp
# 网卡统计
netstat -i
- 输出关注点
Recv-Q/Send-Q不为 0 → 应用处理不及时或网络拥塞
五、lsof:精准定位占用端口与句柄
- 常用命令与解释
# 查端口占用
lsof -i:8080
# 查监听端口
lsof -iTCP:8080 -sTCP:LISTEN
# 查看进程持有的网络/文件资源
lsof -p 12345 | head -n 20
- 端口被占用示例
PORT=3306
lsof -i:${PORT}
# 预期输出含 PID/COMMAND/USER
# 若非预期进程占用,可进一步确认启动路径
ps -fp $(lsof -t -i:${PORT})
六、排错流程示例(含命令解释)
1. 业务报错连接超时
2. 确认监听
ss -lntp | grep ":${PORT} "
# 解释:若无输出,说明无监听或权限不足
- 若有监听,检查连接状态
ss -antp | grep ":${PORT} "
# 解释:SYN-RECV 多为握手异常,ESTAB 稳定为正常连接
- 确认端口占用是否为目标服务
lsof -iTCP:${PORT} -sTCP:LISTEN
# 解释:定位具体 PID/USER/COMMAND
- 结合日志与内核指标
# 查看半连接队列与溢出情况
cat /proc/net/tcp | wc -l
ss -s | sed -n '1,3p'
七、抓包联动的最小示例
PORT=8080
# 只抓目标端口的握手包
tcpdump -nn -i eth0 "tcp port ${PORT} and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)" -c 20
预期:看到 SYN/SYN-ACK/ACK 三段握手是否完整。
八、练习与验收
- 练习 1:模拟端口占用
# 启一个临时监听
nc -l 9090 &
ss -lntp | grep :9090
lsof -iTCP:9090 -sTCP:LISTEN
kill %1
验收:能定位 PID 与进程名。
- 练习 2:模拟 TIME-WAIT 增多
# 客户端反复短连接(需服务端先有监听)
for i in $(seq 1 200); do curl -s http://127.0.0.1:8080/ >/dev/null; done
ss -ant | grep TIME-WAIT | wc -l
验收:TIME-WAIT 数量明显上升,理解短连接代价。
九、实战提示
- 对外连接排查需同时检查本机出站与对端入站防火墙
- PID 变更快时可结合 systemctl status 与服务日志
- 结合 ulimit -n 与 ss -s 判断句柄与连接上限压力
- 不随意杀系统服务;先确认启动路径与配置文件