在Linux中使用Netstat和SS检查开放和监听端口
在Linux系统上监控开放和监听端口是维护服务器安全、诊断网络问题和有效管理基础设施的最基本做法之一。无论您运行的是生产Web服务器、VPS Hosting环境还是Dedicated Server,准确了解哪些端口是开放的——以及哪些服务绑定到它们——可以让您获得防止未授权访问、检测配置错误和消除不必要攻击面所需的可见性。
在本综合指南中,我们将介绍如何使用netstat和ss命令来检查任何Linux系统上的开放和监听端口,比较它们的优势,并介绍lsof和nmap等其他工具进行更深入的网络分析。
为什么监控开放端口很重要
服务器上的每个开放端口都代表一个潜在的入口点。配置错误、过时或被遗忘的服务可能会使您的系统面临被利用的风险。定期审计您的监听端口可以让您:
- 识别在意外端口上运行的未授权服务
- 检测入侵尝试或受损进程
- 验证防火墙规则是否按预期工作
- 确认新部署的应用程序绑定到正确的接口
- 关闭未使用的端口以减少攻击面
这对于管理Shared Web Hosting环境或多租户服务器(其中同时运行多个服务)的管理员尤为关键。
理解端口及其类型
在深入了解这些工具之前,重要的是要理解您在命令输出中会遇到的术语。
| 术语 | 描述 |
|---|---|
| 开放端口 | 应用程序主动监听传入连接的端口 |
| 监听端口 | 绑定到等待网络流量的服务的端口 |
| 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 Certificates的服务器至关重要:
sudo netstat -tuln | grep ":443"要同时显示负责每个连接的进程名称和PID,请添加-p标志:
sudo netstat -tulnp使用ss检查端口
什么是ss?
ss(套接字统计)是netstat的现代替代品。它更快、更高效,并提供更丰富的输出——特别是在具有大量并发连接的系统上。ss命令在几乎所有现代Linux发行版上都默认包含,无需额外安装。
使用ss检查开放和监听端口
ss的语法与netstat的语法非常相似,使过渡变得简单:
ss -tuln标志分解:
| 标志 | 描述 |
|---|---|
-t | 显示TCP套接字 |
-u | 显示UDP套接字 |
-l | 仅显示监听套接字 |
-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与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验证您的防
