在Linux系统中,端口是网络通信的入口,每个端口对应一个服务或进程,当服务启动失败、网络连接异常或需要排查安全问题时,查看端口是否被占用是常见的操作,本文将详细介绍Linux系统中查看端口占用的多种方法,包括常用命令、参数解析及实际应用场景,帮助用户高效掌握端口状态排查技巧。
使用netstat命令查看端口占用
netstat是Linux系统中传统的网络工具,用于显示网络连接、路由表、接口状态等信息,虽然在新版系统中逐渐被ss替代,但仍有广泛的兼容性,尤其适用于较老的Linux发行版。
基本语法
netstat [选项] [参数]
常用选项及功能
选项 | 功能 |
---|---|
-t | 显示TCP端口 |
-u | 显示UDP端口 |
-l | 只显示监听端口(即正在被进程占用的端口) |
-n | 以数字形式显示地址和端口号,不解析域名和服务名(提高查询速度) |
-a | 显示所有端口,包括监听和非监听端口 |
-p | 显示占用端口的进程ID(PID)和进程名(需root权限) |
-i | 显示网络接口信息,可结合端口过滤 |
实际应用示例
-
查看所有监听的TCP和UDP端口
netstat -tuln
输出结果中,
Local Address
列显示本地IP和端口,State
列显示端口状态(监听端口为LISTEN
),tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 :::80 :::* LISTEN udp 0 0 0.0.0.0:68 0.0.0.0:*
其中
0.0.0:22
表示所有IP地址的22端口(SSH服务)被监听,::80
表示IPv6的80端口(HTTP服务)被监听。 -
查看指定端口是否被占用
例如检查80端口是否被占用:netstat -tuln | grep :80
若输出包含
LISTEN
,则表示80端口被占用;若无输出,则端口空闲。 -
查看端口对应的进程信息
加上-p
参数(需root权限)可查看占用端口的进程:sudo netstat -tulnp | grep :80
输出示例:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx: master process
其中
1234
是进程ID,nginx: master process
是进程名。 -
查看所有网络连接(包括非监听端口)
netstat -an
可通过
grep
过滤特定状态,如ESTABLISHED
(已连接)、TIME_WAIT
(等待关闭)等。
使用ss命令查看端口占用(推荐)
ss是iproute2工具包中的命令,用于替代netstat,其查询速度更快,尤其是在高并发场景下,因为它直接从内核获取网络连接信息,而非解析/proc文件。
基本语法
ss [选项] [参数]
常用选项及功能
选项 | 功能 |
---|---|
-t | 显示TCP端口 |
-u | 显示UDP端口 |
-l | 只显示监听端口 |
-n | 数字形式显示地址和端口 |
-a | 显示所有端口 |
-p | 显示进程ID和进程名(需root权限) |
-4 | 只显示IPv4端口 |
-6 | 只显示IPv6端口 |
实际应用示例
-
查看所有监听端口
ss -tuln
输出格式与netstat类似,但更简洁高效,
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 5 0.0.0.0:80 0.0.0.0:*
-
查看指定端口及对应进程
sudo ss -tulnp | grep :3306
输出示例(MySQL默认端口3306):
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=5678,fd=11))
其中
users:(("mysqld",pid=5678,fd=11))
明确指出进程名为mysqld,PID为5678。 -
过滤IPv4或IPv6端口
查看IPv4的监听端口:ss -4tuln
查看IPv6的监听端口:
ss -6tuln
-
查看端口统计信息
ss -s
输出显示TCP、UDP、监听端口的总数及连接状态分布,
Total: 1234 (kernel 2567) TCP: 567 (estab 123, closed 23, orphaned 0, synrecv 0, timewait 23/0), ports 123 UDP: 45 RAW: 0 IPSEC: 0
使用lsof命令查看端口占用
lsof(list open files)用于列出系统打开的文件,在Linux中,一切皆文件,网络端口也被视为文件,因此可通过lsof查询端口占用情况。
基本语法
lsof [选项] [参数]
常用选项及功能
选项 | 功能 |
---|---|
-i | 指定网络条件,如-i:80 表示80端口,-iTCP:80 表示TCP的80端口 |
-P | 不解析端口号为服务名(显示数字端口号) |
-n | 不解析主机名(显示IP地址) |
-p | 指定进程ID,查看该进程打开的端口 |
实际应用示例
-
查看指定端口是否被占用
lsof -i:80
若端口被占用,输出进程信息,
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN) nginx 1235 www-data 7u IPv4 12346 0t0 TCP *:http (LISTEN)
其中
COMMAND
是进程名,PID
是进程ID,NAME
列显示端口和状态(LISTEN表示监听)。 -
查看所有监听端口
lsof -i -P -n | grep LISTEN
-i
表示网络端口,-P -n
避免解析名称,提高速度,grep LISTEN
过滤监听状态。 -
查看进程占用的所有端口
例如查看PID为1234的进程占用的端口:lsof -p 1234 -i
使用nmap命令远程/本地扫描端口
nmap(Network Mapper)是网络扫描和主机检测工具,不仅可以远程扫描目标主机的端口状态,也可用于本地端口检查,尤其适合安全审计场景。
基本语法
nmap [选项] [扫描目标]
常用选项及功能
选项 | 功能 |
---|---|
-sT | TCP连接扫描(完整扫描,需目标主机响应) |
-sU | UDP扫描 |
-p | 指定端口范围,如-p 1-100 、-p 80,443,8080 |
-PN | 跳过主机发现,直接扫描端口(适用于防火墙阻拦场景) |
-sV | 探测端口服务的版本信息 |
-oG | 输出结果为Grepable格式,方便后续处理 |
实际应用示例
-
本地扫描所有TCP端口
nmap -sT -p 1-65535 localhost
输出显示每个端口的状态(
open
表示开放,closed
表示关闭,filtered
表示被防火墙过滤)。 -
扫描本地指定端口
nmap -p 80,443 localhost
输出示例:
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-01 10:00 CST Nmap scan report for localhost (127.0.0.1) Host is up (0.000012s latency). PORT STATE SERVICE 80/tcp open http 443/tcp open https
-
远程扫描目标主机的端口
nmap -sT -p 22 192.168.1.100
端口占用排查流程总结
当需要排查端口占用问题时,可按以下步骤操作:
- 确认端口类型:确定是TCP还是UDP端口(如HTTP为80/tcp,DNS为53/udp)。
- 选择合适命令:
- 快速查看监听端口:
ss -tuln
(推荐)或netstat -tuln
。 - 查看端口对应进程:
ss -tulnp
或lsof -i:端口号
。 - 远程扫描:
nmap -p 端口号 目标IP
。
- 快速查看监听端口:
- 分析结果:
- 若端口状态为
LISTEN
,表示被进程占用,记录PID和进程名。 - 若端口状态为
ESTABLISHED
,表示有连接建立,需结合业务判断是否正常。
- 若端口状态为
- 处理冲突:若端口被非预期进程占用,可通过
kill PID
终止进程,或修改服务配置使用其他端口。
相关问答FAQs
Q1:为什么在Linux中使用ss命令比netstat更高效?
A:ss命令的效率更高,主要原因在于它直接从内核的网络栈获取连接信息,通过读取/proc/net/tcp
、/proc/net/udp
等内核文件或使用netlink套接字,避免了netstat中需要遍历/proc目录下所有进程文件的开销,在高并发场景下(如数千个连接),ss的查询速度可能是netstat的数倍,且资源占用更低,ss的输出格式更简洁,默认显示更关键的信息(如状态、地址、进程ID),适合快速排查问题。
Q2:如何查看某个端口被哪个具体的程序占用,并强制终止该进程?
A:以80端口为例,分两步操作:
- 查看占用端口的进程:
使用ss
或lsof
命令,推荐sudo ss -tulnp | grep :80
,输出中会显示进程名和PID,LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
或
sudo lsof -i:80
,结果类似。 - 终止进程:
若确认该进程可终止,使用kill
命令发送信号:- 正常终止:
kill 1234
(发送SIGTERM信号,允许进程清理资源后退出)。 - 强制终止:
kill -9 1234
(发送SIGKILL信号,立即结束进程,可能导致数据丢失,非必要不使用)。
若进程名已知,也可使用killall
命令,如killall nginx
,通过进程名终止所有相关进程。
- 正常终止:
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32073.html