在 CentOS 上使用 ss 命令替代 lsof 和 netstat 查看端口信息和端口占用

在 CentOS 上使用 ss 命令替代 lsof 和 netstat 查看端口占用

在系统管理和网络运维中,了解网络端口的占用情况是一项至关重要的技能。无论是为了排查网络问题、确保服务绑定到正确的端口,还是为了检测潜在的安全风险,查看端口状态都不可避免。传统上,lsofnetstat 是最常用的工具,但它们并不是所有系统的默认配置。特别是在 CentOS 的最小化安装中,系统通常不会自带这两个命令。

在这样的环境下,ss 命令提供了一个高效的替代方案。ssiproute2 工具包的一部分,不仅功能强大,性能优越,还可以满足大多数 netstatlsof 的使用场景。本文将深入探讨 ss 命令的使用,展示如何使用它来查看端口占用情况,并详细介绍它在网络管理中的其他高级应用。

为什么选择 ss 命令?

在传统网络管理工具中,netstat 曾是最广泛使用的工具之一。然而,随着网络技术的发展和系统资源管理需求的提升,ss 作为 netstat 的替代品逐渐走入人们的视野。它具有以下几个显著优势:

  1. 性能优化ss 直接从内核获取数据,而不是通过 /proc 文件系统获取,这使得它在处理大量连接时更加高效。特别是在高并发环境下,ss 的响应速度比 netstat 更快。

  2. 灵活的输出ss 提供了更多的过滤选项和自定义输出格式,用户可以根据需求精准地获取所需信息,而不必像 netstat 那样处理冗余数据。

  3. 现代特性支持:随着网络技术的发展,新的协议和网络特性不断涌现。ss 更好地支持现代网络协议和特性,适合当前复杂的网络环境。

  4. 命令语法简洁:相比 netstatss 命令的语法更加简洁,易于记忆和使用,特别是对于新手用户而言。

综上所述,ss 是网络管理中的强大工具,值得深入学习和掌握。

安装 iproute2 和 ss 命令

在 CentOS 上,iproute2 工具包通常默认安装。如果你发现 ss 命令不可用,可以通过以下步骤进行安装:

  1. 首先,更新系统软件包:

    sudo yum update
    
  2. 接着,安装 iproute2 工具包:

    sudo yum install iproute
    

完成后,你就可以使用 ss 命令进行网络状态管理。

使用 ss 命令查看端口占用

基本用法示例

ss 命令可以显示各种网络套接字信息,包括 TCP、UDP、RAW 和 Unix 套接字。以下是一些常见的使用场景。

查看所有监听的 TCP 端口

要查看系统中所有正在监听的 TCP 端口,使用以下命令:

ss -lt

解释:

  • -l:列出所有处于监听状态的套接字。
  • -t:仅显示 TCP 端口。

这个命令的输出通常如下所示:

State       Recv-Q       Send-Q        Local Address:Port        Peer Address:Port    
LISTEN      0            128           0.0.0.0:22                0.0.0.0:*            
LISTEN      0            128           [::]:22                   [::]:*

从中可以看出,系统正在监听的端口号为 22,通常对应 SSH 服务。
在这里插入图片描述

查看所有监听的 TCP 端口及其进程信息

为了查看哪些进程正在监听特定端口,可以使用 -p 选项:

ss -ltnp

解释:

  • -n:以数值形式显示地址和端口号,避免 DNS 查询造成的延迟。
  • -p:显示与每个套接字关联的进程信息。

输出示例:

State       Recv-Q       Send-Q        Local Address:Port        Peer Address:Port       Process
LISTEN      0            128           0.0.0.0:22                0.0.0.0:*               users:(("sshd",pid=761,fd=3))
LISTEN      0            128           [::]:22                   [::]:*                  users:(("sshd",pid=761,fd=4))

这段输出表明,sshd 服务(SSH 守护进程)正在监听端口 22,sshd 的进程 ID(PID)为 761。

查看所有 UDP 端口

UDP 是另一种常见的传输协议,用于无连接通信。你可以使用以下命令查看系统中所有正在监听的 UDP 端口:

ss -lun

解释:

  • -u:仅显示 UDP 套接字。

这个命令的输出将列出所有处于监听状态的 UDP 端口及其绑定的地址。

查看所有 TCP 和 UDP 端口

有时,你可能希望同时查看 TCP 和 UDP 端口的占用情况。这可以通过组合选项来实现:

ss -ltnpu

这个命令将显示所有监听的 TCP 和 UDP 端口,并包括与它们关联的进程信息。

高级用法与过滤选项

ss 命令提供了许多高级选项,能够让你根据特定需求来过滤输出信息。以下是一些常见的高级用法示例。

根据连接状态过滤

如果你只对特定状态的连接感兴趣,比如已建立的连接,可以使用 state 选项进行过滤:

ss -t state ESTABLISHED

这将只显示所有处于 ESTABLISHED 状态的 TCP 连接,即已经成功建立的连接。

常见的连接状态包括:

  • ESTABLISHED:连接已经建立。
  • LISTEN:服务器正在监听连接。
  • SYN-SENT:客户端已经发送 SYN 包,正在等待确认。
  • CLOSE-WAIT:连接已经关闭,等待本地关闭。
按端口号过滤

你可以通过过滤特定端口号来缩小查询范围。例如,要查看所有与 80 端口相关的连接,可以使用:

ss -t '( sport = :9876 or dport = :9876 )'

解释:

  • sport:源端口。
  • dport:目标端口。
    在这里插入图片描述

这个命令会显示所有源端口或目标端口为 9876 的 TCP 连接,通常是 RocketMQ 服务使用的端口。

