在Linux上使用netstat和ss检查开放和监听端口
监控 Linux 系统上的开放和监听端口是维护服务器安全、诊断网络问题和有效管理基础设施的最关键实践之一。通过定期审计哪些端口是开放的以及哪些服务绑定到它们,您可以主动识别未授权的访问尝试、检测配置错误,并在严重漏洞出现之前消除不必要的攻击面。
无论您是在 VPS Hosting 计划上运行高流量应用程序,还是管理一批裸机,了解 Linux 服务器的网络暴露都是不可协商的。本指南提供了一份全面、技术准确的演练,说明如何使用 netstat 和 ss — Linux 上两个最广泛使用的命令行工具进行端口检查 — 以及补充工具和现实世界的最佳实践。
1. 理解端口及其类型
在深入了解工具本身之前,建立对端口是什么、如何分类以及为什么监控它们很重要的清晰理解是很重要的。
什么是网络端口?
网络端口是与主机上特定进程或服务相关联的逻辑通信端点。端口允许具有一个 IP 地址的单个服务器同时运行多个网络服务——例如,端口 80 上的 Web 服务器、端口 22 上的 SSH 守护程序和端口 3306 上的数据库。
端口分类
| 范围 | 分类 | 描述 |
|---|---|---|
| 0–1023 | 众所周知的端口 | 为标准系统服务保留(HTTP、SSH、FTP 等) |
| 1024–49151 | 已注册端口 | 由应用程序和中间件使用(MySQL、PostgreSQL 等) |
| 49152–65535 | 动态/临时端口 | 为出站客户端连接临时分配 |
你会遇到的端口状态
- LISTEN — 端口处于打开状态,服务正在主动等待传入连接。
- ESTABLISHED — 两个端点之间存在活跃连接。
- TIME_WAIT — 连接正在关闭;系统正在等待以确保远端收到了最终确认。
- CLOSE_WAIT — 远端已关闭连接;本地应用程序还没有关闭其端。
传输协议
- TCP(传输控制协议):面向连接、可靠、具有错误检查和保证交付。由 HTTP、HTTPS、SSH、FTP 和大多数应用层协议使用。
- UDP(用户数据报协议):无连接、更快,但没有交付保证。由 DNS、NTP、DHCP 和流媒体服务使用。

2. 使用 netstat 检查端口
什么是 netstat?
netstat(网络统计)是一个经典的命令行工具,用于显示活跃的网络连接、路由表、接口统计信息和监听端口。虽然在现代 Linux 发行版上已被官方弃用,取而代之的是 ss,但 netstat 仍然被广泛部署——特别是在遗留系统和管理员熟悉其语法的环境中。
安装 netstat
netstat 是 net-tools 包的一部分,该包在许多现代发行版上不再默认安装。按如下方式安装:
Debian / Ubuntu:
sudo apt update && sudo apt install net-tools -yCentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -yArch Linux:
sudo pacman -S net-toolsnetstat 核心语法
sudo netstat [options]
检查所有监听的 TCP 和 UDP 端口
sudo netstat -tuln标志说明:
| 标志 | 含义 |
|---|---|
-t | 显示 TCP 连接和端口 |
-u | 显示 UDP 连接和端口 |
-l | 仅显示监听套接字(等待连接的端口) |
-n | 显示数字 IP 地址和端口号(跳过 DNS 解析以提高速度) |
输出示例:
Active Internet connections (only servers)
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
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp6 0 0 :::443 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*读取输出:
- Proto — 使用的协议(tcp、udp、tcp6、udp6)。
- Local Address — 服务监听的 IP 地址和端口号。
0.0.0.0表示服务在所有可用接口上监听;127.0.0.1表示仅在本地可访问。 - Foreign Address — 远程客户端的地址(对于没有活跃连接的监听端口显示为
0.0.0.0:*)。 - State — 连接状态(
LISTEN、ESTABLISHED、TIME_WAIT等)。
包含进程信息
要查看哪个进程拥有每个监听端口,请添加 -p 标志:
sudo netstat -tulnp包含进程信息的输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1023/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2847/nginx
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3102/mysqld> 注意:您必须使用 sudo 运行此命令,以查看所有用户的进程名称,而不仅仅是您自己的。
过滤输出以查找特定端口或服务
使用 grep 将结果缩小到特定端口或服务:
# Check if anything is listening on port 80
sudo netstat -tuln | grep ":80"
# Check for SSH (port 22)
sudo netstat -tuln | grep ":22"
# Check for MySQL (port 3306)
sudo netstat -tuln | grep ":3306"
# Check for HTTPS (port 443)
sudo netstat -tuln | grep ":443"查看所有活跃连接(不仅仅是监听)
要查看所有活跃连接(包括已建立的连接),请删除 -l 标志:
sudo netstat -tunp显示路由表
sudo netstat -r

