所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 安全

在Linux上使用netstat和ss检查开放和监听端口

监控 Linux 系统上的开放和监听端口是维护服务器安全、诊断网络问题和有效管理基础设施的最关键实践之一。通过定期审计哪些端口是开放的以及哪些服务绑定到它们,您可以主动识别未授权的访问尝试、检测配置错误,并在严重漏洞出现之前消除不必要的攻击面。

无论您是在 VPS Hosting 计划上运行高流量应用程序,还是管理一批裸机,了解 Linux 服务器的网络暴露都是不可协商的。本指南提供了一份全面、技术准确的演练,说明如何使用 netstatss — 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

netstatnet-tools 包的一部分,该包在许多现代发行版上不再默认安装。按如下方式安装:

Debian / Ubuntu:

sudo apt update && sudo apt install net-tools -y

CentOS / RHEL / AlmaLinux / Rocky Linux:

sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -y

Arch Linux:

sudo pacman -S net-tools

netstat 核心语法

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 — 连接状态(LISTENESTABLISHEDTIME_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 -i

3. 使用 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 -t

ss 的高级过滤

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

两种工具都实现了相同的基本目标,但存在一些有意义的差异,应该指导您的选择:

功能netstatss
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. 其他检查开放端口的工具

除了netstatss之外,还有几个其他实用程序可用于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是一个强大的网络扫描工具,用于安全审计、网络发现和端口扫描。与ssnetstat(检查本地系统)不同,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中的地址和端口以十六进制显示,需要转换才能便于人类阅读。ssnetstat等工具会自动解析此数据。

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 证书配对,以保护传输中的数据并防止中间人攻击。

监控意外更改

使用入侵检测工具如 AIDETripwireauditd 在新进程开始监听端口时向您发出警报。与集中式日志记录(例如 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 -tulnsudo ss -tuln
所有监听端口及 PIDsudo netstat -tulnpsudo ss -tulnp
仅监听的 TCP 端口sudo netstat -tlnsudo ss -tl
仅监听的 UDP 端口sudo netstat -ulnsudo ss -ul
按端口 80 过滤`sudo netstat -tulngrep ":80"`sudo ss -tuln sport = :80
所有已建立的连接sudo netstat -tunpsudo ss -t state established
显示路由表sudo netstat -rip route show

结论

监控开放和监听端口是任何Linux系统管理员或DevOps工程师的基础技能。无论您是在保护生产Web服务器、排查连接问题,还是执行例行安全审计,netstatss都能让您立即了解系统的网络暴露情况。

总结关键要点:

  • 使用ss作为任何现代Linux发行版上的主要工具——它更快、功能更丰富且得到积极维护。
  • 在处理遗留系统或现有脚本和工作流依赖它时使用netstat
  • 使用lsofnmap进行补充以进行更深入的进程级检查和外部端口扫描。
  • 始终根据您的发现采取行动——关闭不必要的端口、将服务绑定到正确的接口并强制执行防火墙规则。
  • 使用适当的SSL证书和访问控制保护暴露的服务

如果您正在寻找一个能让您拥有完整root访问权限来实施这些安全实践的托管环境,AlexHost的VPS托管计划提供对Linux服务器配置的完全控制——包括防火墙管理、服务加固和网络监控。对于需要最大性能和专用资源的团队,我们的专用服务器提供企业级安全操作所需的原始性能和隔离。如果您更喜欢具有熟悉界面的托管环境,请探索我们的带cPanel的VPS选项,以实现简化的服务器管理而不牺牲控制权。

定期进行端口审计,结合加固的服务器配置,是防止未授权访问和数据泄露的最有效防御之一。将其作为系统管理实践的常规部分。