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: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
$ sudo lsof -i:80 # 按端口查
$ sudo lsof -i -P -n | grep LISTEN
ss 和 lsof 都能干这活。ss 更快、更常装;lsof 输出更详细(能看到打开的文件)。先记 ss。
怎么测端口通不通
$ curl -I http://127.0.0.1 # 测本机回环
HTTP/1.1 200 OK
$ curl -I http://10.211.55.7 # 用真实 IP 测(更接近外部视角)
# 在 Mac 终端里敲,把 IP 换成你虚拟机的
$ curl -I http://10.211.55.7
$ nc -zv 10.211.55.7 80 # 只测端口通不通,不管协议
如果服务监听的是 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 能绑定。这就是为什么 nginx 要用 root 启动主进程(然后再降权给 nginx 用户跑 worker)——Day 07 讲属主时那个"master 是 root、worker 是 nginx"的现象,根源就在这。
今天的面试点
「sudo ss -tunlp | grep 端口号 找出占用的进程和 PID,先确认那是什么服务——如果是废弃的进程就停掉,如果是更重要的服务,就改自己这边的端口。」
强调"先确认再动手",比直接说"kill 掉"稳重得多。
「ss 是 netstat 的替代品,直接从内核读数据,连接多的时候快得多;netstat 属于 net-tools,RHEL 7 之后默认不装了。」
今天的练习
sudo ss -tunlp,看看你这台机器开了哪些端口、分别是谁开的- 把五个字母
t u n l p各自的含义说出声过一遍 sudo ss -tunlp | grep :22,确认 sshd 监听的是0.0.0.0还是别的- 重点:
curl -I http://127.0.0.1和curl -I http://你的虚拟机IP各测一次,理解两者的区别 - 在你的 Mac 终端上敲
curl -I http://虚拟机IP,看能不能通(不通很正常,明天讲防火墙) - 复习:用 Day 14 的方法起一个
python3 -m http.server 8000 &,然后用ss找到它,再kill掉
Day 18 讲 firewalld,并回答那道标准面试题:「本机能访问,外面访问不了,怎么办?」
今天学的监听地址是第一层,明天的防火墙是第二层。