在Linux系统中,查看网络连接是日常运维和故障排查的核心操作之一,通过分析连接状态可以定位端口占用、服务异常、网络攻击等问题,Linux提供了多种命令工具,从基础到进阶,满足不同场景的需求,以下将详细介绍常用命令的使用方法、参数及适用场景。

ss命令:高效查看网络连接
ss(Socket Statistics)是Linux推荐使用的网络连接查看工具,相较于传统netstat,ss基于Netlink协议与内核通信,查询速度更快,尤其在高并发场景下优势明显。  
常用参数及功能
| 参数 | 功能 | 示例 | 
|---|---|---|
| -t | 显示TCP连接 | ss -t | 
| -u | 显示UDP连接 | ss -u | 
| -l | 仅显示监听状态的连接 | ss -lt | 
| -a | 显示所有连接(包括监听和非监听) | ss -ta | 
| -n | 以数字形式显示地址和端口(不解析域名/服务名) | ss -tn | 
| -p | 显示连接对应的进程ID和进程名 | ss -tulp | 
| -4/-6 | 仅显示IPv4/IPv6连接 | ss -4t | 
实用示例
- 查看所有TCP连接(包括进程信息):ss -tulp
- 查看监听状态的UDP端口:ss -lu
- 查看与特定IP的连接:ss -tn 'dst 192.168.1.100'
netstat命令:传统连接查看工具
netstat是早期Linux系统标配的连接查看工具,虽然部分新版本系统已默认不安装,但在兼容性要求高的场景中仍被使用,其参数与ss类似,但底层依赖/proc文件系统,查询效率较低。  
常用参数及功能
| 参数 | 功能 | 示例 | 
|---|---|---|
| -t | TCP连接 | netstat -t | 
| -u | UDP连接 | netstat -u | 
| -l | 监听状态 | netstat -lt | 
| -a | 所有连接 | netstat -ta | 
| -n | 数字形式 | netstat -tn | 
| -p | 进程信息 | netstat -tulp | 
| -c | 持续刷新输出(类似 top) | netstat -tc | 
示例
- 查看所有监听端口及进程:netstat -tulpn
- 查看TCP连接状态统计:netstat -ta|awk '{print $6}'|sort -u
lsof命令:以文件视角查看连接
lsof(List Open Files)用于列出系统打开的文件,由于Linux中网络连接被抽象为“文件”,因此可通过lsof查看连接对应的进程、用户及文件描述符信息。  

常用参数及功能
| 参数 | 功能 | 示例 | 
|---|---|---|
| -i | 显示网络连接 | lsof -i | 
| -i :端口号 | 显示指定端口的连接 | lsof -i :80 | 
| -P | 不解析端口号为服务名 | lsof -i -P | 
| -n | 不解析IP地址为域名 | lsof -i -n | 
| -u 用户名 | 显示指定用户的连接 | lsof -i -u nginx | 
| -p PID | 显示指定进程的连接 | lsof -i -p 1234 | 
示例
- 查看80端口的所有连接:lsof -i :80
- 查看Nginx进程的网络连接:lsof -i -p $(pgrep nginx)
tcpdump命令:抓包分析连接
tcpdump是强大的网络抓包工具,可用于实时分析网络数据包,适用于深层排查连接异常(如数据包丢失、协议错误)。  
常用参数及功能
| 参数 | 功能 | 示例 | 
|---|---|---|
| -i 网卡名 | 指定抓包网卡 | tcpdump -i eth0 | 
| -n | 不解析域名/端口 | tcpdump -n | 
| -c 数量 | 抓取指定数量数据包后退出 | tcpdump -c 100 | 
| port 端口号 | 过滤端口号 | tcpdump -n port 80 | 
| host IP | 过滤IP地址 | tcpdump -n host 192.168.1.100 | 
| tcp/udp | 过滤协议 | tcpdump -n tcp | 
示例
- 抓取eth0网卡上所有80端口的TCP数据包:tcpdump -i eth0 -n tcp port 80
- 抓取与目标IP的所有通信数据包:tcpdump -i eth0 -n host 8.8.8.8
其他方法:直接读取内核连接信息
Linux内核将网络连接信息存储在/proc/net/目录下,可直接查看原始数据(适合脚本处理):  
- /proc/net/tcp:TCP连接信息(十六进制格式)
- /proc/net/udp:UDP连接信息
- /proc/net/tcp6:IPv6 TCP连接
示例
- 查看TCP连接状态:cat /proc/net/tcp | awk '{print $1, $4, $6}'
- 快速查看连接:优先使用ss(如ss -tulp),高效且信息全面。
- 兼容旧系统:使用netstat,功能与ss类似但效率较低。
- 进程级排查:用lsof定位连接对应的进程(如lsof -i :80)。
- 深度抓包分析:用tcpdump捕获数据包,定位协议层问题。
- 脚本自动化:直接读取/proc/net/文件,避免依赖外部命令。
FAQs
Q1:ss和netstat查看网络连接有什么区别?哪个更推荐使用?
A:ss基于Netlink协议与内核通信,查询速度更快,尤其在高并发场景下(如数万连接)性能显著优于netstat;netstat依赖/proc文件系统,需遍历所有内核数据,效率较低,新版本Linux系统(如CentOS 7+、Ubuntu 18.04+)默认已集成ss,推荐优先使用ss,仅在需兼容旧系统时使用netstat。  

Q2:如何查看某个特定进程(如Nginx)的网络连接情况?
A:可通过以下两种方式实现:  
- 使用lsof:lsof -i -p $(pgrep nginx),其中pgrep nginx获取Nginx进程PID,-i -p筛选该进程的网络连接。
- 使用ss:ss -tulpn | grep nginx,通过进程名过滤连接信息,显示端口、协议及进程详情。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/23486.html
 
                