查看连接的详细统计信息

ss 命令还可以提供网络连接的统计信息,以帮助你更好地理解系统的网络状况:

ss -s

输出示例:

Total: 92 (kernel 96)
TCP:   12 (estab 3, closed 3, orphaned 0, synrecv 0, timewait 3/0), ports 0

Transport Total     IP        IPv6
*         96        -         -
RAW       0         0         0
UDP       8         4         4
TCP       9         6         3
INET      17        10        7
FRAG      0         0         0

这个输出提供了各种协议的连接数量、状态分布等信息,适用于系统级别的网络监控。

ss 命令的特殊用法

获取 Unix 套接字信息

除了常见的 TCP 和 UDP 套接字,ss 还支持 Unix 域套接字的查询,这对于调试系统进程间通信非常有用:

ss -x

这个命令会显示系统中的所有 Unix 套接字信息,通常用于本地进程间通信。

查看指定 IP 地址的连接

你可以通过指定 IP 地址来过滤连接。例如,查看与某个远程 IP 地址之间的所有连接:

ss -at 'dst 192.168.1.100'

这个命令将返回所有与 192.168.1.100 这个地址建立的 TCP 连接。

查看 RAW 套接字

RAW 套接字通常用于系统级别的网络编程,例如实现自定义协议。要查看系统中的 RAW 套接字,可以使用:

ss -w

这个命令将列出所有 RAW 套接字及其状态。

实用的 ss 命令组合

ss 命令非常强大,可以与其他命令结合使用,以实现更复杂的功能。以下是几个有用的组合示例。

实时监控端口占用

你可以使用 watch 命令来实时监控端口占用情况。以下命令每秒刷新一次显示的端口状态:

watch -n 1 'ss -ltnp'

这个组合在排查间歇性问题时非常有用。

结合 grep 过滤输出

例如,你可以通过 grep 来过滤特定端口的输出:

ss -ltnp | grep ':80'

这个命令会返回所有与 80 端口相关的监听信息。

导出输出到文件

在处理大量数据时,将输出保存到文件中以便进一步分析是个好主意:

ss -ltnp > output.txt

你可以使用任何文本编辑器来查看 output.txt 文件。

ss 与其他工具的对比

ss vs. netstat

ss 命令被设计为 netstat 的现代替代品。虽然两者功能上有很多重叠,但在实际使用中,ss 有着明显的优势。

特性ssnetstat
性能高效,直接从内核获取数据依赖 /proc 文件系统,性能较低
现代特性支持完全支持 IPv6、网络命名空间等基本支持,但较老旧
输出格式简洁、结构化,易于阅读和过滤输出冗长,过滤选项有限
可扩展性支持复杂的查询和定制化输出定制化功能有限
安装情况默认安装在大多数现代系统上旧版本的系统可能已不支持

ss vs. lsof

lsof 是一个更通用的工具,不仅限于网络状态查询,它可以显示文件系统的所有打开文件,包括网络套接字。而 ss 则专注于网络状态,因此在网络管理中表现更好。

特性sslsof
专业化程度专注于网络连接,功能强大通用工具,覆盖范围广,但深度不足
性能高效,处理大量连接时表现优越性能较低,处理大量文件时效率不高
安装情况默认安装或容易安装需要额外安装
使用场景网络管理、端口占用排查文件系统、进程与网络结合的场景

在网络管理方面,ss 是更好的选择,而 lsof 则适合在更广泛的系统管理任务中使用。

常见问题与解决方案

ss 命令输出被截断怎么办?

在一些情况下,ss 命令的输出可能会被终端窗口截断。这通常是因为终端窗口太小,导致输出无法完全显示。你可以通过以下方法解决这个问题:

  1. 调整终端窗口大小:增加窗口的宽度和高度,以显示更多内容。
  2. 将输出重定向到文件:通过将输出保存到文件中,你可以在文本编辑器中查看完整内容。例如:
    ss -ltnp > output.txt
    
    之后可以使用 catvim 等工具查看文件。

为什么使用 ss -p 选项需要 root 权限?

ss -p 选项用于显示进程信息,包括进程 ID 和名称。由于这类信息涉及到系统的安全性和进程管理,通常只有具有适当权限的用户(例如 root)才能访问。普通用户运行 ss -p 可能无法查看所有进程信息,因此建议使用 sudo 提升权限:

sudo ss -ltnp

如何显示更多的 TCP 连接详细信息?

如果你需要更详细的连接信息,例如 TCP 套接字的标志和状态,可以使用 -i 选项:

ss -tni

这个命令会显示每个连接的详细状态,包括 recv-qsend-q 队列、窗口大小、重传状态等。

ss 与 selinux 的兼容性问题

在启用 SELinux 的环境中,ss 可能会受限于策略规则,导致无法显示某些进程或端口信息。如果遇到这种情况,可以检查 SELinux 是否影响了 ss 命令的执行:

getenforce

如果返回值为 Enforcing,可以暂时通过设置为 Permissive 来测试问题是否由 SELinux 引起:

sudo setenforce 0

请注意,这只是临时解决方案,长期使用需要调整 SELinux 策略以确保系统安全。

结论

在 CentOS 系统中,ss 是替代传统 netstatlsof 命令的一个强大工具。通过掌握 ss 命令的基本和高级用法,你可以在网络管理和排查中获得极大的便利。无论是查看端口占用,还是监控系统的整体网络状态,ss 命令都能够以高效且灵活的方式提供所需信息。

随着现代网络环境的复杂化,ss 的高效性和扩展性使其成为处理网络问题的首选工具。通过对 ss 的深入理解和熟练运用,你将能够更好地管理和维护你的系统网络。

扩展阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值