ss 与监听清单
ss(socket statistics)属于 iproute2 套件,是 netstat 的现代替代品,直接读内核里的套接字信息,输出更快也更全。加上 -l 参数后,它列出的就是本机所有处于 LISTEN 状态的套接字,也就是这台机器对外开放的每一个入口。监听清单是所有暴露面工作的总账:只有先把它列全,防火墙收口、端口归属确认、等保核查才有可靠起点;端口没列全,后面所有判断都建立在残缺的清单上。
基本信息
| 适用平台 | Linux(iproute2,RHEL 7+ / Ubuntu 16.04+ 默认自带) |
|---|---|
| 基本语法 | ss -tulnp |
| 常用选项 | -t TCP、-u UDP、-l 仅监听、-n 不解析服务名、-p 显示进程、-a 全部套接字 |
| 权限要求 | 普通用户可看端口;进程名与套接字标识需 root(sudo) |
典型使用场景
- 交付与上线前的基线核查:清点对外监听端口,逐条补上用途与责任人
- 安装或升级组件后的复核:确认这次变更额外打开了哪些端口
- 等保与暴露面整改:把输出填进表格即为端口台账,可直接作为测评证据
- 故障排查:服务起不来时确认端口是否被占用,或进程是否根本没在监听
- 入侵排查:发现来源不明的监听端口,顺着 -p 给出的进程定位启动脚本与二进制
常用核查命令
常用核查命令
ss -tulnp # 全部 TCP/UDP 监听套接字
ss -tulnp | grep -v 127.0.0.1 # 只看对外监听(先排掉回环)
ss -tlnp | grep :80 # 按端口过滤:80 端口由哪个进程占用
ss -tulnp | grep -E ':(21|23|3306|6379|11211)' # 高危端口专项筛查
ss -tnp state established # 抽查已建立连接与对端地址
ss -lx | head -20 # unix socket:本地进程间通信单独看
sudo ss -tulnp | head -40 # 非 root 时进程列空白,加 sudo 再复核输出逐列读法
| 列 | 含义 | 正常与异常 |
|---|---|---|
| Netid | 套接字协议类型:tcp、udp、raw 等 | 出现 raw 要确认是否有抓包或特定业务依赖 |
| State | LISTEN 表示正在等待连接,UNCONN 为无连接套接字 | 非 LISTEN 状态不接收新连接,清点暴露面时可先过滤 |
| Recv-Q | 接收队列中尚未被应用读走的字节数 | 对外监听下长期非 0 说明应用处理不过来 |
| Send-Q | 发送队列未确认字节数;LISTEN 行是 backlog 上限 | LISTEN 行的 Send-Q 是半连接队列容量,不代表积压 |
| Local Address:Port | 本机监听地址与端口,0.0.0.0 或 :: 表示全部地址 | 数据库、缓存、管理接口落在 0.0.0.0 上属高危 |
| Peer Address:Port | 对端地址,监听行通常为星号 | 监听状态下该列无实际意义 |
| Process | 占用套接字的进程名与 PID,如 sshd,pid=1234 | 空白多为权限不足;陌生进程名要立刻定位启动方式 |
云主机要做两层对照:本机监听清单不等于实际可达端口。安全组、本机防火墙、NAT 可能各挡一层,报告里把「本机监听 / 本机防火墙 / 云侧安全组」分开列,再以另一台机器实测连通性收口。
unix socket 不出现在 -tu 列表里:数据库、容器运行时与不少 systemd 服务只监听本地 socket。核对本地服务要用 ss -lx;在 tcp 列表里看到 127.0.0.1 也要留意它是否本该只走 socket。
0.0.0.0 或 :: 表示监听在全部地址,任何能路由到该主机的来源都能连;127.0.0.1 只接受本机连接。看到数据库、缓存、管理接口落在全部地址上,先按高危登记再确认是否有来源限制。
建立基线与周期比对
单次清单只反映当下状态。把 ss 输出按主机归档成基线,之后按周或按变更触发比对:新增的对外监听端口必须能说明来源,否则就是需要处置的对象。这比每次从零排查省力,也能第一时间发现被悄悄启动的服务或被人为改动的绑定地址。
整改表怎么用
把 ss 输出的监听行逐条抄进整改表,补三列即可形成结论:这一列填端口的业务用途,一列填放行范围,一列填责任人。用途写不出来的对外端口默认先收紧,等责任人说清必要性后再放行;这比争论「这个端口安不安全」有效得多。