← 回目录
17 Week 04 · 网络排查

端口:谁占了 80

一条命令 ss -tunlp,你以后一天要敲十次。今天还要搞懂一个概念——监听地址,明天那道标准面试题全靠它。

ss -tunlp

拆开记就不会忘
五个字母各是什么
t
TCP 连接。
u
UDP 连接。
n
numeric——直接显示数字端口,不去反查服务名。加了它快很多,而且不会把 80 显示成 "http" 让你还得换算。
l
listening——只看正在监听的(等着别人来连的),不看已建立的连接。
p
process——显示是哪个进程占的。这个最关键,但要 sudo 才看得到别人的进程。
典型输出
$ sudo ss -tunlp
Netid State  Local Address:Port   Peer Address:Port  Process
tcp   LISTEN 0.0.0.0:22           0.0.0.0:*          users:(("sshd",pid=1023,fd=3))
tcp   LISTEN 0.0.0.0:80           0.0.0.0:*          users:(("nginx",pid=3412,fd=6))
tcp   LISTEN 127.0.0.1:3306      0.0.0.0:*          users:(("mysqld",pid=2871,fd=21))

监听地址:今天的重点

0.0.0.0 和 127.0.0.1 差别巨大

看上面输出里那三行的开头——这一列决定了"谁能连上你"

Local Address 的三种值
0.0.0.0:80
监听所有网卡。本机能连,外部机器也能连。对外提供服务必须是这个。
127.0.0.1:3306
只监听回环网卡只有本机能连,外面永远连不上——哪怕防火墙全开、网络全通。数据库常这么配,是一种安全措施。
10.211.55.7:80
只监听某一块指定网卡。多网卡服务器上会这么配。
[::]:80
IPv6 的"所有地址",等价于 IPv6 版的 0.0.0.0。
明天那道题的答案,一半在这

本机 curl 得通,外面就是访问不了」——最常见的两个原因:

① 服务监听的是 127.0.0.1 而不是 0.0.0.0;② 防火墙没放行。

先用 ss -tunlp 排除第一个,再去查防火墙——顺序反了会浪费很多时间

三个高频用法

日常就这几条
# 1. 谁占了 80 端口
$ sudo ss -tunlp | grep :80

# 2. 这台机器都开了哪些端口(接手陌生服务器先看这个)
$ sudo ss -tunlp

# 3. 某个服务开在哪个端口
$ sudo ss -tunlp | grep nginx
另一个工具:lsof
$ sudo lsof -i:80          # 按端口查
$ sudo lsof -i -P -n | grep LISTEN

sslsof 都能干这活。ss 更快、更常装lsof 输出更详细(能看到打开的文件)。先记 ss

怎么测端口通不通

分清"本机通"和"外面通"
在服务器本机测
$ curl -I http://127.0.0.1        # 测本机回环
HTTP/1.1 200 OK

$ curl -I http://10.211.55.7      # 用真实 IP 测(更接近外部视角)
从别的机器测(比如你的 Mac)
# 在 Mac 终端里敲,把 IP 换成你虚拟机的
$ curl -I http://10.211.55.7
$ nc -zv 10.211.55.7 80           # 只测端口通不通,不管协议
用 127.0.0.1 测有个陷阱

如果服务监听的是 127.0.0.1,你在本机 curl 127.0.0.1 会成功,于是你以为服务没问题——但外面根本连不上。

所以本机测试时,尽量用真实 IP 而不是 127.0.0.1,能更早发现监听地址的问题。

常见端口,混个眼熟

运维天天见的
22    SSH           3306  MySQL
80    HTTP          6379  Redis
443   HTTPS         5432  PostgreSQL
53    DNS           9090  Prometheus
25    SMTP          8080  常见的备用 HTTP
1024 以下的端口要 root

小于 1024 的端口是特权端口,只有 root 能绑定。这就是为什么 nginx 要用 root 启动主进程(然后再降权给 nginx 用户跑 worker)——Day 07 讲属主时那个"master 是 root、worker 是 nginx"的现象,根源就在这。

今天的面试点

「服务起不来,说端口被占用,怎么办?」

sudo ss -tunlp | grep 端口号 找出占用的进程和 PID,先确认那是什么服务——如果是废弃的进程就停掉,如果是更重要的服务,就改自己这边的端口。」

强调"先确认再动手",比直接说"kill 掉"稳重得多。

「ss 和 netstat 有什么区别?」

ssnetstat 的替代品,直接从内核读数据,连接多的时候快得多netstat 属于 net-tools,RHEL 7 之后默认不装了。」

今天的练习

敲完再走 · 约 12 分钟
  • sudo ss -tunlp,看看你这台机器开了哪些端口、分别是谁开的
  • 把五个字母 t u n l p 各自的含义说出声过一遍
  • sudo ss -tunlp | grep :22,确认 sshd 监听的是 0.0.0.0 还是别的
  • 重点curl -I http://127.0.0.1curl -I http://你的虚拟机IP 各测一次,理解两者的区别
  • 在你的 Mac 终端上curl -I http://虚拟机IP,看能不能通(不通很正常,明天讲防火墙)
  • 复习:用 Day 14 的方法起一个 python3 -m http.server 8000 &,然后用 ss 找到它,再 kill
明天预告

Day 18 讲 firewalld,并回答那道标准面试题:「本机能访问,外面访问不了,怎么办?」

今天学的监听地址是第一层,明天的防火墙是第二层。