在Linux上查看网络连接服务器,核心是掌握ss、netstat、lsof这三个命令,分别用于查看实时连接、监听端口和进程占用情况。
很多朋友第一次接触Linux服务器管理,遇到网络问题往往一头雾水,服务器连不上、端口被占用、连接数过多,这些场景都绕不开一个基本功:查看网络连接,这篇文章就按照实际排查顺序,把最常用、最有效的查看方法讲透。
先分清需求:查连接、查端口还是查进程
查看网络连接不是只有一条命令,得先想清楚你到底要看什么。
- 想确认服务器对外建立了哪些连接,看连接列表
- 想知道某个端口是否被监听,看监听状态
- 想定位是哪个程序占用了端口,需要进程与端口的对应关系
- 想评估服务器压力,看连接总数和状态分布
不同的需求侧重点不同,用的命令参数也不同,下面逐个场景拆解。
linux查看网络连接命令:ss与netstat的核心用法
在Linux上,查看网络连接的命令主要有两个:ss和netstat。ss是iproute2包提供的工具,性能远优于netstat,尤其在连接数较多的服务器上,ss几乎不会卡顿,而netstat可能会阻塞,行业共识认为ss正在逐步取代netstat,多数现代发行版默认预装了ss,而netstat需要额外安装net-tools包。
| 对比项 | ss | netstat |
|---|---|---|
| 所属包 | iproute2(默认安装) | net-tools(需安装) |
| 连接数大时性能 | 快 | 较慢 |
| 显示进程名(需权限) | 支持 | 支持 |
| 常用场景 | 日常排查、脚本监控 | 老系统兼容 |
ss命令实战:查看所有连接
ss -tunap
这条命令是最常用的组合,拆开看含义:
-t显示TCP连接-u显示UDP连接-n不做域名解析,直接显示IP和端口号,速度更快-a显示所有连接(包括监听和已建立)-p显示进程信息(需要root权限)
输出的每一行包含协议、收发队列、本地地址、远端地址、状态、进程名,比如看到ESTAB状态的行,说明这个连接已经正常建立。
netstat命令实战:老牌工具同样可靠
netstat -tunlp
参数含义类似:-l只显示监听状态的端口,-p显示进程PID和名称,这条命令常用于确认某个端口是否在监听,比如想确认Nginx是否跑在80端口,执行后看到0.0.0:80且有nginx进程名,就说明服务正常。
指定端口的查看技巧:linux 查看端口占用情况
排查端口冲突时,需要精确查看某个端口被谁占用,这里有两种高效方式。
ss配合端口过滤
ss -lntp | grep :8080
先列出所有TCP监听端口,再通过grep筛选出8080端口,输出会直接显示占用8080端口的进程名和PID。
lsof精准定位
lsof -i:8080
lsof是专门用于查看文件占用情况的工具,网络连接也算是文件描述符,执行后显示的信息更丰富,包括进程PID、用户、文件描述符类型等,如果系统提示没有lsof,用yum install lsof或apt install lsof安装。
进阶技巧:同时查看多个端口,用逗号分隔:
lsof -i:80,443
连接数统计方法:linux查询服务器连接数的实用思路
服务器被攻击、业务流量异常上涨,往往表现为连接数激增,这时候统计连接数是快速判断异常的第一步。
统计总连接数
ss -tan | wc -l
wc -l统计行数,注意第一行是表头,实际连接数要减1,想更精确就去掉表头:
ss -tan | tail -n +2 | wc -l
按状态分类统计
TCP连接有多种状态,比如ESTAB(已建立)、TIME_WAIT(等待关闭)、SYN_SENT(正在发起连接),分类统计能帮你看清连接的健康程度:
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c
输出类似这样的结果:
15 ESTAB 3 LISTEN 8 TIME_WAIT
TIME_WAIT多不代表有问题,TCP协议主动关闭连接的一方会进入这个状态并等待2分钟,但如果SYN_SENT数量很多,说明服务器向外发起连接失败,可能是网络不通或对方拒绝。
找出占用连接数最多的远程IP
ss -tan | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
这条命令把每一行的远端地址提取出来,按出现次数排序,直接列出连接数排名前10的IP,如果发现某个IP的连接数异常大,就要警觉了要么是爬虫,要么是攻击流量。
实时刷新连接状态
watch -n 2 'ss -s'
watch每2秒刷新一次命令输出,ss -s显示汇总信息,这在调试程序时特别好用,能直观看到连接数是否在增长、内存和TCP统计的变化。
从TCP状态判断网络问题:linux网络连接状态怎么看tcp
仅仅看到连接数还不够,判断网络是否健康要看状态分布,业内专家指出,TCP状态机是网络排查中最值得关注的部分,状态能告诉你连接卡在哪一步。
以下是在ss输出中常见的几个状态及含义:
- LISTEN:端口在监听,等待外部连接
- ESTAB:连接正常建立,数据可以传输
- TIME_WAIT:连接已关闭,本地等待一段时间确保数据传完
- CLOSE_WAIT:对方已关闭连接,本地程序还没调用close关闭
- SYN_SENT:本地发起了连接请求,但没收到回应
- SYN_RECV:收到了连接请求并回复了,但没确认完成
CLOSE_WAIT多,通常说明程序代码有bug,没有正确关闭socket,比如Java服务处理完请求没释放连接,就会出现大量CLOSE_WAIT,严重时耗尽文件描述符导致服务不可用。
SYN_SENT多,大概率是网络不通或者防火墙拦截了出方向的包,可以用ping或者telnet再验证一下。
排查时,建议把状态分布和连接总数结合着看,比如看TCP总览:
cat /proc/net/sockstat
这个文件记录了系统级TCP、UDP的socket统计信息,顶部的TCP: inuse就是当前已分配的TCP socket数,可以和ss的输出交叉验证。
综合排查:一次完整的linux服务器网络连接检查流程
把以上方法串起来,一个标准的网络连接排查流程是这样的:
- 先用
ss -s看整体概况,判断连接量是否正常 - 再用
ss -tan | awk ...按状态分类,看异常状态是否集中 - 然后
ss -lntp确认服务端口是否正常监听 - 接着
lsof -i:端口号定位具体进程 - 最后用
ss -tan找出大量连接的来源IP,做进一步判断
拿一个实际场景举例:业务反馈web服务访问很慢,执行ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c,如果发现SYN_RECV有几百个且持续增长,说明服务器的半连接队列可能被塞满,这时候检查net.ipv4.tcp_max_syn_backlog这个内核参数,调大后问题往往能缓解。
再比如,你收到告警说服务器连接数超过3000,用ss -tan | wc -l确认数量后,再用ss -tan state time-wait | wc -l看TIME_WAIT占比,如果占比很大,可以修改net.ipv4.tcp_tw_reuse和net.ipv4.tcp_fin_timeout参数来加快回收,这一步一步的排查,路径非常清晰。
关于权限和工具的补充说明
查看网络连接时,普通用户看不到进程信息。ss -tunap不带p参数就能看所有连接,但想看到进程名和PID必须加sudo。netstat同理,这是系统安全机制,正常现象。
部分精简版容器镜像里可能没有ss、netstat或lsof,最低配的排查方式是用cat /proc/net/tcp查看原始TCP连接表,但可读性很差,一般还是推荐装好工具再排查,Debian系安装:apt install iproute2 net-tools lsof,RedHat系安装:yum install iproute net-tools lsof。
常见问题解答
没有netstat命令,是系统坏了吗
不是,新版Linux发行版默认不再安装net-tools包,所以netstat命令不存在,直接用ss替代即可,ss是官方推荐的现代替代工具,功能和语法基本对应,如果确实需要用netstat,用包管理器安装net-tools就行。
连接数太多,怎么快速找到是哪个进程
用ss -tunap带p参数,输出最后一列就是进程PID和名称,如果连接数上万,直接grep筛选可疑端口或IP:先通过ss -tan | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head确定异常IP,再ss -tunap | grep 那个IP,就能看到对应的进程名和PID。
ss显示的结果和netstat不一致,以哪个为准
以ss为准。ss直接读取内核socket信息,数据更新更及时;netstat在某些场景下有缓存,可能滞后几秒,此外两者统计口径有细微差异,netstat默认不显示UDP的某些监听项,ss则更全面,业务排查中遇到不一致,优先信任ss的输出。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/786387.html


