如何在 Linux 上查看开放端口:完整指南 2026

Linux 终端显示使用 ss 和 netstat 命令查看开放端口

学会在 Linux 上查看开放端口,是每个服务器管理员、网络排障工程师或安全加固人员都必须掌握的基础技能。开放端口就像系统的一扇扇门 - 如果你不清楚哪些门是开着的,就无从谈起安全防护。无论你是在 Ubuntu 上跑 Web 服务器、管理 VPS,还是排查连接故障,列出当前开放的端口都能让你直观了解系统对外暴露了哪些服务。本文介绍四种实用方法,讲解如何过滤结果,并演示如何关闭不需要的端口。

核心要点:

  • ss 命令是目前在 Linux 上列出开放端口最快、最现代的方式。
  • nmap 可以从外部视角扫描端口,还原攻击者实际看到的情况。
  • 使用 lsof 可以快速定位某个端口被哪个进程占用。
  • 通过 ufwiptables 关闭不必要的端口,是缩小攻击面最直接的方法。

为什么要检查 Linux 开放端口

Linux 机器上运行的每个服务都会监听一个或多个端口。SSH 监听 22 端口,HTTP 监听 80 端口,HTTPS 监听 443 端口。但经过数月的软件安装与卸载,服务器上往往会残留一些没人刻意配置过的开放端口。一个被遗忘的数据库 daemon 在 5432 端口上静默监听,却没有任何防火墙规则保护 - 这种情况在现实中确实引发过数据泄露事故。

在 Linux 上检查开放端口可以帮助你:

  • 审计哪些服务实际在运行并对外暴露。
  • 排查应用无法连接到其他服务的原因。
  • 验证防火墙规则是否按预期生效。
  • 为安全审计或渗透测试做准备。

下面介绍的方法既涵盖本地检测(机器自身报告的状态),也包括外部扫描(远程主机实际能看到的情况)。两种视角都很重要。

方法一:ss 命令(现代推荐)

ss 命令(socket statistics,套接字统计)已在大多数现代 Linux 发行版上取代了 netstat。它速度更快、信息更详细,且内置于 iproute2 软件包中,Ubuntu、Debian、CentOS 和 Fedora 默认均已安装。

要列出所有开放端口及其对应的进程名,执行:

sudo ss -tulnp

参数说明:

  • -t - 显示 TCP 套接字
  • -u - 显示 UDP 套接字
  • -l - 仅显示处于监听状态的套接字
  • -n - 以数字形式显示端口号,而非服务名称
  • -p - 显示每个套接字对应的进程

实际示例:在一台全新安装了 Nginx 和 PostgreSQL 的 Ubuntu 服务器上,输出大致如下:

Netid  State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
tcp    LISTEN  0       128     0.0.0.0:80           0.0.0.0:*          users:(("nginx",pid=1234,fd=6))
tcp    LISTEN  0       128     127.0.0.1:5432       0.0.0.0:*          users:(("postgres",pid=5678,fd=5))
tcp    LISTEN  0       128     0.0.0.0:22           0.0.0.0:*          users:(("sshd",pid=910,fd=3))

注意 PostgreSQL 只绑定在 127.0.0.1,意味着外部无法访问。而 SSH 和 Nginx 绑定在 0.0.0.0,表示接受任意 IP 的连接。这一条输出就能告诉你很多关于系统对外暴露情况的信息。

关于 ss 所有选项的详细说明,请参阅 ss 命令官方 man 手册页

方法二:netstat 命令(老牌工具,仍广泛使用)

netstat 命令属于较旧的 net-tools 软件包。许多发行版已不再默认安装它,但它仍被广泛使用,值得了解 - 尤其是在维护老旧系统时。

如需安装:

sudo apt install net-tools   # Debian/Ubuntu
sudo yum install net-tools   # CentOS/RHEL

使用 netstat 列出 Linux 开放端口:

sudo netstat -tulnp

各参数含义与 ss 完全相同。输出格式略有不同,但核心信息一致:协议、本地地址、端口以及占用该端口的进程。

一个实际局限:在连接数极多的繁忙服务器上,netstat 的速度明显慢于 ss。对于日常使用的普通服务器而言,这点差异基本可以忽略。

方法三:nmap 端口扫描(外部视角)

上述工具展示的是机器内部自我报告的状态,而 nmap 的思路完全不同 - 它通过网络扫描端口,模拟外部攻击者或远程客户端实际看到的情况。这一点至关重要,因为防火墙可能已经封锁了某个端口,但 ss 仍会显示该端口处于监听状态。

安装 nmap:

sudo apt install nmap   # Debian/Ubuntu
sudo yum install nmap   # CentOS/RHEL

从同一网络的另一台机器扫描目标服务器:

nmap -sT -p 1-1024 192.168.1.10

扫描最常见的 1000 个端口并检测服务版本:

nmap -sV 192.168.1.10

-sV 参数会尝试识别每个开放端口上运行的软件版本,有助于发现需要打补丁的过时服务。

