如何在 Linux 上使用 ss 命令

已发表: 2022-01-29
Linux 笔记本电脑系统上的终端窗口。
Fatmawati Achmad Zaenuri/Shutterstock

ss命令是经典netstat的现代替代品。 您可以在 Linux 上使用它来获取有关网络连接的统计信息。 以下是如何使用这个方便的工具。

ss 命令与 netstat

作为已弃用的netstat命令的替代品, ss为您提供有关您的计算机如何与其他计算机、网络和服务通信的详细信息。

ss显示传输控制协议 (TCP)、用户数据报协议 (UDP)、Unix(进程间)和原始套接字的统计信息。 原始套接字在网络 OSI 级别运行,这意味着 TCP 和 UDP 标头必须由应用软件处理,而不是由传输层处理。 Internet 控制消息协议 (ICMP) 消息和 ping 实用程序都使用原始套接字。

使用 ss

您不必安装ss ,因为它已经是最新 Linux 发行版的一部分。 然而,它的输出可能很长——我们的结果包含超过 630 行。 结果也很广泛。

因此,我们包含了我们获得的结果的文本表示,因为它们不适合屏幕截图。 我们对它们进行了修剪,使它们更易于管理。

列出网络连接

使用不带命令行选项的ss会列出非侦听的套接字。 也就是说,它列出了不处于侦听状态的套接字。

要查看此内容,请键入以下内容:

 ss 

 Netid State Recv-Q Send-Q 本地地址:端口 对端地址:端口进程
u_str ESTAB 0 0 * 41826 * 41827
u_str ESTAB 0 0 /run/systemd/journal/stdout 35689 * 35688
u_str ESTAB 0 0 * 35550 * 35551
...
u_str ESTAB 0 0 * 38127 * 38128
u_str ESTAB 0 0 /run/dbus/system_bus_socket 21243 * 21242
u_str ESTAB 0 0 * 19039 * 19040
u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 
u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306
icmp6 UNCONN 0 0 *:ipv6-icmp *:*
udp ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps

列如下:

  • Netid :套接字的类型。 在我们的示例中,我们有“u_str”,一个 Unix 流,一个“udp”和“icmp6”,一个 IP 版本 6 ICMP 套接字。 您可以在 Linux 手册页中找到有关 Linux 套接字类型的更多描述。
  • State :套接字所处的状态。
  • Recv-Q :接收到的数据包数。
  • Send-Q :发送数据包的数量。
  • Local Address:Port :本地地址和端口(或 Unix 套接字的等效值)。
  • Peer Address:Port :远程地址和端口(或 Unix 套接字的等效值)。
广告

对于 UDP 套接字,“状态”列通常为空白。 对于 TCP 套接字,它可以是以下之一:

  • LISTEN:仅限服务器端。 套接字正在等待连接请求。
  • SYN-SENT:仅限客户端。 此套接字已发出连接请求,正在等待查看它是否被接受。
  • SYN-RECEIVED:仅限服务器端。 此套接字在接受连接请求后正在等待连接确认。
  • 已建立:服务器和客户端。 服务器和客户端之间已经建立了工作连接,允许在两者之间传输数据。
  • FIN-WAIT-1:服务器和客户端。 此套接字正在等待来自远程套接字的连接终止请求,或者等待先前从该套接字发送的连接终止请求的确认。
  • FIN-WAIT-2:服务器和客户端。 此套接字正在等待来自远程套接字的连接终止请求。
  • CLOSE-WAIT:服务器和客户端。 此套接字正在等待来自本地用户的连接终止请求。
  • 关闭:服务器和客户端。 此套接字正在等待来自远程套接字的连接终止请求确认。
  • LAST-ACK:服务器和客户端。 此套接字正在等待它发送到远程套接字的连接终止请求的确认。
  • TIME-WAIT:服务器和客户端。 这个套接字向远程套接字发送一个确认,让它知道它收到了远程套接字的终止请求。 现在正在等待以确保收到确认。
  • CLOSED:没有连接,所以套接字已经终止。

列出监听套接字

要查看监听套接字,我们将添加-l (监听)选项,如下所示:

 ss -l 

 Netid State Recv-Q Send-Q 本地地址:端口 对端地址:端口进程 
nl UNCONN 0 0 rtnl:NetworkManager/535 * 
nl UNCONN 0 0 rtnl:evolution-addre/2987 * 
...
u_str LISTEN 0 4096 /run/systemd/private 13349 * 0 
u_seq LISTEN 0 4096 /run/udev/control 13376 * 0 
u_str LISTEN 0 4096 /tmp/.X11-unix/X0 33071 * 0 
u_dgr UNCONN 0 0 /run/systemd/journal/syslog 13360 * 0 
u_str LISTEN 0 4096 /run/systemd/fsck.progress 13362 * 0 
u_dgr UNCONN 0 0 /run/user/1000/systemd/notify 32303 * 0

这些套接字都是未连接的并且正在侦听。 “rtnl”表示路由netlink,用于在内核和用户空间进程之间传输信息。

列出所有套接字

要列出所有套接字,您可以使用-a (全部)选项:

 ss -a 

 Netid State Recv-Q Send-Q 本地地址:端口 对端地址:端口进程 
