15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
30.10.2024

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

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

无论您是在VPS Hosting计划上运行高流量应用程序,还是管理一群裸机,理解Linux服务器的网络暴露都是不可协商的。本指南提供了一份全面、技术准确的演练,说明如何使用netstat和ss——Linux上两个最广泛使用的命令行端口检查工具——以及补充工具和现实世界的最佳实践。

目录

  1. 理解端口及其类型
  2. 使用netstat检查端口
  3. 使用ss检查端口
  4. 比较netstat与ss
  5. 检查开放端口的其他工具
  6. 开放端口管理的安全最佳实践
  7. 结论

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}

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

功能netstatss
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

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用