Linux ss 命令:查看监听端口、连接状态与进程

ss 用于查看 Linux 套接字的监听端口、连接状态及相关进程。套接字是程序进行通信的端点;查到本地监听,只说明存在相应端点,不能直接证明外部客户端能通过防火墙、路由并访问服务。

ss 属于 iproute2,除了 TCP 和 UDP,还可查询其他类型的套接字。不带选项时通常显示非监听的已连接套接字;检查服务器端口时,应明确选择监听范围与协议,而不是在默认输出中寻找所有服务。

基本语法与检查范围

ss [option] [filter]

这是说明性语法,方括号与占位名称不是必须原样输入的参数。先用 ss --version、ss --help 或 man ss 确认本机支持情况。以下重点讨论 TCP(传输控制协议)和 UDP(用户数据报协议)。

结果属于当前网络命名空间,也就是当前进程所在的网络隔离范围。容器内、宿主机和其他命名空间中的监听情况可能不同;查询时间点也会影响短连接的显示。无匹配行时,应先确认范围、筛选条件与错误消息。

监听端口与连接筛选示例

查看 TCP 监听端口。

ss -ltn

-l 只显示监听范围,-t 选择 TCP,-n 以数字形式显示端口,不把端口号换成服务名。观察本地地址、端口和状态;这条查询不修改监听配置,也不会替服务开放网络访问规则。

查看 TCP、UDP 的监听范围及进程。

sudo ss -ltnup

-t 与 -u 一起选择两种协议,-p 请求显示使用套接字的进程。已有权限足够时不必提权;需要查看其他用户的信息时,按本机授权使用 sudo。进程栏为空也可能与权限、进程已经退出或可见范围有关,不能断定端口没有使用者。

UDP 不进行 TCP 那样的握手,也没有同样的 LISTEN、ESTAB 状态含义。用于接收数据的未连接 UDP 套接字常显示 UNCONN;UDP 的 connect 可以设置默认对端,但不代表建立了可靠的 TCP 式连接。

按本地或对端端口筛选 TCP 非监听套接字。

ss -tn '( sport = :22 or dport = :22 )'

在这类本机套接字查询中,sport 对应本地端口,dport 对应对端端口,or 表示任一条件匹配。外层单引号让括号和表达式作为筛选内容交给 ss,避免被 shell 当作控制语法。

此处没有 -l,不是查看 22 端口监听服务的命令;也没有按 established 状态进一步限制,不能把所有匹配行都当作已完成连接。22 只是示例端口,实际服务可以使用其他端口;端口数字本身也不证明进程身份。

怎样读取 LISTEN 与绑定地址

再次运行 TCP 监听查询,下面给出一行构造的输出示例,地址、队列值及列宽均不代表本机实测:

ss -ltn

示例输出节选:

State  Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0      128    0.0.0.0:22         0.0.0.0:*

LISTEN 表示 TCP 被动等待新连接。Local Address:Port 是本地绑定端点,Peer Address:Port 是对端端点;监听行中的通配对端不表示已经与任意远端建立了连接。应用程序接受连接后,会有相应的连接套接字。

这里的 0.0.0.0:22 表示在该命名空间内以 IPv4 通配地址绑定 22 端口,不是某个实际远端地址。只绑定 127.0.0.1 的服务主要供本机回环访问,不能直接通过外部接口地址访问;反向代理或端口转发属于额外路径,需要另外核实。

IPv6 的 ::1 是回环地址,通配绑定常显示为 [::] 或相应通配形式。不要仅凭一行 IPv6 通配监听就断定 IPv4 也一定可用;可分别用 ss -4ltn、ss -6ltn 核对,并从实际客户端验证。

对这里的 TCP LISTEN 行,Recv-Q 反映等待接受的连接队列,Send-Q 反映监听积压队列的限额。128 是示例队列值,不是总连接数、端口数量或所有机器的固定默认值;不能直接套用为已连接套接字的数据量解释。

主要选项与范围区别

选项 含义与限制
-l 选择监听范围,不能据此验证外部可达性。
-t / -u 选择 TCP 或 UDP;斜线表示备选,组合 -tu 可同时查询。
-n 保留数字端口表示,避免把服务名当作进程身份。
-p 显示使用套接字的进程信息,受权限和可见范围影响。
-a 包含监听与非监听套接字,仍受协议及其他筛选条件限制。
-s 显示套接字汇总统计,不等于逐项列出端口和进程。

排查本地端口冲突时,可按权限使用 ss -ltnp 确认 TCP 监听者,同时核对协议、地址族及绑定地址。TCP 与 UDP 的相同数字端口不是同一个端点,不能仅按端口数字判断冲突。

本地监听正常,外部仍连接失败怎么办

  1. 先确认服务确实监听在预期协议、地址族、地址与端口上,排除只绑定回环或运行位置不对。
  2. 根据授权核对进程身份及服务配置,不因进程栏为空就直接终止未知任务。
  3. 分别检查主机防火墙、云安全规则、路由和回程路径;存在代理、地址转换或容器发布端口时,一起核对这些边界。
  4. 从预期客户端进行获准的实际连接,并核对应用层响应;仅有 TCP ESTAB 也不能证明登录、加密协商或业务请求成功。

地址与路由的分层核对可参阅 Linux ip 命令与网络排查。ss 是套接字状态快照,不是外部端口扫描结果,也不是防火墙规则列表。

本篇查询不需要停止服务、清空规则或关闭连接。ss 的 -K 会尝试强制关闭套接字,不能为了查看更多信息而追加;发现异常后应先确定归属与影响,再按照服务自身的维护流程处理。

常见问题

ss 中能看到端口,为什么外部仍然连接不上?

监听存在不等于整条访问路径可用。应分别核对绑定地址、IPv4 与 IPv6、命名空间、主机及云端规则、路由与实际服务响应,不能只因显示 0.0.0.0 就认定所有客户端都能访问。

官方文档

ss 命令手册说明选项和表达式;TCP 手册与 UDP 手册说明协议差异;IPv4 地址与绑定手册说明通配和回环地址;sock_diag 手册及 listen 手册说明监听队列的含义。