学会在 Linux 上查看开放端口,是每个服务器管理员、网络排障工程师或安全加固人员都必须掌握的基础技能。开放端口就像系统的一扇扇门 - 如果你不清楚哪些门是开着的,就无从谈起安全防护。无论你是在 Ubuntu 上跑 Web 服务器、管理 VPS,还是排查连接故障,列出当前开放的端口都能让你直观了解系统对外暴露了哪些服务。本文介绍四种实用方法,讲解如何过滤结果,并演示如何关闭不需要的端口。
核心要点:
ss命令是目前在 Linux 上列出开放端口最快、最现代的方式。nmap可以从外部视角扫描端口,还原攻击者实际看到的情况。- 使用
lsof可以快速定位某个端口被哪个进程占用。 - 通过
ufw或iptables关闭不必要的端口,是缩小攻击面最直接的方法。
目录
为什么要检查 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 精准定位某个端口归属于哪个进程;而 ufw 或 iptables 则让你能关闭任何不该对外暴露的端口。养成定期执行这些检查的习惯 - 尤其是在安装新软件或变更网络配置之后 - 是保障 Linux 服务器安全最简单有效的方法之一。现在就运行 sudo ss -tulnp,看看你的服务器究竟对外暴露了什么。
立即检测你的 Linux 服务器上任意端口是否开放
不确定某个端口从外部是否真的可达?我们的免费端口检测工具可在几秒内从外部视角扫描你的服务器,无需安装,无需配置。
立即使用免费端口检测工具 →
常见问题解答
在终端中运行 sudo ss -tulnp。这条命令使用现代的 ss 工具,列出所有处于监听状态的 TCP 和 UDP 端口及其对应的进程名。它比 netstat 更快,并在包括 Ubuntu 和 Debian 在内的大多数主流 Linux 发行版上默认可用。
两者都能显示开放端口和套接字信息,但 ss 是 netstat 的现代替代品。它直接从内核读取数据,在繁忙系统上速度更快、结果更准确。netstat 依赖独立的 net-tools 软件包,许多发行版已不再默认安装。
从同一网络的另一台机器上运行 nmap -p PORT TARGET_IP。如果不想安装任何工具,也可以使用在线端口检测工具进行快速外部检查。这种方式能测试端口从外部是否真正可达,并将防火墙规则的影响也纳入考量,而 ss 等本地工具无法反映这一点。
使用 sudo lsof -i :PORT 或 sudo ss -tulnp | grep :PORT。两条命令都会显示占用该端口的进程名和 PID。lsof 的输出格式更为清晰,会以易读的格式列出命令名、PID 和所属用户。
不会。用 ufw 或 iptables 封锁端口只是阻止外部连接到达该服务,服务本身仍在继续运行。要彻底停止服务,请使用 sudo systemctl stop servicename。若要永久禁用,还需运行 sudo systemctl disable servicename,防止其在系统重启后自动启动。