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 提供 ss
  • net-tools 提供 netstat
  • lsof 用于文件描述符视角排查

工具对比与适用场景#

  • 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

练习#

  1. 使用 ss 找出本机所有监听在内网IP上的端口,并解释输出中的 LISTENESTAB
  2. lsof 查出占用 3306 的进程与用户,写出 PID 与启动用户。
  3. 将 Nginx 从 127.0.0.1:8080 改为 0.0.0.0:8080,验证远程可访问并记录 ss 输出变化。
  4. 编写一条 netstat 命令统计当前 TCP 各状态数量,并说明 TIME_WAIT 的含义。

注意事项与最佳实践#

  • 生产环境优先使用 ss,避免 netstat 在高连接数下卡顿。
  • lsof 输出含敏感信息,建议仅在需要时使用并限制权限。
  • 端口审计应形成固定清单,结合 CMDB/配置管理保持一致性。
  • 对外端口变更需同步更新安全策略与监控告警规则。