显示网络接口统计信息
sudo netstat -i3. 使用 ss 检查端口
什么是 ss?
ss (socket statistics) 是 netstat 的现代替代品,作为 iproute2 包的一部分开发。它通过 Netlink 套接字直接与 Linux 内核通信,使其比 netstat 显著更快更高效 — 特别是在拥有数千个并发连接的系统上。
ss 默认安装在几乎所有现代 Linux 发行版上,包括 Ubuntu 18.04+、CentOS 7+、Debian 9+ 及其衍生版本。
ss 核心语法
ss [options] [filter]检查所有监听的 TCP 和 UDP 端口
ss -tuln这些标志的含义与 netstat 相同:
| 标志 | 含义 |
|---|---|
-t | 显示 TCP 套接字 |
-u | 显示 UDP 套接字 |
-l | 仅显示监听套接字 |
-n | 显示数字地址(不进行 DNS 解析) |
示例输出:
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 128 127.0.0.1:3306 0.0.0.0:*
tcp LISTEN 0 511 [::]:443 [::]:*
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*包含进程信息
sudo ss -tulnp示例输出:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1023,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2847,fd=6))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=3102,fd=21))按协议过滤
仅显示监听的 TCP 端口:
ss -tl仅显示监听的 UDP 端口:
ss -ul显示所有 TCP 连接(包括已建立的):
ss -tss 的高级过滤
ss 最强大的功能之一是其内置的基于表达式的过滤,允许你按端口、地址、状态等进行过滤 — 无需依赖 grep。
按特定端口号过滤:
ss -tuln sport = :80
ss -tuln sport = :443
ss -tuln sport = :22按目标端口过滤:
ss -tuln dport = :3306显示所有处于 ESTABLISHED 状态的套接字:
ss -t state established显示所有处于 LISTEN 状态的套接字:
ss -t state listening按源 IP 地址过滤:
ss -tuln src 192.168.1.100显示到特定远程主机的连接:
ss -t dst 203.0.113.50组合多个过滤器:
ss -t state established '( dport = :443 or sport = :443 )'显示套接字内存使用情况
ss 还可以显示每个套接字的详细内存使用情况,这对于诊断性能问题很有用:
ss -tm显示计时器信息
ss -to这显示 TCP 连接的重传计时器和保活计时器,对于诊断连接稳定性问题非常宝贵。
4. 比较 netstat 与 ss
两种工具都实现了相同的基本目标,但存在一些有意义的差异,应该指导您的选择:
| 功能 | netstat | ss |
|---|---|---|
| 包 | net-tools(通常未预装) | iproute2(在现代发行版上预装) |
| 速度 | 较慢(从 /proc/net/ 读取) | 更快(使用 Netlink 内核接口) |
| 大规模性能 | 在有数千个连接时性能下降 | 高效处理大量连接 |
| 高级过滤 | 需要通过管道传递给 grep | 内置基于表达式的过滤 |
| 输出详细程度 | 良好 | 更详细(内存、计时器等) |
| IPv6 支持 | 足够 | 优秀 |
| 维护状态 | 已弃用 | 积极维护 |
| 学习曲线 | 对长期管理员来说很熟悉 | 语法略有不同但文档齐全 |
何时使用 netstat
- 在管理较旧的 Linux 系统(CentOS 6、Debian 7 等)时,其中
ss可能不可用。 - 在使用已经使用
netstat语法的脚本或文档时。 - 当您对其输出格式更熟悉且不需要高级过滤时。
何时使用 ss
- 在任何现代 Linux 发行版上(Ubuntu 18.04+、CentOS 7+、Debian 9+ 及更新版本)。
- 在管理具有大量并发连接的服务器时——例如在专用服务器上运行且负载很重的服务器。
- 当您需要高级过滤、计时器信息或套接字内存统计时。
- 对于性能至关重要的自动化和脚本编写。
5. 其他检查开放端口的工具
除了netstat和ss之外,还有几个其他实用程序可用于Linux上的端口检查和网络分析。
lsof — 列出开放文件(包括套接字)
lsof(列出开放文件)将网络套接字视为文件(符合Linux的”一切皆文件”理念),可以显示哪个进程打开了特定端口。
安装lsof:
# Debian/Ubuntu
sudo apt install lsof -y
# CentOS/RHEL
sudo yum install lsof -y检查哪个进程在使用端口80:
sudo lsof -i :80检查哪个进程在使用端口443:
sudo lsof -i :443列出所有网络连接:
sudo lsof -i列出所有TCP监听套接字:
sudo lsof -i TCP -s TCP:LISTEN示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2847 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
nginx 2848 www-data 6u IPv4 23456 0t0 TCP *:http (LISTEN)nmap — 网络映射器
nmap是一个强大的网络扫描工具,用于安全审计、网络发现和端口扫描。与ss和netstat(检查本地系统)不同,nmap可以扫描本地和远程主机。
安装nmap:
# Debian/Ubuntu
sudo apt install nmap -y
# CentOS/RHEL
sudo yum install nmap -y扫描localhost上的所有TCP端口:
sudo nmap -sT localhost扫描开放端口并进行操作系统检测:
sudo nmap -sT -O localhost扫描特定端口范围:
sudo nmap -p 1-1024 localhost扫描UDP端口(需要root权限):
sudo nmap -sU localhost扫描远程服务器:
sudo nmap -sT 203.0.113.50> 重要提示:仅扫描您拥有或明确获得许可的系统。未经授权的端口扫描可能违反法律和服务条款。
fuser — 识别使用文件或套接字的进程
# Find which process is using port 80 (TCP)
sudo fuser 80/tcp
# Find which process is using port 53 (UDP)
sudo fuser 53/udp/proc/net/ — 直接内核接口
出于脚本编写目的,您可以直接从Linux内核的虚拟文件系统读取端口信息:
# View raw TCP socket table
cat /proc/net/tcp
# View raw UDP socket table
cat /proc/net/udp请注意,/proc/net/tcp中的地址和端口以十六进制显示,需要转换才能便于人类阅读。ss和netstat等工具会自动解析此数据。
6. 开放端口管理的安全最佳实践
知道如何检查开放端口只是成功的一半。根据该信息采取行动才是保持服务器安全的关键。以下是每个 Linux 管理员应该遵循的可行最佳实践:
最小暴露原则
仅暴露应用程序正常运行所需的端口。每个开放端口都是潜在的攻击向量。定期审计您的监听端口,并关闭或防火墙任何不需要公开访问的端口。
将服务绑定到特定接口
除非必要,否则避免将服务绑定到 0.0.0.0(所有接口)。例如,MySQL 数据库服务器仅在本地访问时应仅监听 127.0.0.1:
# In /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1使用防火墙
使用 ufw(Ubuntu)或 firewalld / iptables(CentOS/RHEL)按 IP 地址、子网或网络接口限制对开放端口的访问:
# Allow SSH only from a specific IP (ufw)
sudo ufw allow from 203.0.113.10 to any port 22
# Deny all other access to port 22
sudo ufw deny 22定期审计监听端口
使用 cron 作业或监控工具定期进行端口审计。突然出现的新监听端口可能表示服务被破坏、配置错误,或在最坏的情况下——恶意软件:
# Quick audit command — save output and compare over time
sudo ss -tulnp > /var/log/port_audit_$(date +%F).txt使用 SSL/TLS 保护服务
任何暴露在互联网上的服务——Web 服务器、邮件服务器、控制面板——都应使用加密连接。将您的开放端口与有效的 SSL 证书配对,以保护传输中的数据并防止中间人攻击。
监控意外更改
使用入侵检测工具如 AIDE、Tripwire 或 auditd 在新进程开始监听端口时向您发出警报。与集中式日志记录(例如 ELK Stack、Graylog)集成以获得全面的可见性。
禁用未使用的服务
如果不需要某项服务,请停止它并禁用它在启动时启动:
# Stop and disable a service (systemd)
sudo systemctl stop <service-name>
sudo systemctl disable <service-name>快速参考:最有用的命令
| 任务 | netstat 命令 | ss 命令 | |
|---|---|---|---|
| 所有监听的 TCP/UDP 端口 | sudo netstat -tuln | sudo ss -tuln | |
| 所有监听端口及 PID | sudo netstat -tulnp | sudo ss -tulnp | |
| 仅监听的 TCP 端口 | sudo netstat -tln | sudo ss -tl | |
| 仅监听的 UDP 端口 | sudo netstat -uln | sudo ss -ul | |
| 按端口 80 过滤 | `sudo netstat -tuln | grep ":80"` | sudo ss -tuln sport = :80 |
| 所有已建立的连接 | sudo netstat -tunp | sudo ss -t state established | |
| 显示路由表 | sudo netstat -r | ip route show |
结论
监控开放和监听端口是任何Linux系统管理员或DevOps工程师的基础技能。无论您是在保护生产Web服务器、排查连接问题,还是执行例行安全审计,netstat和ss都能让您立即了解系统的网络暴露情况。
总结关键要点:
- 使用
ss作为任何现代Linux发行版上的主要工具——它更快、功能更丰富且得到积极维护。 - 在处理遗留系统或现有脚本和工作流依赖它时使用
netstat。 - 使用
lsof和nmap进行补充以进行更深入的进程级检查和外部端口扫描。 - 始终根据您的发现采取行动——关闭不必要的端口、将服务绑定到正确的接口并强制执行防火墙规则。
- 使用适当的SSL证书和访问控制保护暴露的服务。
如果您正在寻找一个能让您拥有完整root访问权限来实施这些安全实践的托管环境,AlexHost的VPS托管计划提供对Linux服务器配置的完全控制——包括防火墙管理、服务加固和网络监控。对于需要最大性能和专用资源的团队,我们的专用服务器提供企业级安全操作所需的原始性能和隔离。如果您更喜欢具有熟悉界面的托管环境,请探索我们的带cPanel的VPS选项,以实现简化的服务器管理而不牺牲控制权。
定期进行端口审计,结合加固的服务器配置,是防止未授权访问和数据泄露的最有效防御之一。将其作为系统管理实践的常规部分。