重要提示:请只对你拥有所有权或已获得明确授权的服务器运行 nmap 扫描。未经授权扫描第三方系统,在许多国家和地区可能构成违法行为。

如果你需要从外部检查某个端口是否可达,但又不想安装 nmap,我们的免费端口检测工具可以立即完成这项检查,无需任何安装或配置。

方法四:lsof 命令(进程与端口映射)

lsof(list open files,列出打开的文件)命令将网络套接字视为文件处理,这与 Linux "一切皆文件"的设计哲学一脉相承。当你需要回答"哪个进程占用了 8080 端口"这类问题时,它尤为好用。

列出所有网络连接:

sudo lsof -i

查找占用指定端口的进程(例如 3000 端口):

sudo lsof -i :3000

当开发者的 Node.js 应用占用了某个端口,需要在重启服务前找到并终止该进程时,这个命令非常实用。

如何按端口、TCP 或 UDP 过滤结果

以上工具的原始输出信息量较大,以下是最常用的过滤方式:

仅显示 TCP 监听端口(ss):

sudo ss -tlnp

仅显示 UDP 端口(ss):

sudo ss -ulnp

检查某个特定端口是否开放(ss 配合 grep):

sudo ss -tulnp | grep :443

用 nmap 按端口过滤:

nmap -p 80,443,8080 192.168.1.10

以上方式可以覆盖绝大多数日常过滤需求。关于 80 端口的 HTTP 专项排障,请参阅我们的 80 端口 HTTP 排障指南

如果你使用的是 Windows 系统并需要类似的操作指引,请查看我们的 Windows 开放端口检测完整指南 2026

如何用 ufw 或 iptables 关闭或封锁端口

发现不需要的开放端口只是第一步,接下来要把它关掉。以下是使用两种最常见的 Linux 防火墙工具的操作方法。

使用 ufw(简易防火墙)- 推荐用于 Ubuntu

封锁 8080 端口的入站流量:

sudo ufw deny 8080/tcp

仅允许 SSH 和 HTTPS,拒绝其他所有流量:

sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 443/tcp
sudo ufw enable

查看当前防火墙状态:

sudo ufw status verbose

使用 iptables - 适合精细化控制

丢弃所有访问 3306 端口(MySQL)的入站流量:

sudo iptables -A INPUT -p tcp --dport 3306 -j DROP

保存规则以在重启后持久生效:

sudo iptables-save | sudo tee /etc/iptables/rules.v4

关于 iptables 语法和规则顺序的深入参考,Netfilter 官方文档是最权威的资料来源。

提示:用 ufw 或 iptables 封锁端口并不会停止该端口上运行的服务,只是阻止外部连接到达它。如果要彻底停止服务,请使用 sudo systemctl stop servicename,并执行 sudo systemctl disable servicename 以防止其在重启后自动启动。

总结

在 Linux 上检查开放端口并不需要复杂的工具或深厚的专业知识。ss 命令提供快速可靠的本地视图;nmap 展示外部世界实际能访问到的内容;lsof 精准定位某个端口归属于哪个进程;而 ufwiptables 则让你能关闭任何不该对外暴露的端口。养成定期执行这些检查的习惯 - 尤其是在安装新软件或变更网络配置之后 - 是保障 Linux 服务器安全最简单有效的方法之一。现在就运行 sudo ss -tulnp,看看你的服务器究竟对外暴露了什么。

免费端口检测工具 - 立即检查 Linux 服务器上的端口是否开放

立即检测你的 Linux 服务器上任意端口是否开放

不确定某个端口从外部是否真的可达?我们的免费端口检测工具可在几秒内从外部视角扫描你的服务器,无需安装,无需配置。

立即使用免费端口检测工具 →

常见问题解答

在终端中运行 sudo ss -tulnp。这条命令使用现代的 ss 工具,列出所有处于监听状态的 TCP 和 UDP 端口及其对应的进程名。它比 netstat 更快,并在包括 Ubuntu 和 Debian 在内的大多数主流 Linux 发行版上默认可用。

两者都能显示开放端口和套接字信息,但 ssnetstat 的现代替代品。它直接从内核读取数据,在繁忙系统上速度更快、结果更准确。netstat 依赖独立的 net-tools 软件包,许多发行版已不再默认安装。

从同一网络的另一台机器上运行 nmap -p PORT TARGET_IP。如果不想安装任何工具,也可以使用在线端口检测工具进行快速外部检查。这种方式能测试端口从外部是否真正可达,并将防火墙规则的影响也纳入考量,而 ss 等本地工具无法反映这一点。

使用 sudo lsof -i :PORTsudo ss -tulnp | grep :PORT。两条命令都会显示占用该端口的进程名和 PID。lsof 的输出格式更为清晰,会以易读的格式列出命令名、PID 和所属用户。

不会。用 ufwiptables 封锁端口只是阻止外部连接到达该服务,服务本身仍在继续运行。要彻底停止服务,请使用 sudo systemctl stop servicename。若要永久禁用,还需运行 sudo systemctl disable servicename,防止其在系统重启后自动启动。