什么是“端口打开”?
在讨论命令之前,我们先明确一下“端口打开”通常指两种状态:

- 进程正在监听:某个应用程序正在等待网络连接进入指定的端口,这是最常见的情况。
- 防火墙允许流量:服务器的防火墙(如
iptables,firewalld,ufw)已经配置,允许数据包进出该端口。
一个端口可能被进程监听,但如果防火墙阻止了流量,外部设备仍然无法访问,排查问题时,需要检查这两个方面。
使用 ss 命令 (推荐)
ss 是 netstat 的现代替代品,速度更快,信息更全,是当前 Linux 系统上的首选工具。
查看所有监听的端口
使用 ss -tulnp 可以列出所有 TCP (-t) 和 UDP (-u) 协议、处于监听 (-l) 状态的端口,并显示占用该端口的进程 ID 和名称 (-n 以数字形式显示地址和端口,避免DNS解析延迟)。
# -t: TCP端口, -u: UDP端口, -l: 只显示监听端口, -n: 以数字显示, -p: 显示PID和程序名 sudo ss -tulnp
输出示例:

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=951,fd=3))
LISTEN 0 4096 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=30))
LISTEN 0 100 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=5678,fd=6))
LISTEN 0 511 [::]:22 [::]:* users:(("sshd",pid=951,fd=4))
如何解读:
Local Address:Port:本地监听的IP地址和端口号。0.0.0:22表示监听所有IPv4地址的22端口(通常是SSH)。0.0.1:3306表示只在本机(localhost)上监听3306端口(通常是MySQL)。[::]:22表示监听所有IPv6地址的22端口。
PID/Program name:占用该端口的进程ID和程序名。sshd在监听22端口。
查看特定端口
如果你想快速查看某个特定端口(例如80端口)是否在监听:
# 查看TCP 80端口 sudo ss -tulpn | grep ':80' # 查看UDP 53端口 sudo ss -ulnp | grep ':53'
使用 netstat 命令 (传统方法)
netstat 是一个经典工具,在很多旧系统或特定环境中仍在使用。ss 是它的升级版,功能更强大。
查看所有监听的端口
# -l: 只显示监听端口, -n: 以数字显示, -t: TCP, -u: UDP, -p: 显示PID和程序名 sudo netstat -tulnp
这个命令的输出和 ss 非常相似。

查看特定端口
# 查看TCP 80端口 sudo netstat -tulnp | grep ':80'
注意:在最新的 Linux 发行版中,netstat 可能只是一个指向 ss 或 ss 兼容性包装的软链接,但其核心功能已被 ss 取代。
使用 lsof 命令
lsof (list open files) 是一个功能极其强大的工具,它可以列出系统打开的所有文件,当然也包括网络套接字(端口)。
查看特定端口
这是 lsof 最常用的方式。-i 参数用于筛选网络相关的文件。
# 查看80端口 sudo lsof -i :80 # 查看所有监听的端口 sudo lsof -i -P -n | grep LISTEN
参数解释:
-i :80:显示所有与80端口相关的网络连接。-i:显示所有网络连接。-P:不将端口号转换为服务名(如80->http),直接显示数字。-n:不将IP地址解析为主机名。grep LISTEN:只显示处于监听状态的连接。
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
nginx 1234 root 7u IPv6 12346 0t0 TCP *:http (LISTEN)
mysqld 5678 mysql 31u IPv4 12347 0t0 TCP localhost:mysql (LISTEN)
检查防火墙状态 (非常重要!)
即使端口被进程监听,如果防火墙阻止了流量,外部仍然无法访问,你需要检查并配置防火墙规则。
使用 firewalld (CentOS, RHEL, Fedora, openSUSE)
# 查看所有开放的端口和服务 sudo firewall-cmd --list-ports sudo firewall-cmd --list-services # 检查特定端口是否已开放 sudo firewall-cmd --query-port=80/tcp # 输出为 yes/no # 永久开放80端口 sudo firewall-cmd --permanent --add-port=80/tcp # 重新加载防火墙使配置生效 sudo firewall-cmd --reload
使用 ufw (Uncomplicated Firewall, Ubuntu, Debian)
# 查看所有规则状态 sudo ufw status # 查看详细规则(包含编号) sudo ufw status verbose # 检查80端口是否已开放 sudo ufw allow 80/tcp # 如果规则已存在,会提示 "Rule already active"
使用 iptables (通用,几乎所有Linux发行版)
iptables 是底层的防火墙工具,firewalld 和 ufw 通常是在它之上的封装。
# 查看所有链的规则 sudo iptables -L -n -v # 只查看INPUT链(入站规则)并显示端口 sudo iptables -L INPUT -n --line-numbers | grep :80 # -L: 列出规则 # -n: 以数字显示IP和端口 # -v: 显示详细信息,如数据包计数 # --line-numbers: 显示规则编号,方便删除
综合排查步骤
当你发现一个端口“打不开”时,可以按照以下步骤进行系统性排查:
-
检查服务是否启动:
# 例如检查nginx服务 sudo systemctl status nginx # 如果没启动,则启动它 sudo systemctl start nginx
-
检查端口是否被进程监听:
# 使用 ss 或 lsof 检查 sudo ss -tulpn | grep ':80' # 或者 sudo lsof -i :80
- 如果没找到:说明服务根本没有启动或配置错误,请回到第1步。
- 如果找到了:说明服务本身没问题,继续下一步。
-
检查防火墙是否放行:
- 如果是云服务器 (AWS, 阿里云, 腾讯云等):检查安全组规则,确认入站规则中是否开放了目标端口,这是最容易被忽略的一步!
- 如果是本地物理机/虚拟机:
# 检查 firewalld sudo firewall-cmd --query-port=80/tcp # 检查 ufw sudo ufw status | grep 80 # 检查 iptables sudo iptables -L INPUT -n | grep :80
- 如果防火墙阻止了:添加相应的放行规则并重新加载防火墙。
-
检查监听地址:
- 使用
ss -tulpn查看监听的IP地址,如果显示的是0.0.1:80或localhost:80,那么这个服务只对本机开放,外部IP无法访问,你需要修改服务的配置文件,将监听地址改为0.0.0或 以监听所有IP。
- 使用
总结表格
| 命令 | 主要用途 | 优点 | 缺点 |
|---|---|---|---|
ss -tulnp |
查看所有监听端口 | 速度快,信息全,现代首选 | 相对较新,旧系统可能没有 |
netstat -tulnp |
查看所有监听端口 | 经典,兼容性好 | 速度较慢,逐渐被 ss 取代 |
lsof -i :port |
查看特定端口占用 | 功能强大,信息详细 | 参数稍多,不如 ss 直观 |
firewall-cmd |
管理 firewalld 防火墙 |
简单易用,适合RHEL系 | 仅限 firewalld 环境 |
ufw |
管理 ufw 防火墙 |
非常简单,适合Ubuntu/Debian | 仅限 ufw 环境 |
iptables |
管理底层防火墙 | 功能最强大,通用性强 | 语法复杂,不易上手 |
对于日常使用,ss 和 lsof 是检查端口状态的最佳选择。永远不要忘记检查防火墙和云服务器的安全组规则!
