在Linux中使用Netstat和SS检查开放和监听端口
在Linux系统上监控开放和监听端口是维护服务器安全、诊断网络问题和有效管理基础设施的最基本做法之一。无论您运行的是生产Web服务器、VPS Hosting环境还是Dedicated Server,准确了解哪些端口是开放的——以及哪些服务绑定到它们——可以让您获得防止未授权访问、检测配置错误和消除不必要攻击面所需的可见性。
在这份全面的指南中,我们将介绍如何使用netstat和ss命令来检查任何Linux系统上的开放和监听端口、比较它们的优势,以及介绍lsof和nmap等其他工具进行更深入的网络分析。
为什么监控开放端口很重要
服务器上的每个开放端口都代表一个潜在的入口点。配置错误、过时或被遗忘的服务可能会使您的系统面临被利用的风险。定期审计您的监听端口可以让您:
- 识别未授权的服务在意外端口上运行
- 检测入侵尝试或被破坏的进程
- 验证防火墙规则是否按预期工作
- 确认新部署的应用程序绑定到正确的接口
- 关闭未使用的端口以减少您的攻击面
这对于管理共享网络托管环境或多租户服务器(其中多个服务同时运行)的管理员来说尤其重要。
理解端口及其类型
在深入了解这些工具之前,重要的是要理解您将在命令输出中遇到的术语。
| 术语 | 描述 |
|---|---|
| 开放端口 | 应用程序主动监听传入连接的端口 |
| 监听端口 | 绑定到等待网络流量的服务的端口 |
| TCP (传输控制协议) | 面向连接、可靠,由 HTTP、SSH、FTP 等使用 |
| UDP (用户数据报协议) | 无连接、速度更快但可靠性较低,由 DNS、NTP 等使用 |
使用 netstat 检查端口
什么是 netstat?
netstat(网络统计)是一个经典的命令行实用程序,提供有关网络连接、路由表、接口统计和监听端口的详细信息。虽然在现代发行版上已正式被 ss 取代,但它仍然被广泛使用,并且仍然存在于许多旧系统上。
安装 netstat
netstat 命令是 net-tools 包的一部分,在现代 Linux 发行版上可能默认未安装。
Debian / Ubuntu:
sudo apt install net-toolsCentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install net-tools使用 netstat 检查开放和监听端口
要显示系统上所有监听的 TCP 和 UDP 端口,请运行以下命令:
sudo netstat -tuln标志说明:
| 标志 | 说明 |
|---|---|
-t | 显示 TCP 端口 |
-u | 显示 UDP 端口 |
-l | 仅显示监听端口 |
-n | 显示数字地址而不是解析主机名 |
示例输出
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp6 0 0 :::443 :::* LISTEN
udp 0 0 0.0.0.0:53 0.0.0.0:*理解输出列
- 本地地址 — 服务监听的 IP 地址和端口号。
0.0.0.0表示服务在所有可用接口上监听。 - 外部地址 — 活动连接的远程 IP 和端口。星号 (
*) 表示尚未建立连接。 - 状态 — 连接状态。
LISTEN表示端口已打开并等待传入连接。
使用 netstat 过滤特定端口
您可以通过管道将输出传递给 grep 以隔离特定端口或服务。例如,要检查端口 80(HTTP)上是否有任何监听:
sudo netstat -tuln | grep ":80"要检查端口 443(HTTPS),这对于安装了 SSL 证书 的服务器至关重要:
sudo netstat -tuln | grep ":443"要同时显示负责每个连接的进程名称和 PID,请添加 -p 标志:
sudo netstat -tulnp使用 ss 检查端口
什么是 ss?
ss(socket statistics)是 netstat 的现代替代品。它速度更快、效率更高,并提供更丰富的输出——特别是在具有大量并发连接的系统上。ss 命令在几乎所有现代 Linux 发行版上都默认包含,无需额外安装。
使用 ss 检查开放和监听端口
ss 的语法与 netstat 非常相似,使过渡变得简单直接:
ss -tuln标志说明:
| 标志 | 描述 |
|---|---|
-t | 显示 TCP sockets |
-u | 显示 UDP sockets |
-l | 仅显示监听 sockets |
-n | 显示数字地址 |
示例输出
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 511 [::]:443 [::]:*
udp UNCONN 0 0 0.0.0.0:53 0.0.0.0:*ss 的高级用法
ss 命令提供了一系列高级过滤和显示选项,远超 netstat 的功能。
仅显示监听中的 TCP 端口
ss -tl仅显示监听中的 UDP 端口
ss -ul显示进程名称和 PID
要确定具体哪个进程在使用特定端口,请使用 -p 标志:
ss -tulnp这是最有用的故障排除命令之一——它在每个监听套接字旁边显示进程名称和 PID,使得立即清楚哪个应用程序拥有哪个端口。
带有 -p 标志的示例输出
Netid State Local Address:Port Process
tcp LISTEN 0.0.0.0:80 users:(("nginx",pid=1234,fd=6))
tcp LISTEN 0.0.0.0:22 users:(("sshd",pid=987,fd=3))
tcp LISTEN 0.0.0.0:3306 users:(("mysqld",pid=2345,fd=21))按特定端口过滤
要检查哪个进程在端口 8080 上监听:
ss -tulnp | grep ":8080"显示所有已建立的 TCP 连接
ss -tn state established显示摘要统计信息
ss -s这提供了按类型和状态的套接字总数的快速摘要——对于发现异常连接量很有用。
netstat vs. ss:直接比较
| 功能 | `netstat` | `ss` |
|---|---|---|
| 性能 | 在繁忙系统上较慢 | 显著更快 |
| 默认可用性 | 需要 net-tools 包 | 在现代发行版上预装 |
| 过滤选项 | 基础(需要 grep) | 高级内置过滤器 |
| 进程信息 | 可通过 -p 获得 | 可通过 -p 获得 |
| 输出详细程度 | 标准 | 更详细的套接字信息 |
| 推荐用于 | 旧系统、熟悉度 | 现代 Linux 环境 |
何时使用 netstat
- 在不可用
ss的旧 Linux 系统上 - 使用围绕
netstat语法编写的脚本或文档时 - 在已安装
net-tools的系统上进行快速检查
何时使用 ss
- 在任何现代 Linux 发行版上(Ubuntu 20.04+、CentOS 8+、Debian 10+ 等)
- 在高流量服务器上需要更快输出时
- 用于高级过滤和详细的套接字分析
端口审计的其他工具
除了 netstat 和 ss 之外,还有几个其他实用程序对全面的端口审计很有价值。
使用 lsof
lsof(列出打开的文件)将网络套接字视为文件,这是识别哪个进程正在使用给定端口的另一种强大方法。
要检查哪个进程绑定到端口 80:
sudo lsof -i :80要检查所有监听端口:
sudo lsof -i -P -n | grep LISTEN示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 23456 0t0 TCP *:80 (LISTEN)
sshd 987 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN)使用 nmap
nmap 是一个强大的网络扫描工具,可以在本地和远程主机上检测开放端口。它对于从外部角度验证防火墙配置特别有用。
如果尚未安装,请安装 nmap:
sudo apt install nmap # Debian/Ubuntu
sudo yum install nmap # CentOS/RHEL扫描本地机器上的所有 TCP 端口:
sudo nmap -sT localhost扫描特定 IP 地址上的开放端口:
sudo nmap -sV 192.168.1.100-sV 标志还会尝试检测在每个开放端口上运行的服务版本,这对于识别过时或易受攻击的软件非常有价值。
> 安全提示:仅对您拥有或明确获得许可扫描的系统运行 nmap 扫描。
实用安全工作流:审计您的服务器端口
以下是在Linux服务器上审计开放端口的推荐分步工作流:
- 列出所有监听端口及进程信息:
ss -tulnp- 将每个端口与预期服务进行交叉参考。如果您看到未知进程在意外端口上运行,请立即调查。
- 检查监听所有接口(
0.0.0.0)的服务,这些服务应仅在本地访问。例如,数据库服务器(端口3306)通常应绑定到127.0.0.1,而不是0.0.0.0。
- 使用
iptables -L -n或ufw status verbose验证您的防火墙规则,以确保仅在外部公开预期的端口。
- 从外部主机使用
nmap确认从互联网实际可以访问哪些端口,因为防火墙规则可能与ss在本地报告的内容不同。
- 关闭或限制任何不需要的端口,使用您的防火墙或停止相关服务。
快速参考:最有用的命令
# List all listening TCP and UDP ports (modern, recommended)
ss -tuln
# List listening ports with process names and PIDs
ss -tulnp
# List all listening ports using netstat (legacy)
sudo netstat -tulnp
# Check which process is using port 443
ss -tulnp | grep ":443"
# Check open ports with lsof
sudo lsof -i -P -n | grep LISTEN
# Scan local machine for open ports with nmap
sudo nmap -sT localhost结论
定期审计开放和监听端口是Linux服务器管理中不可或缺的一部分。netstat和ss等工具可以让您立即详细了解哪些服务正在运行、它们占用哪些端口,以及系统上是否存在任何意外内容。
对于现代Linux环境,ss是明确的选择——它更快、功能更强大,并且默认可用。但是,netstat对于遗留系统或已经熟悉其语法的管理员仍然是一个可靠的备选方案。使用lsof和nmap补充这些工具可以全面了解服务器的网络暴露情况。
无论您是在加固全新的VPS Hosting部署、管理一批Dedicated Servers,还是保护Email Hosting环境,掌握端口审计是一项基本技能,直接有助于基础设施的安全性和可靠性。