nl UNCONN 0 0 rtnl:NetworkManager/535 * 
nl UNCONN 0 0 rtnl:evolution-addre/2987 * 
...
u_str LISTEN 0 100 公共/showq 23222 * 0 
u_str LISTEN 0 100 私有/错误 23225 * 0 
u_str LISTEN 0 100 私有/重试 23228 * 0 
...
udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:* 
udp UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* 
...
tcp LISTEN 0 128 [::]:ssh [::]:* 
tcp LISTEN 0 5 [::1]:ipp [::]:* 
tcp LISTEN 0 100 [::1]:smtp [::]:*

输出包含所有套接字,无论状态如何。

列出 TCP 套接字

您还可以应用过滤器,以便仅显示匹配的套接字。 我们将使用-t (TCP) 选项,因此只会列出 TCP 套接字:

ss -a -t

列出 UDP 套接字

-u (UDP) 选项执行相同类型的过滤操作。 这一次,我们将只看到 UDP 套接字:

 ss -a -u 

 State Recv-Q Send-Q 本地地址:端口对端地址:端口进程 
UNCONN 0 0 0.0.0.0:631 0.0.0.0:* 
UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* 
UNCONN 0 0 0.0.0.0:60734 0.0.0.0:* 
UNCONN 0 0 127.0.0.53%lo: 域 0.0.0.0:* 
ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps 
UNCONN 0 0 [::]:mdns [::]:* 
UNCONN 0 0 [::]:51193 [::]:*

列出 Unix 套接字

要仅查看 Unix 套接字,您可以包含-x (Unix) 选项,如下所示:

 ss -a -x 

 Netid State Recv-Q Send-Q 本地地址:端口 对端地址:端口进程 
u_str ESTAB 0 0 * 41826 * 41827 
u_str ESTAB 0 0 * 23183 * 23184 
u_str ESTAB 28 0 @/tmp/.X11-unix/X0 52640 * 52639 
...
u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 
u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306

列出原始套接字

原始套接字的过滤器是-w (原始)选项:

 ss -a -w 

列出 IP 版本 4 套接字

可以使用-4 (IPV4) 选项列出使用 TCP/IP 版本 4 协议的套接字:

 ss -a -4 

列出 IP 版本 6 套接字

您可以使用-6 (IPV6) 选项打开匹配的 IP 版本 6 过滤器,如下所示:

 ss -a -6 

按状态列出套接字

您可以使用state选项按其所处的状态列出套接字。 这适用于已建立、正在侦听或已关闭的状态。 我们还将使用解析选项 ( -r ),它尝试将网络地址解析为名称,并将端口解析为协议。

广告

以下命令将查找已建立的 TCP 连接,并且ss将尝试解析名称:

 ss -t -r 状态建立

列出了四个处于已建立状态的连接。 主机名 ubuntu20-04 已被解析,第二行的 SSH 连接显示“ssh”而不是 22。

我们可以重复这个来寻找处于监听状态的套接字:

 ss -t -r 状态监听

 Recv-Q Send-Q 本地地址:端口对端地址:端口进程 
0 128 本地主机:5939 0.0.0.0:* 
0 4096 localhost%lo: 域 0.0.0.0:* 
0 128 0.0.0.0:ssh 0.0.0.0:* 
0 5 本地主机:ipp 0.0.0.0:* 
0 100 本地主机:smtp 0.0.0.0:* 
0 128 [::]:ssh [::]:* 
0 5 ip6-localhost:ipp [::]:* 
0 100 ip6-localhost:smtp [::]:*

按协议列出套接字

您可以使用具有dportsport选项的特定协议列出套接字,它们分别代表目标和源端口。

我们键入以下内容以在已established的连接上使用 HTTPS 协议列出套接字(注意左括号之后和右括号之前的空格):

 ss -a state 建立'( dport = :https 或 sport = :https )' 

我们可以使用协议名称或通常与该协议关联的端口。 Secure Shell (SSH) 的默认端口是端口 22。

广告

我们将在一个命令中使用协议名称,然后使用端口号重复它:

 ss -a '( dport = :ssh 或运动 = :ssh )'
 ss -a '( dport = :22 或运动 = :22 )' 

正如预期的那样,我们得到了相同的结果。

列出到特定 IP 地址的连接

使用dst (目标)选项,我们可以列出到特定目标 IP 地址的连接。

我们输入以下内容:

 ss -a dst 192.168.4.25 

识别流程

要查看哪些进程正在使用套接字,您可以使用 processes 选项 ( -p ),如下所示(注意您必须使用sudo ):

 须藤 ss -t -p 

 State Recv-Q Send-Q 本地地址:端口对端地址:端口进程 
ESTAB 0 0 192.168.4.28:57650 54.218.19.119:https 用户:(("firefox",pid=3378,fd=151)) 
ESTAB 0 0 192.168.4.28:ssh 192.168.4.25:43946 用户:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))

这向我们表明,SSH 守护进程和 Firefox 正在使用 TCP 套接字上已建立的两个连接。

一个当之无愧的继任者

ss命令提供的信息与之前由netstat提供的信息相同,但以更简单、更易于访问的方式提供。 您可以查看手册页以获取更多选项和提示。

相关:适合开发人员和爱好者的最佳 Linux 笔记本电脑