在Linux系统中,查看端口状态是网络管理、服务调试和安全排查的核心操作,端口是应用程序与网络通信的入口,了解端口是否开放、监听状态及占用进程,能帮助快速定位服务异常、网络连接问题或潜在安全风险,本文将详细介绍Linux下查看端口的多种方法,涵盖命令行工具、系统文件及防火墙规则检查,适用于不同场景需求。
使用netstat
命令查看端口状态
netstat
是传统的网络状态查看工具,功能全面,兼容性好,适用于几乎所有Linux发行版,它可显示TCP、UDP、UNIX域套接字等连接状态,以及端口监听、进程占用等信息。
常用参数及说明
参数 | 含义 | 示例 |
---|---|---|
-t |
显示TCP端口 | netstat -t |
-u |
显示UDP端口 | netstat -u |
-l |
只显示监听端口 | netstat -l |
-n |
以数字形式显示地址和端口(不解析域名/服务名) | netstat -n |
-p |
显示进程ID(PID)和进程名(需root权限) | netstat -p |
-a |
显示所有连接(包括监听和未监听) | netstat -a |
-s |
显示协议统计信息(如TCP、UDP包数量) | netstat -s |
示例命令
- 查看所有监听的TCP和UDP端口(数字形式,显示进程):
sudo netstat -tulpn
输出包含
Proto
(协议)、Local Address
(本地地址:端口)、Foreign Address
(远程地址:端口)、State
(状态,如LISTEN
)、PID/Program name
(进程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 udp 0 0 0.0.0.0:68 0.0.0.0:* 9012/dhclient
- 查看TCP连接统计信息:
netstat -s | grep TCP
使用ss
命令查看端口状态(推荐)
ss
是netstat
的替代工具,基于Netlink内核接口,查询速度更快,尤其在处理大量连接时性能优势明显,现代Linux发行版(如Ubuntu 18.04+、CentOS 7+)默认已安装ss
。
常用参数及说明
参数 | 含义 | 示例 |
---|---|---|
-t |
显示TCP端口 | ss -t |
-u |
显示UDP端口 | ss -u |
-l |
只显示监听端口 | ss -l |
-n |
数字形式显示地址和端口 | ss -n |
-p |
显示进程信息(需root权限) | ss -p |
-a |
显示所有连接 | ss -a |
-s |
显示协议统计摘要 | ss -s |
-4 /-6 |
只显示IPv4/IPv6端口 | ss -4 |
示例命令
- 查看所有监听端口(含进程信息):
sudo ss -tulpn
输出格式与
netstat
类似,但字段更简洁,State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 511 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) LISTEN 0 511 :::80 :::* users:(("nginx",pid=5678,fd=4))
- 查看指定端口的监听状态:
ss -tlnp | grep :8080
使用lsof
命令查看端口占用进程
lsof
(list open files)可列出系统打开的文件、目录、网络连接等,通过-i
参数可直接筛选网络端口信息,适合快速定位端口对应的进程。
常用参数及说明
参数 | 含义 | 示例 |
---|---|---|
-i |
显示网络连接相关文件 | lsof -i |
-i :端口号 |
显示指定端口的占用情况 | lsof -i :80 |
-i [协议] |
显示指定协议的连接(如TCP、UDP) | lsof -i TCP |
-P |
不解析端口号为服务名(显示数字端口) | lsof -P |
-n |
不解析主机名(显示IP地址) | lsof -n |
示例命令
- 查看80端口被哪个进程占用:
sudo lsof -i :80
输出包含
COMMAND
(进程名)、PID
(进程ID)、USER
(用户)、FD
(文件描述符)、TYPE
(类型,如IPv4)、DEVICE
(设备)、SIZE/OFF
(大小)、NODE
(节点)、NAME
(端口信息,如*:http
或168.1.1:80
)。COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 5678 root 3u IPv4 12345 0t0 TCP *:http (LISTEN)
- 查看所有TCP连接及对应进程:
sudo lsof -i TCP
使用nmap
工具扫描端口
nmap
(Network Mapper)是强大的网络扫描工具,可检测本地或远程主机的端口开放状态、服务类型及版本,适合安全审计和网络探测。
安装nmap
- Ubuntu/Debian:
sudo apt install nmap
- CentOS/RHEL:
sudo yum install nmap
常用参数及说明
参数 | 含义 | 示例 |
---|---|---|
-sT |
TCP connect扫描(无需root,完整连接) | nmap -sT localhost |
-sU |
UDP扫描 | nmap -sU -p 53,161 localhost |
-p |
指定端口范围(如1-1000 或22,80,443 ) |
nmap -p 22,80,443 localhost |
-O |
启用系统检测 | nmap -O localhost |
-sV |
检测服务版本 | nmap -sV localhost |
-open |
只显示开放端口 | nmap --open localhost |
示例命令
- 扫描本地主机的开放TCP端口(1-1024):
nmap -sT -p 1-1024 localhost
输出显示端口状态(
open
、closed
、filtered
)及对应服务,PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https
查看/proc
文件系统中的端口信息
/proc
是Linux内核提供的虚拟文件系统,包含实时系统信息,通过读取/proc/net/tcp
和/proc/net/udp
,可直接查看内核中的TCP/UDP端口状态,适用于无netstat
/ss
工具的 minimalist 环境。
示例操作
-
查看TCP端口状态:
cat /proc/net/tcp
输出字段说明:
local_address
:本地地址和端口(十六进制,格式为IP:Port
,IP为十六进制,端口为后两位十六进制,需转换为十进制)。rem_address
:远程地址和端口(格式同上)。st
:状态(01
为ESTABLISHED
,0A
为LISTEN
等)。sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 0100007F:A001 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 12345
其中
0100007F
是127.0.0.1(十六转十),A001
是40961(0xA001=256×160+1),表示本地监听127.0.0.1:40961,状态为LISTEN
(0A
)。
-
查看UDP端口状态:
cat /proc/net/udp
检查防火墙规则中的端口
即使端口被进程监听,防火墙也可能阻止外部访问,需检查防火墙规则(如iptables
、firewalld
、ufw
),确认端口是否已开放。
iptables
(传统防火墙)
# 查看所有规则(-L列出,-n数字显示,-v详细信息) sudo iptables -L -n -v # 查看INPUT链规则(入站规则) sudo iptables -L INPUT -n -v # 查看开放端口(ACCEPT规则) sudo iptables -L INPUT -n | grep ACCEPT
firewalld
(CentOS/RHEL默认防火墙)
# 查看已开放端口 sudo firewall-cmd --list-ports # 查看所有规则(详细模式) sudo firewall-cmd --list-all
ufw
(Ubuntu默认防火墙)
# 查看防火墙状态 sudo ufw status # 查看详细规则 sudo ufw status verbose
相关问答FAQs
问题1:如何快速查看某个端口是否被占用,以及占用它的进程ID和名称?
解答:使用ss
或netstat
命令结合grep
筛选指定端口,或直接使用lsof
。
-
方法1(推荐):
sudo ss -tlnp | grep :端口号
例如查看8080端口:
sudo ss -tlnp | grep :8080
输出如:
LISTEN 0 511 *:8080 *:* users:(("java",pid=1234,fd=85))
,显示进程名为java
,PID为1234。 -
方法2(兼容性好):
sudo netstat -tlnp | grep :端口号
-
方法3(直接查进程):
sudo lsof -i :端口号
问题2:为什么端口显示为LISTEN状态,但外部设备无法访问?
解答:可能原因包括防火墙阻止、服务绑定地址错误、网络配置问题或SELinux限制。
- 防火墙规则:检查防火墙是否开放该端口,例如
iptables
中需确保INPUT链有ACCEPT
规则允许目标端口;firewalld
需执行sudo firewall-cmd --add-port=端口号/tcp --permanent
并重载(sudo firewall-cmd --reload
)。 - 绑定地址错误:服务可能只监听本地地址(如
0.0.1
),未绑定0.0.0
(所有接口),通过ss -tulpn | grep :端口号
查看Local Address
,若为0.0.1:端口号
,需修改服务配置(如Nginx的listen 0.0.0.0:端口号
)。 - SELinux限制(CentOS/RHEL):若SELinux开启,可能阻止服务监听端口,检查策略:
getsebool -a | grep httpd_can_network_connect
若为
off
,则启用:sudo setsebool -P httpd_can_network_connect on
- 网络配置:检查服务器是否正确绑定公网IP,或安全组(云服务器)是否开放端口。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/26359.html