Linux查看网络连接数,ss和netstat命令统计
前言
服务器被攻击了?网站访问量突然暴涨?想看看当前有多少人在连接你的服务器?这时候就需要查看网络连接数了。ss 和 netstat 是两个最常用的网络连接查看命令,ss 是新版,速度更快,推荐优先用。本文就讲一下怎么用这两个命令统计网络连接数、排查网络问题。
ss 命令(推荐)
ss 是 iproute2 包自带的,比 netstat 快很多,尤其是连接数很多的时候。
基本用法
ss
显示所有TCP和UDP连接。
统计各状态连接数
ss -s
输出示例:
Total: 120
TCP: 80 (estab 30, closed 40, orphaned 0, timewait 20)
Transport Total IP IPv6
RAW 0 0 0
UDP 5 3 2
TCP 80 60 20
INET 85 63 22
FRAG 0 0 0
这就是全局统计,一眼就能看出当前有多少连接。
查看TCP连接
ss -t
只显示TCP连接。
查看所有监听端口
ss -tlnp
参数说明:
-t:TCP-l:只显示监听状态的-n:不解析域名,直接显示IP和端口-p:显示进程名
统计某个端口的连接数
比如统计80端口的连接数:
ss -tn | grep :80 | wc -l
统计各状态的TCP连接数
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
输出示例:
40 ESTAB
30 TIME-WAIT
10 LISTEN
5 CLOSE-WAIT
netstat 命令
netstat 是老牌命令,很多老脚本还在用。
基本用法
netstat -tlnp
查看监听的TCP端口。
统计各状态连接数
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
统计某个端口的连接数
netstat -an | grep :80 | wc -l
查看哪个进程在监听某个端口
netstat -tlnp | grep :80
连接状态详解
TCP连接有很多状态,常见的:
| 状态 | 含义 |
|---|---|
ESTABLISHED |
已建立连接,正在通信 |
LISTEN |
监听中,等待连接 |
TIME_WAIT |
主动关闭方等待,防止旧包干扰新连接 |
CLOSE_WAIT |
被动关闭方等待,说明程序没正确关闭连接 |
FIN_WAIT1 |
主动关闭方,等待对方回应 |
FIN_WAIT2 |
主动关闭方,已经收到对方回应 |
重点关注:
ESTABLISHED多:说明当前活跃连接多,正常TIME_WAIT多:说明短连接很多,正常但要注意CLOSE_WAIT多:说明程序有bug,没正确关闭连接
实际排查案例
案例1:看看当前有多少人访问网站
ss -tn | grep :80 | grep ESTAB | wc -l
统计80端口已建立连接的数量。
案例2:看看哪个IP连接最多
ss -tn state established '( sport = :80 )' | awk '{print $4}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -10
输出连接最多的前10个IP。
案例3:看看是不是被攻击了
如果突然有大量 TIME_WAIT 或 CLOSE_WAIT,可能是被攻击了。
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
常见坑
坑1:连接数多就是被攻击了
连接数多不一定是被攻击。如果是正常的网站访问量上涨,连接数多是正常的。要看连接来源IP分布和连接状态。
坑2:TIME_WAIT 多就优化
TIME_WAIT 是TCP协议的正常机制,不需要太紧张。除非 TIME_WAIT 数量特别多(几万几十万),影响了性能,再考虑优化。
坑3:CLOSE_WAIT 多不处理
CLOSE_WAIT 多说明你的程序有bug,没有正确关闭连接。时间长了会把文件句柄用完,导致新连接建不起来。这是程序问题,要改代码。
总结
查看网络连接数的核心命令:
- ss -s:快速看全局统计
- ss -tlnp:看监听端口和对应进程
- ss -tan | awk '{print $1}' | sort | uniq -c:统计各状态连接数
- netstat:老命令,兼容性好,但慢
推荐用 ss,比 netstat 快很多,尤其是连接数很多的时候。
遇到问题加QQ23979811 协助处理
Linux查看服务器开放端口,netstat和ss命令使用教程
前言
部署完网站后,经常需要确认某个端口是否真的开放了,或者排查服务有没有正常监听。Linux 下最常用的两个工具就是 netstat 和 ss。netstat 是老经典,几乎所有系统都自带;ss 是 iproute2 套件里的新工具,性能更好、信息更全。本文把这两个命令的常用用法都整理出来,新手照着抄就行。
netstat 命令用法
1. 查看所有监听端口
netstat -tlnp
参数说明:
-t:只显示 TCP 连接-l:只显示监听状态的端口-n:以数字形式显示端口号,不做域名解析-p:显示占用端口的进程名和 PID
输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5678/nginx
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 5678/nginx
2. 查看 UDP 端口
netstat -ulnp
把 -t 换成 -u 就是查看 UDP 端口。
3. 查看所有端口(TCP+UDP)
netstat -tulnp
4. 查看指定端口是否被占用
netstat -tlnp | grep 80
如果 80 端口被占用,会输出对应的进程信息。
5. 查看所有网络连接(不只是监听)
netstat -an
-a 表示显示所有连接,不只是监听状态的。
ss 命令用法
ss 是 netstat 的替代品,在服务器上性能更好,尤其是连接数很多的时候。
1. 查看所有监听端口
ss -tlnp
参数和 netstat 基本一样:
-t:TCP-l:监听状态-n:数字形式-p:显示进程
2. 查看 UDP 端口
ss -ulnp
3. 查看所有端口(TCP+UDP)
ss -tulnp
4. 查看指定端口
ss -tlnp | grep 443
5. 查看所有已建立的连接
ss -tn state established
可以用来统计当前服务器有多少个活跃连接。
6. 查看某个IP的连接
ss -tn dst 192.168.1.100
查看和 192.168.1.100 之间的所有连接。
两个命令的区别
| 对比项 | netstat | ss |
|---|---|---|
| 性能 | 连接数多的时候很慢 | 非常快 |
| 来源 | net-tools 包 | iproute2 包 |
| 兼容性 | 几乎所有 Linux 都有 | 新系统默认自带 |
| 功能 | 基础网络查询 | 更丰富的过滤功能 |
建议: 日常排查用 ss 更高效,老系统上找不到 ss 再用 netstat。
常见坑
坑1:看不到进程信息
执行 netstat -tlnp 或 ss -tlnp 时,如果看不到 PID/Program name 那一列,说明你不是 root 用户。加上 sudo 再执行:
sudo netstat -tlnp
sudo ss -tlnp
坑2:端口显示是 :: 而不是 0.0.0.0
0.0.0.0:80 表示监听所有 IPv4 地址的 80 端口;:::80 表示监听所有 IPv6 地址的 80 端口(同时也兼容 IPv4)。这两种都能从外网访问,不用担心。
坑3:查不到端口但服务明明启动了
检查一下服务是不是只监听了 127.0.0.1。如果 Local Address 显示的是 127.0.0.1:80,那外网是访问不了的,只能本机访问。需要修改服务配置监听 0.0.0.0。
总结
查看 Linux 开放端口记住这几个核心命令就够了:
- 常用查看:
ss -tlnp或netstat -tlnp - 查指定端口:
ss -tlnp | grep 端口号 - 查UDP端口:
ss -ulnp
日常排查优先用 ss,速度快信息全;老系统没 ss 再用 netstat。
遇到问题加QQ23979811 协助处理