在Linux系统中,网络端口管理是系统运维和开发中的核心任务之一,无论是排查服务是否正常监听、诊断端口冲突,还是进行安全审计,都需要掌握查看网络端口的方法,Linux提供了多种命令和工具来查看端口状态、关联进程及详细信息,下面将详细介绍这些工具的使用方法及适用场景。
使用netstat
命令查看端口
netstat
是传统的网络工具,虽然在新版Linux中逐渐被ss
替代,但在旧系统或兼容性场景中仍广泛使用,它通过读取/proc
文件系统和内核信息,展示网络连接、路由表、接口统计等数据。
基本语法
netstat [选项] [协议]
常用选项及示例
-
查看所有监听端口(TCP/UDP):
netstat -tuln
选项说明:
-t
显示TCP端口,-u
显示UDP端口,-l
仅显示监听状态端口,-n
以数字形式显示地址和端口(避免DNS解析,加快速度)。
输出示例:Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State 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:*
其中
Local Address
为本地IP和端口,State
为端口状态(LISTEN
表示监听中)。 -
查看所有端口(包括非监听)及进程ID:
netstat -tulnp
选项
-p
显示占用端口的进程ID(PID)和名称,便于定位问题进程。 -
查看指定端口的连接状态:
netstat -an | grep :80
通过
grep
过滤特定端口(如80端口),查看所有连接及其状态(如ESTABLISHED
表示已建立连接)。
使用ss
命令查看端口(推荐)
ss
是iproute2
包中的工具,旨在替代netstat
,性能更高(尤其是连接数多时),且支持更多TCP状态和统计信息,现代Linux发行版(如Ubuntu 18.04+、CentOS 7+)默认已安装。
基本语法
ss [选项] [协议]
常用选项及示例
-
查看所有监听端口:
ss -tuln
选项与
netstat
类似,-t
/-u
/-l
/-n
含义相同,输出示例:State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 511 0.0.0.0:22 0.0.0.0:* LISTEN 0 4096 :::80 :::*
字段说明:
State
为端口状态,Local Address:Port
为本地IP和端口。 -
查看监听端口及进程信息:
ss -tulpn
选项
-p
显示进程PID和名称,State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 511 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
可直接看到
sshd
进程占用22端口。 -
查看TCP连接状态统计:
ss -s
输出TCP/UDP连接总数、监听端口数等统计信息,快速了解网络负载。
使用lsof
命令查看端口关联进程
lsof
(list open files)用于列出系统打开的文件,在Linux中,网络端口被视为文件,因此可通过lsof
查看端口与进程的关联关系。
基本语法
lsof [选项] [名称]
常用选项及示例
-
查看指定端口的进程:
lsof -i :80
80
表示80端口,输出示例:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 567 root 6u IPv4 12345 0t0 TCP *:http (LISTEN) nginx 568 www-data 7u IPv4 12345 0t0 TCP *:http (LISTEN)
可看到nginx进程(PID 567/568)占用80端口,
LISTEN
表示监听状态。 -
查看所有监听端口及进程:
lsof -i -P -n | grep LISTEN
选项
-P
显示端口号而非服务名,-n
避免DNS解析,grep LISTEN
过滤监听状态。
通过/proc
文件系统查看端口
/proc
是Linux内核提供的虚拟文件系统,包含系统运行时的实时信息,可直接读取网络端口数据。
查看TCP/UDP端口
-
TCP端口:
cat /proc/net/tcp cat /proc/net/tcp6 # IPv6
输出为十六进制格式,需转换IP和端口(如
0A000001
为0.0.1
,0016
为22端口)。 -
UDP端口:
cat /proc/net/udp cat /proc/net/udp6 # IPv6
关联进程
通过inode
号查找进程:
- 从
/proc/net/tcp
中获取端口的inode
号(第10列); - 在
/proc/*/fd/
中搜索该inode
:find /proc -name fd -exec ls -l {} ; 2>/dev/null | grep inode号
输出中的
/proc/PID/fd/文件描述符
即为占用该端口的进程文件。
工具对比与选择
工具名称 | 所属软件包 | 推荐场景 | 核心优势 | 常用参数组合 |
---|---|---|---|---|
netstat |
net-tools | 旧系统兼容 | 命令简单,广泛支持 | -tuln (监听端口)、-tulnp (进程信息) |
ss |
iproute2 | 新系统首选 | 性能高,支持更多TCP状态 | -tulpn (监听+进程)、-s (统计) |
lsof |
lsof | 精准定位进程 | 直接关联端口与进程,支持文件类型过滤 | -i :端口 (指定端口)、-iTCP -sTCP:LISTEN (TCP监听) |
/proc |
内置 | 底层调试 | 无需安装,数据实时 | /proc/net/tcp (TCP端口)、find (关联进程) |
相关问答FAQs
问题1:为什么推荐使用ss
而不是netstat
查看端口?
解答:ss
是netstat
的升级版,通过Netlink接口直接从内核获取网络信息,避免了netstat
对/proc
和/dev
文件的遍历,因此在连接数较多时(如高并发服务器)性能优势显著。ss
支持更多TCP状态(如NETLINK
、PACKET
等),输出信息更详细,且现代Linux发行版默认集成,是当前查看网络端口的首选工具。
问题2:如何查看指定进程占用的所有端口?
解答:可通过lsof
或ss
结合进程ID(PID)实现。
- 使用
lsof
:lsof -p <PID> -i
例如查看PID 1234的进程占用的端口:
lsof -p 1234 -i
,输出会列出该进程所有网络连接及端口。 - 使用
ss
:ss -tulpn | grep <PID>
例如
ss -tulpn | grep 1234
,可显示PID 1234占用的端口及监听状态。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/14139.html