2.8.3 端口管理工具与配置方法(ss/netstat/lsof)
本节介绍 Linux 端口管理常用工具与典型配置方法,重点掌握 ss、netstat、lsof 的使用场景与差异,形成统一的排查与审计流程。
原理草图:端口与进程关联视角#
安装与环境准备#
- 安装命令
# RHEL/CentOS/Alma/Rocky
yum install -y iproute net-tools lsof
# Debian/Ubuntu
apt-get update && apt-get install -y iproute2 net-tools lsof
- 命令说明
iproute2提供ssnet-tools提供netstatlsof用于文件描述符视角排查
工具对比与适用场景#
- ss:内核 Socket 统计工具,速度快、信息全,推荐作为首选。
- netstat:传统工具,输出直观但性能弱,适合兼容性场景。
- lsof:基于文件描述符视角,能关联进程、用户与打开的端口,适合溯源定位。
ss 常用命令(含解释与示例)#
- 查看所有监听端口
ss -lntp
# -l 仅监听 -n 数字显示 -t TCP -p 显示进程
- 查看所有 UDP 监听
ss -lnup
# -u UDP
- 按端口筛选
ss -lntp 'sport = :80'
# 仅显示监听在80端口的进程
- 按进程筛选
ss -lntp | grep nginx
- 查看连接状态统计
ss -s
# 输出已建立/关闭/等待等统计
- 查看指定状态连接
ss -ant state established | head
# -a 所有 -n 数字 -t TCP
netstat 常用命令(含解释与示例)#
- 监听端口与进程
netstat -lntp
# -l 监听 -n 数字 -t TCP -p 进程
- 查看所有连接
netstat -antp | head
- 查看路由表
netstat -rn
# -r 路由 -n 数字
- 统计连接状态
netstat -an | awk '/^tcp/ {++S[$6]} END {for(a in S) print a, S[a]}'
# 统计 TCP 各状态数量
lsof 常用命令(含解释与示例)#
- 查看端口占用
lsof -i :3306
# 列出占用3306端口的进程与用户
- 查看监听端口
lsof -iTCP -sTCP:LISTEN -P -n
# -P 端口不解析服务名 -n 不解析DNS
- 查看某进程打开的端口
lsof -p 1234 -i -P -n
# 1234 为PID
- 查看某用户打开的端口
lsof -u www -i -P -n
# www 为用户名
端口管理与配置方法(含完整示例)#
- 服务监听与绑定地址
- 优先绑定内网或回环,减少暴露
# Nginx 配置示例
cat /etc/nginx/conf.d/demo.conf
server {
listen 127.0.0.1:8080;
server_name localhost;
location / { return 200 "ok\n"; }
}
# MySQL 配置示例
grep -n 'bind-address' /etc/my.cnf
bind-address = 127.0.0.1
- 最小暴露原则 + 防火墙配合
# 仅开放对外HTTP端口
firewall-cmd --permanent --add-port=80/tcp
# 关闭无关端口
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --reload
端口排查与故障处理(完整流程示例)#
场景:业务无法访问 8080
# 1) 端口是否监听
ss -lntp | grep :8080
# 2) 若无监听,查看进程是否启动
ps -ef | grep -E 'nginx|java' | grep -v grep
# 3) 若有监听,查看绑定地址是否错误
ss -lntp 'sport = :8080'
# 期望监听 0.0.0.0 或 业务网卡IP
# 4) 定位占用进程(端口冲突)
lsof -i :8080
# 5) 查看连接状态
ss -ant state established | grep :8080
# 6) 检查防火墙/安全组
firewall-cmd --list-ports
常见问题与处理
- 监听在 127.0.0.1 导致外网不可达 → 修改绑定地址为内网IP或 0.0.0.0
- 端口被占用 → 释放旧进程或修改新服务端口
- 防火墙未放行 → 添加端口规则并 reload
端口管理脚本示例(可执行)#
#!/usr/bin/env bash
# 文件:/usr/local/bin/port_check.sh
# 用途:检查端口监听与占用进程
PORT=${1:-80}
echo "[*] check listen on port $PORT"
ss -lntp "sport = :$PORT" || true
echo "[*] check process using port $PORT"
lsof -i :"$PORT" -P -n || true
chmod +x /usr/local/bin/port_check.sh
/usr/local/bin/port_check.sh 8080
# 预期:输出监听进程与PID
练习#
- 使用
ss找出本机所有监听在内网IP上的端口,并解释输出中的LISTEN与ESTAB。 - 用
lsof查出占用 3306 的进程与用户,写出 PID 与启动用户。 - 将 Nginx 从
127.0.0.1:8080改为0.0.0.0:8080,验证远程可访问并记录ss输出变化。 - 编写一条
netstat命令统计当前 TCP 各状态数量,并说明TIME_WAIT的含义。
注意事项与最佳实践#
- 生产环境优先使用
ss,避免netstat在高连接数下卡顿。 lsof输出含敏感信息,建议仅在需要时使用并限制权限。- 端口审计应形成固定清单,结合 CMDB/配置管理保持一致性。
- 对外端口变更需同步更新安全策略与监控告警规则。