在 Linux 上使用 netstat 和 ss 检查开放和监听端口
在Linux系统上监控开放和监听端口是维护服务器安全、诊断网络问题和有效管理基础设施的最关键实践之一。通过定期审计哪些端口是开放的以及哪些服务绑定到它们,您可以主动识别未授权的访问尝试、检测配置错误,并在它们成为严重漏洞之前消除不必要的攻击面。
无论您是在VPS Hosting计划上运行高流量应用程序,还是管理一群裸机,理解Linux服务器的网络暴露都是不可协商的。本指南提供了一份全面、技术准确的演练,说明如何使用netstat和ss——Linux上两个最广泛使用的命令行端口检查工具——以及补充工具和现实世界的最佳实践。
目录
- 理解端口及其类型
- 使用netstat检查端口
- 使用ss检查端口
- 比较netstat与ss
- 检查开放端口的其他工具
- 开放端口管理的安全最佳实践
- 结论
1. 理解端口及其类型 {#understanding-ports}
在深入研究工具本身之前,建立对端口是什么、如何分类以及为什么监控它们很重要的清晰理解是很重要的。
什么是网络端口?
网络端口是与主机上特定进程或服务相关联的逻辑通信端点。端口允许具有一个IP地址的单个服务器同时运行多个网络服务——例如,Web服务器在端口80上、SSH守护程序在端口22上和数据库在端口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?
netstat(网络统计)是一个经典的命令行实用程序,显示活动网络连接、路由表、接口统计和监听端口。虽然它在现代Linux发行版上已被正式弃用,取而代之以ss,但netstat仍然广泛部署——特别是在遗留系统和管理员深熟其语法的环境中。
安装netstat
netstat是net-tools包的一部分,在许多现代发行版上不再默认安装。按如下方式安装它:
Debian / Ubuntu:
sudo apt install net-tools
CentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install net-tools
Arch Linux:
sudo pacman -S net-tools
核心netstat语法
netstat [options]
检查所有监听的TCP和UDP端口
sudo netstat -tulpn
标志分解:
| 标志 | 含义 |
|---|---|
| -t | 显示TCP连接和端口 |
| -u | 显示UDP连接和端口 |
| -l | 仅显示监听套接字(等待连接的端口) |
| -n | 显示数字IP地址和端口号(跳过DNS解析以提高速度) |
示例输出:
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 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:53 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 -tulpn
带进程信息的示例输出:
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 1234/sshd
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5678/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9012/nginx> 注意:您必须以root身份运行此命令才能看到所有用户的进程名称,而不仅仅是您自己的。
为特定端口或服务过滤输出
使用grep将结果缩小到特定端口或服务:
sudo netstat -tulpn | grep :80
查看所有活动连接(不仅仅是监听)
要查看所有活动连接,包括已建立的连接,请删除-l标志:
sudo netstat -tupn
显示路由表
netstat -r
显示网络接口统计
netstat -i
3. 使用ss检查端口 {#ss}
什么是ss?
ss(套接字统计)是netstat的现代替代品,作为iproute2包的一部分开发。它通过Netlink套接字直接与Linux内核通信,使其比netstat显著更快和更高效——特别是在具有数千个并发连接的系统上。
ss在几乎所有现代Linux发行版上默认安装,包括Ubuntu 18.04+、CentOS 7+、Debian 9+及其衍生版本。
核心ss语法
ss [options]
检查所有监听的TCP和UDP端口
ss -tulpn
标志的含义与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 128 127.0.0.1:3306 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:53 0.0.0.0:*包括进程信息
sudo ss -tulpn
示例输出:
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=1234,fd=3))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=5678,fd=21))
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=9012,fd=6))按协议过滤
仅显示监听的TCP端口:
ss -tlnp
仅显示监听的UDP端口:
ss -ulnp
显示所有TCP连接(包括已建立):
ss -tnp
使用ss进行高级过滤
ss最强大的功能之一是其内置的基于表达式的过滤,允许您按端口、地址、状态等进行过滤——无需依赖grep。
按特定端口号过滤:
ss -tulpn sport = :80
按目标端口过滤:
ss -tulpn dport = :443
显示所有处于ESTABLISHED状态的套接字:
ss -tnp state established
显示所有处于LISTEN状态的套接字:
ss -tlnp state listening
按源IP地址过滤:
ss -tnp src 192.168.1.100
显示与特定远程主机的连接:
ss -tnp dst 10.0.0.5
组合多个过滤器:
ss -tnp state established dst 10.0.0.0/8
显示套接字内存使用情况
ss还可以显示每个套接字的详细内存使用情况,这对于诊断性能问题很有用:
ss -tnmp
显示计时器信息
ss -tnop
这显示TCP连接的重传计时器和keepalive计时器,这对于诊断连接稳定性问题非常宝贵。
4. 比较netstat与ss {#comparison}
两种工具都完成相同的基本目标,但存在有意义的差异,应该指导您的选择:
| 功能 | netstat | ss |
|---|---|---|
| 包 | net-tools(通常未预装) | iproute2(在现代发行版上预装) |
| 速度 | 较慢(从/proc读取) | 更快(使用Netlink内核接口) |
| 大规模性能 | 在数千个连接时性能下降 | 有效处理大量连接 |
| 高级过滤 | 需要管道到grep | 内置基于表达式的过滤 |
| 输出详细程度 | 良好 | 更详细(内存、计时器等) |
| IPv6支持 | 充分 | 优秀 |
| 维护状态 | 已弃用 | 积极维护 |
| 学习曲线 | 长期管理员熟悉 | 语法略有不同但文档完善 |
何时使用netstat
- 在管理较旧的Linux系统(CentOS 6、Debian 7等)时,其中ss可能不可用。
- 在使用已经使用netstat语法的脚本或文档时。
- 当您对其输出格式更熟悉且不需要高级过滤时。
何时使用ss
- 在任何现代Linux发行版上(Ubuntu 18.04+、CentOS 7+、Debian 9+及更新版本)。
- 在管理具有大量并发连接的服务器时——例如在专用服务器上在重负载下运行的服务器。
- 当您需要高级过滤、计时器信息或套接字内存统计时。
- 对于性能重要的自动化和脚本编写。
5. 检查开放端口的其他工具 {#other-tools}
除了netstat和ss,还有几个其他实用程序对Linux上的端口检查和网络分析很有用。
lsof — 列出开放文件(包括套接字)
lsof(List Open Files)将网络套接字视为文件(与Linux的”一切都是文件”哲学一致),可以显示哪个进程打开了特定端口。
安装lsof:
sudo apt install lsof # Debian/Ubuntu
sudo yum install lsof # CentOS/RHEL检查哪个进程正在使用端口80:
sudo lsof -i :80
检查哪个进程正在使用端口443:
sudo lsof -i :443
列出所有网络连接:
sudo lsof -i
列出所有TCP监听套接字:
sudo lsof -i -sTCP:LISTEN
示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN)
mysqld 5678 mysql 21u IPv4 54321 0t0 TCP 127.0.0.1:3306 (LISTEN)
nginx 9012 www 6u IPv4 98765 0t0 TCP *:80 (LISTEN)nmap — 网络映射器
nmap是一个强大的网络扫描工具,用于安全审计、网络发现和端口扫描。与netstat和ss不同(它们检查本地系统),nmap可以扫描本地和远程主机。
安装nmap:
sudo apt install nmap # Debian/Ubuntu
sudo yum install nmap # CentOS/RHEL扫描localhost上的所有TCP端口:
nmap -p- localhost
扫描开放端口并进行OS检测:
sudo nmap -O localhost
扫描特定端口范围:
nmap -p 1-1024 localhost
扫描UDP端口(需要root):
sudo nmap -sU localhost
扫描远程服务器:
nmap example.com
> 重要:仅扫描您拥有或明确获得扫描权限的系统。未授权的端口扫描可能违反法律和服务条款。
fuser — 识别使用文件或套接字的进程
fuser 80/tcp
/proc/net/ — 直接内核接口
出于脚本编写目的,您可以直接从Linux内核的虚拟文件系统读取端口信息:
cat /proc/net/tcp
cat /proc/net/udp注意/proc/net/tcp中的地址和端口以十六进制显示,需要转换以便人类可读。ss和netstat等工具会自动解析此数据。
6. 开放端口管理的安全最佳实践 {#security}
知道如何检查开放端口只是战斗的一半。根据该信息采取行动是保持服务器安全的关键。以下是每个Linux管理员应该遵循的可行最佳实践:
最小暴露原则
仅暴露应用程序运行所绝对必要的端口。每个开放端口都是潜在的攻击向量。定期审计您的监听端口并关闭或防火墙任何不需要公开访问的内容。
将服务绑定到特定接口
避免将服务绑定到0.0.0.0(所有接口),除非需要。例如,MySQL数据库服务器如果仅在本地访问,应仅监听127.0.0.1:
bind-address = 127.0.0.1
使用防火墙
使用ufw(Ubuntu)或firewalld / iptables(CentOS/RHEL)按IP地址、子网或网络接口限制对开放端口的访问:
sudo ufw allow from 192.168.1.0/24 to any port 3306
定期审计监听端口
使用cron作业或监控工具安排定期端口审计。突然出现的新监听端口可能表示受损的服务、配置错误,或——在最坏的情况下——恶意软件:
0 2 * * * /usr/bin/ss -tulpn > /var/log/ports-$(date +%Y%m%d).log
使用SSL/TLS保护服务
任何暴露在互联网上的服务——Web服务器、邮件服务器、控制面板——都应使用加密连接。将您的开放端口与有效的SSL证书配对以保护传输中的数据并防止中间人攻击。
监控意外更改
使用入侵检测工具如Aide、Tripwire或Osquery在新进程开始监听端口时向您发出警报。与集中式日志记录(例如ELK Stack、Graylog)集成以获得全面的可见性。
禁用未使用的服务
如果不需要服务,请停止它并禁用它在启动时启动:
sudo systemctl stop
