在Linux系统中,端口是网络通信的重要标识,每个端口对应一个特定的服务或进程,查看端口状态(如是否监听、被占用、所属进程等)是系统管理和网络故障排查的常见需求,本文将详细介绍Linux下查看端口的多种方法,包括常用命令的参数、示例及适用场景,帮助用户灵活应对不同场景下的端口查询需求。
端口的基本概念
端口是TCP/IP协议中用于区分不同服务的逻辑 endpoint,取值范围为0-65535,0-1023为知名端口(如HTTP服务的80端口、SSH服务的22端口),1024-49151为注册端口,49152-65535为动态或私有端口,在Linux中,端口状态可分为“监听”(LISTEN,等待连接)、“已连接”(ESTABLISHED,通信中)、“关闭”(CLOSED,未使用)等,了解这些状态有助于判断服务是否正常运行及网络连接是否正常。
使用ss命令查看端口(推荐方法)
ss是Linux下新一代的网络连接工具,属于iproute2包,相比传统的netstat命令,ss在性能和功能上更优,尤其是在处理大量连接时速度更快,ss命令通过读取内核中的netlink套接字信息,实时获取网络连接状态。
常用参数及功能
-t
:显示TCP端口-u
:显示UDP端口-l
:仅显示监听(LISTEN)状态的端口-n
:以数字形式显示地址和端口,不解析域名和服务名(提高查询速度)-p
:显示占用端口的进程ID(PID)和进程名-a
:显示所有端口(包括监听和非监听)
示例操作
-
查看所有监听的TCP和UDP端口
ss -tuln
输出结果包含协议(State)、本地地址(Local Address:Port)、对端地址(Peer Address:Port)等信息,
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 4096 127.0.0.1:631 0.0.0.0:*
0.0.0:22
表示系统在所有网络接口上监听22端口(SSH服务)。 -
查看指定端口的占用情况
若需查看80端口是否被占用,可结合grep过滤:ss -tuln | grep ':80'
若输出包含
LISTEN
,表示80端口被监听;若无输出,则端口未被使用。 -
查看端口对应的进程信息
添加-p
参数可显示占用端口的进程详情:ss -tulpn | grep ':3306'
输出示例:
LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=11))
可知3306端口被MySQL进程(mysqld,PID=1234)占用。
使用netstat命令查看端口(传统方法)
netstat是早期的网络工具,属于net-tools包,虽然功能被ss替代,但在一些旧系统中仍常用,其参数与ss类似,但性能较差,适合少量连接查询。
常用参数及功能
-t
:TCP端口-u
:UDP端口-l
:监听端口-n
:数字形式显示-p
:显示进程ID和名称-a
:所有端口
示例操作
-
查看所有监听端口
netstat -tuln
-
查看指定端口及进程
netstat -tulpn | grep ':8080'
使用lsof命令查看端口占用
lsof(list open files)用于列出系统中被进程打开的文件,包括网络端口(端口本质也是一种文件),通过lsof可快速定位占用端口的进程,尤其适合已知端口查找进程的场景。
常用参数及功能
-i
:指定协议和端口,格式为[协议]:[端口]
(如-i :80
或-i tcp:22
)-P
:不显示端口号对应的服务名(避免DNS解析延迟)-n
:不解析主机名-t
:仅显示PID(简化输出)
示例操作
-
查看80端口被哪个进程占用
lsof -i :80
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 567 root 6u IPv4 1234 0t0 TCP *:http (LISTEN) nginx 568 www 7u IPv4 1235 0t0 TCP *:http (LISTEN)
可知nginx进程(PID=567和568)占用80端口。
-
仅显示占用端口的PID
lsof -ti :8080
输出直接为进程ID(如
789
),便于后续kill操作。
通过/proc文件系统查看端口(底层方法)
/proc是Linux内核提供的虚拟文件系统,包含系统运行时的实时数据,如网络连接状态、进程信息等,通过读取/proc/net/tcp和/proc/net/udp文件,可查看TCP和UDP端口的底层信息,适合高级调试。
示例操作
-
查看所有监听的TCP端口
cat /proc/net/tcp | awk '{print $10}' | sort -u
输出为十六进制格式的本地端口地址(如
0016
表示22端口),需通过printf '%dn' 0x0016
转换为十进制。 -
查看指定端口状态
以80端口为例,先转换为十六进制(80=0x50),再过滤:grep "50:" /proc/net/tcp
输出中的状态字段(如
0A
表示LISTEN)可对照内核协议状态码理解。
不同查看方法的对比
为方便用户选择,以下表格总结常用端口查看工具的特点:
命令 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
ss | 日常查看、高并发场景 | 速度快、功能全面、支持最新协议 | 部分旧系统可能未预装 |
netstat | 兼容旧系统、少量连接 | 参数直观、广泛支持 | 性能较差、逐渐被ss替代 |
lsof | 端口-进程关联查询 | 精确定位进程、支持文件类型过滤 | 仅显示已打开的端口,无状态信息 |
/proc | 底层调试、内核级分析 | 数据实时、无需额外工具 | 输出复杂、需手动解析十六进制 |
相关问答FAQs
Q1: 如何查看端口被哪个进程占用,并强制终止该进程?
A: 可通过ss -tulpn | grep ':端口号'
或lsof -i :端口号
查看占用进程的PID,然后使用kill -9 PID
强制终止(如kill -9 1234
),注意:强制终止可能导致服务异常,建议先尝试kill PID
(正常终止)。
Q2: 为什么ss命令比netstat更推荐?
A: ss命令通过netlink直接与内核通信,数据获取效率更高,尤其在处理大量连接(如高并发服务器)时速度远快于netstat;同时ss支持更多网络协议和状态统计(如TCP的快速打开状态),且是iproute2包的一部分,在新系统中默认预装,维护更积极,netstat作为旧工具,性能和功能已滞后,逐渐被ss替代。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32109.html