在Linux系统中,查看网络连接状态是系统管理和故障排查的核心操作之一,通过分析连接信息可以识别端口占用、异常连接、网络性能等问题,Linux提供了多种命令和工具来查看连接,涵盖TCP、UDP、Unix域套接字等不同类型,本文将详细介绍这些方法及其应用场景。
使用netstat
命令查看连接
netstat
是传统的网络连接查看工具,尽管在新版Linux中逐渐被ss
替代,但仍有广泛使用,它支持显示TCP、UDP、RAW等协议的连接状态,以及监听端口、进程ID等信息。
基本用法
-
查看所有连接
netstat -an
参数说明:
-a
显示所有连接(包括监听和非监听),-n
以数字形式显示地址和端口(不解析域名,提升速度),输出结果中,Local Address
为本地地址和端口,Foreign Address
为远程地址和端口,State
为连接状态(如LISTEN
、ESTABLISHED
、TIME_WAIT
等)。 -
过滤TCP或UDP连接
netstat -tn # 只显示TCP连接(数字形式) netstat -un # 只显示UDP连接
-
显示监听端口
netstat -lntp # 显示所有监听的TCP端口,并显示进程ID和名称
示例输出:
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 tcp6 0 0 :::80 :::* LISTEN 5678/nginx
-
显示进程对应的连接
netstat -pntp | grep nginx # 查找nginx相关的TCP连接
使用ss
命令查看连接(推荐)
ss
是iproute2
工具包的一部分,性能优于netstat
,尤其在连接数量较多时响应更快,已成为现代Linux系统的首选工具。
基本用法
-
查看所有TCP连接
ss -t
参数说明:
-t
显示TCP连接,-u
显示UDP连接,-w
显示原始套接字,-l
只显示监听端口,-n
数字形式,-p
显示进程信息。 -
查看所有监听端口
ss -tulpn
示例输出:
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* users:(("sshd",pid=1234,fd=3)) LISTEN 0 511 :::80 :::* users:(("nginx",pid=5678,fd=7))
-
显示TCP状态统计
ss -s
输出会显示TCP总连接数、各状态(
ESTABLISHED
、TIME_WAIT
、CLOSE_WAIT
等)的连接数,帮助快速判断网络状态。 -
过滤特定端口的连接
ss -tulpn | grep ':80' # 查看80端口的监听情况 ss -tp 'state established' # 查看所有已建立的TCP连接
使用lsof
命令查看进程连接
lsof
(list open files)用于列出进程打开的文件,在Linux中,网络连接也被视为文件(通过文件描述符管理),因此可通过lsof
查看进程的网络连接情况。
基本用法
-
查看指定端口的进程
lsof -i :80 # 查看80端口被哪个进程占用
输出包含进程ID、用户、文件描述符、类型(IPv4/IPv6)、协议等信息。
-
查看指定进程的所有连接
lsof -p 1234 # 查看PID为1234的进程打开的所有文件(包括网络连接) lsof -i -p 1234 # 只查看该进程的网络连接
-
查看所有TCP连接
lsof -iTCP -sTCP:LISTEN # 查看所有监听的TCP连接
通过/proc
文件系统查看连接
Linux内核将网络连接信息暴露在/proc
文件系统中,可直接读取文件获取原始数据,适合脚本处理或深度分析。
常用文件
-
TCP连接
cat /proc/net/tcp # IPv4 TCP连接 cat /proc/net/tcp6 # IPv6 TCP连接
文件格式为十六进制,例如本地地址
0A000001:0016
表示IPv地址0.0.1:22
(需转换),状态码01
表示ESTABLISHED
,0A
表示LISTEN
。 -
UDP连接
cat /proc/net/udp # IPv4 UDP连接 cat /proc/net/udp6 # IPv6 UDP连接
-
原始套接字
cat /proc/net/raw
实际应用场景
-
排查端口占用
当端口无法绑定(如启动服务提示“Address already in use”)时,使用ss -tulpn | grep :端口号
或lsof -i :端口号
找到占用进程,再通过kill -9 PID
终止进程。 -
分析异常连接
若服务器出现网络流量异常,可通过ss -s
查看连接状态统计,若TIME_WAIT
连接过多,可能需要调整内核参数(如net.ipv4.tcp_max_tw_buckets
);若ESTABLISHED
连接数突增,需检查是否有恶意连接或DDoS攻击。 -
监控服务连接
对关键服务(如Nginx、MySQL)使用ss -tp | grep '服务名'
监控其连接数,判断服务负载情况。
常用命令对比
命令 | 所属工具包 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
netstat | net-tools | 兼容性好,支持多种协议 | 性能较差,连接多时响应慢 | 旧系统或简单连接查看 |
ss | iproute2 | 性能高,信息详细,支持过滤 | 参数较复杂 | 新系统,大规模连接监控 |
lsof | lsof | 可关联进程与文件描述符 | 需安装,信息较冗余 | 进程级连接排查 |
/proc | 内核文件 | 原始数据,适合脚本处理 | 需手动解析十六进制格式 | 自动化运维或深度内核分析 |
相关问答FAQs
Q1:为什么netstat
命令在系统中提示“未找到命令”?
A:netstat
属于net-tools
工具包,而新版Linux(如Ubuntu 20.04+、CentOS 8+)默认不再安装该包,可通过以下方式解决:
- Ubuntu/Debian:
sudo apt install net-tools
- CentOS/RHEL:
sudo yum install net-tools
Q2:如何查看某个进程(如PID=1234)的所有网络连接及其状态?
A:可通过以下命令实现:
- 使用
ss
命令:ss -tp 'pid = 1234'
- 使用
lsof
命令:lsof -i -p 1234
输出会显示该进程的所有网络连接,包括本地地址、远程地址、协议和状态(如ESTABLISHED
、LISTEN
等)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/33342.html