在Linux系统中,端口是网络通信的入口,服务是否正常运行、网络连接是否正常,都与端口状态密切相关,查看本地端口是否打开,通常需要确认两个层面:一是服务是否正在监听该端口(进程监听),二是防火墙是否允许该端口的流量通过(策略放行),本文将详细介绍多种查看端口状态的方法,涵盖命令行工具、防火墙检查及端口连通性测试。
使用netstat命令(传统工具)
netstat
是Linux系统中经典的网络状态查看工具,尽管在较新系统中逐渐被ss
替代,但仍因其广泛的兼容性被使用,通过netstat
可以查看端口监听状态、连接状态及关联进程信息。
基本语法
netstat [选项]
常用参数及作用
参数 | 作用 |
---|---|
-t |
显示TCP端口 |
-u |
显示UDP端口 |
-l |
仅显示监听状态的端口 |
-p |
显示占用端口的进程ID(PID)和程序名 |
-n |
以数字形式显示地址和端口,避免DNS解析,加快查询速度 |
示例
查看所有监听的TCP和UDP端口,并显示关联进程:
netstat -tulnp
输出结果解析:
Proto
:协议类型(TCP/UDP)Local Address
:本地IP地址和端口(0.0.0
表示监听所有IP,0.0.1
表示仅本地监听)State
:端口状态(LISTEN
表示监听中)PID/Program name
:占用端口的进程ID和程序名(如nginx: worker process
)
若需查看特定端口(如80端口)是否监听:
netstat -tulnp | grep :80
使用ss命令(推荐,更高效)
ss
是iproute2
工具包的一部分,作为netstat
的替代品,ss
在查询大量连接时性能更优,输出信息也更简洁。
基本语法
ss [选项]
常用参数及作用
参数 | 作用 |
---|---|
-t |
显示TCP端口 |
-u |
显示UDP端口 |
-l |
仅显示监听端口 |
-n |
数字形式显示,避免DNS解析 |
-p |
显示进程ID和程序名 |
-a |
显示所有端口(包括监听和非监听) |
示例
查看所有监听的TCP/UDP端口及进程:
ss -tulnp
输出结果与netstat
类似,但列更清晰,
State
:端口状态(LISTEN
、ESTABLISHED
等)Recv-Q
/Send-Q
:接收队列和发送队列长度Local Address:Port
:本地IP和端口Process
:进程名和PID
过滤特定端口(如22端口):
ss -tulnp | grep :22
使用lsof命令(通过文件描述符查看)
lsof
(list open files)用于列出系统打开的文件,包括网络连接、设备文件等,通过lsof
可以查看指定端口被哪个进程占用。
基本语法
lsof -i :端口号
示例
查看8080端口占用情况:
lsof -i :8080
输出结果:
COMMAND
:进程名(如java
)PID
:进程IDUSER
:进程所有者FD
:文件描述符(IPv6
、IPv4
表示协议类型)TYPE
:网络类型(IPv4
、IPv6
)DEVICE
:设备标识SIZE/OFF
:文件大小NODE
:节点标识NAME
:端口和协议(如*:8080 (LISTEN)
)
若端口未被占用,则输出为空。
使用telnet或nc测试端口连通性
netstat
和ss
主要用于查看端口监听状态,而telnet
或nc
(netcat)可用于测试本地或远程端口是否可达(即服务是否响应)。
使用telnet
telnet 本地IP 端口号
示例:测试本地80端口是否可访问
telnet localhost 80
- 若端口开放,显示
Connected to localhost.
,并进入交互界面; - 若端口关闭,显示
Connection refused
。
使用nc
nc
比telnet
更灵活,支持多种模式,安装方式:
- CentOS:
yum install nc
- Ubuntu:
apt install netcat
基本语法:
nc -zv 本地IP 端口号
参数说明:
-z
:扫描模式,不传输数据,仅连接测试-v
:显示详细输出
示例:测试3306端口
nc -zv localhost 3306
成功输出:Connection to localhost 3306 port [tcp/mysql] succeeded!
失败输出:Connection refused
检查防火墙状态(端口是否被阻止)
即使服务正在监听端口,若防火墙未开放该端口,外部仍无法访问,需根据系统使用的防火墙工具进行检查。
firewalld(CentOS 7+/RHEL 7+)
查看已开放的端口:
firewall-cmd --list-ports
查询特定端口是否开放(如8080/tcp):
firewall-cmd --query-port=8080/tcp
返回yes
表示开放,no
表示未开放。
ufw(Ubuntu/Debian)
查看防火墙状态及规则:
ufw status
输出示例:
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
8080/tcp ALLOW Anywhere
iptables(传统防火墙)
查看所有规则(-L
列出规则,-n
数字形式,-v
显示详细信息):
iptables -L -n -v
关注ACCEPT
规则的端口,例如ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
表示允许80端口访问。
常用端口查看命令对比
命令 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
netstat | 传统系统,兼容性需求高 | 参数直观,输出易理解 | 性能较差,新系统逐渐弃用 |
ss | 新系统(CentOS 7+/Ubuntu 16.04+) | 高效,输出简洁,支持更多过滤 | 参数较netstat复杂 |
lsof | 查看端口占用进程 | 精准定位进程,支持文件描述符 | 仅显示监听端口,不区分连接状态 |
telnet/nc | 测试端口连通性 | 直观反映端口是否可达 | 需额外安装,仅测试连通性 |
注意事项
- 端口状态区分:
LISTEN
表示服务正在监听,等待连接;ESTABLISHED
表示已有连接建立;CLOSED
表示端口未开启。 - 防火墙优先级:即使服务监听端口,若防火墙阻止,仍无法访问,需结合防火墙工具检查。
- 系统差异:不同Linux发行版默认工具不同(如CentOS用firewalld,Ubuntu用ufw),需根据系统选择命令。
相关问答FAQs
Q1:为什么端口显示“LISTEN”,但外部设备仍无法连接?
A:可能原因有两个:一是防火墙未开放该端口(如firewalld、ufw或iptables阻止了流量),二是服务监听的IP地址非0.0.0
(如仅监听0.0.1
,则仅本地可访问),可先通过telnet 本地IP 端口
测试本地连通性,再检查防火墙规则,确保服务监听地址为0.0.0
或正确绑定公网IP。
Q2:如何查看所有已开放的端口及对应服务列表?
A:结合ss
和grep
可快速整理,查看所有监听端口及对应服务(过滤掉PID和内核线程):
ss -tulnp | grep -v "kernel" | awk '{print $5, $7}' | sort | uniq
输出格式为“IP:端口 进程名”,便于快速定位服务,若需更详细的服务信息(如端口号对应的服务名称),可结合/etc/services
文件(如grep ":80" /etc/services
查看80端口对应的标准服务名)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/29456.html