第 7 章 · 02 看端口:`ss`、`netstat`


文档摘要

第 7 章 · 02 看端口: 、 本节摘要:确认了本机有 IP,下一步要确认「我的服务到底在不在监听端口」。这是排查「为什么连不上我的服务」的第二步——很多时候服务进程在跑,却没绑上端口(绑了 127.0.0.1 而非 0.0.0.0、或绑端口失败)。 是现代的端口查看命令(与 同属 iproute2),取代了老牌的 。本节要讲清 这个「端口排查标准命令」每个字母的含义,以及如何用它确认服务监听状态。 内容来源:综合 / 知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 用 列出本机所有 TCP 监听端口及其进程。 解读 (TCP)、 (仅监听)、 (不反解)、 (显示进程)四个选项的含义。 说清 (iproute2)取代 (net-tools)的原因(与 取代 同理)。

第 7 章 · 02 看端口:ssnetstat

本节摘要:确认了本机有 IP,下一步要确认「我的服务到底在不在监听端口」。这是排查「为什么连不上我的服务」的第二步——很多时候服务进程在跑,却没绑上端口(绑了 127.0.0.1 而非 0.0.0.0、或绑端口失败)。ss 是现代的端口查看命令(与 ip 同属 iproute2),取代了老牌的 netstat。本节要讲清 ss -tlnp 这个「端口排查标准命令」每个字母的含义,以及如何用它确认服务监听状态。

内容来源:综合 ss/netstat 知识整理,套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. ss -tlnp 列出本机所有 TCP 监听端口及其进程。
  2. 解读 -t(TCP)、-l(仅监听)、-n(不反解)、-p(显示进程)四个选项的含义。
  3. 说清 ss(iproute2)取代 netstat(net-tools)的原因(与 ip 取代 ifconfig 同理)。
  4. ss 输出判断服务监听状态:绑在 127.0.0.1(只能本机访问)还是 0.0.0.0/*(对外开放)。
  5. 排查「服务进程在跑但端口连不上」的典型原因(绑错地址、防火墙、IPv6 only)。

一、设计动机:为什么进程在跑却连不上

服务部署的经典坑:你启动了一个 web 服务,ps 看进程在跑,systemctl status 显示 active,但用 curl 访问就是连不上。问题可能出在三个环节之一:

  1. 进程根本没成功监听端口(绑端口失败、配置错误)。
  2. 监听了但绑错地址(绑了 127.0.0.1 只允许本机访问,外部连不上)。
  3. 监听正常,但防火墙挡了

ss 就是用来排查第 1、2 环节的——它告诉你「进程到底有没有在端口上监听、绑在哪个地址」。

二、高频组合与实战

端口排查标准命令:ss -tlnp

ss -tlnp # 端口排查的标准四件套

四个字母的含义:

选项 全称 含义
-t tcp 只看 TCP(还有 -u UDP)
-l listening 只看「监听」状态的套接字(服务端)
-n numeric 不反解 IP/端口为域名/服务名(快且精确)
-p processes 显示占用套接字的进程(需 root 看全)

典型输出:

State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 *:* users:(("sshd",pid=1234,fd=3)) LISTEN 0 128 127.0.0.1:3306 *:* users:(("mysqld",pid=5678,fd=21)) LISTEN 0 511 *:80 *:* users:(("nginx",pid=9012,fd=6))

解读「Local Address」一列——绑地址的含义

这是本节的关键。Local Address 告诉你服务绑在哪个地址,直接决定「外部能不能访问」:

Local Address 含义 外部可访问?
0.0.0.0:80*:80 绑所有 IPv4 地址 (防火墙允许的话)
127.0.0.1:3306 只绑回环地址 不能(只能本机)
[::]:80 绑所有 IPv6(通常含 IPv4) 能(IPv6 路径)
192.168.1.10:80 只绑某块网卡的 IP 该网段能

⚠️ 注意:127.0.0.1:某端口 意味着「只允许本机访问」,是数据库等内部服务的安全默认。如果你期望外部访问却看到 127.0.0.1,就要改服务的监听地址配置(如 mysql 的 bind-address),改成 0.0.0.0 才对外。

其他常用组合

ss -tlnp # TCP 监听(服务端排查) ss -tnp # 所有 TCP 连接(含已建立的, 看谁连进来了) ss -tn state established # 只看已建立的连接 ss -ulnp # UDP 监听(-u) ss -s # 套接字统计(各类连接的数量概览)

三、netstat:老命令的对应

老系统(或装了 net-tools 的)上用 netstat,对应关系:

netstat -tlnp # 等价 ss -tlnp netstat -an # 所有连接 netstat -rn # 路由表(等价 ip route)

netstatss 的关系,等同于 ifconfigip——前者是废弃的 net-tools,后者是现代的 iproute2。新系统优先 ss

四、踩坑与排错

坑 1:服务绑了 127.0.0.1,外部连不上

最常见的「连不上」原因。ss -tlnp 看到 127.0.0.1:3306,说明 mysql 只允许本机访问。改配置文件的 bind-address = 0.0.0.0,重启服务。

坑 2:进程在跑但 ss 看不到端口

可能原因:

  • 进程绑端口失败(权限不足——1024 以下端口需 root,或端口已被占)。
  • 进程还没走到监听那一步(初始化中)。
  • 看了 IPv4 但服务只监听了 IPv6([::]:port)。

坑 3:普通用户看不到进程信息

ss -tlnp # 普通用户: Process 列空白 sudo ss -tlnp # root: 能看到进程名/PID

-p 需要足够权限才能看到别人的进程。排查系统服务务必 sudo

坑 4:看到端口监听但仍连不上——防火墙

ss 只能确认「进程在监听」。如果监听正常仍连不上,下一步查防火墙(iptables -Lfirewall-cmd --list-all)、云主机安全组。这是第 1、2、3 环节之外的第 4 环节。

本节要点回顾

  1. ss -tlnp 是端口排查标准命令:TCP(-t)、仅监听(-l)、不反解(-n)、显进程(-p)。
  2. ss(iproute2)取代 netstat(net-tools),与 ip 取代 ifconfig 同理。
  3. 「Local Address」决定外部可访问性:0.0.0.0/*(能)、127.0.0.1(只能本机,常见安全默认)、具体 IP(仅该网卡)。
  4. 127.0.0.1:端口 是「连不上」的头号原因——改服务的 bind-address 配置,重启。
  5. ss 只确认「在监听」,连不上还要查防火墙/安全组(下一个排查环节)。

下一节讲测链路可达——ping,以及它走 ICMP 带来的「ping 不通不代表服务不通」的特性。


发布者: 作者: 灏天文库 转发
评论区 (0)
U