如何在Linux上使用ss命令

时间:2020-01-09 10:39:56  来源:igfitidea点击:

ss命令是经典netstat的现代替代品。我们可以在Linux上使用它来获取有关网络连接的统计信息。这是使用此便捷工具的方法。

ss命令与netstat

ss代替不推荐使用的netstat命令,可为我们提供有关计算机如何与其他计算机,网络和服务进行通信的详细信息。

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

使用ss

我们不必安装ss,因为它已经是最新Linux发行版的一部分。但是,它的输出可能会很长,我们的结果包含630行以上。结果也很广泛。

因此,我们将所获得结果的文本表示包括在内,因为它们不适合截图。我们对它们进行了修剪,以使其更易于管理。

列出网络连接

在没有命令行选项的情况下使用ss会列出未监听的套接字。也就是说,它列出了未处于侦听状态的套接字。

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

ss
Netid State Recv-Q Send-Q          Local Address:Port Peer Address:Port   Process
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套接字类型的更多描述。

  • 状态:套接字所处的状态。

  • Recv-Q:收到的数据包数。

  • Send-Q:发送的数据包数。

  • Local Address:Port:本地地址和端口(或者Unix套接字的等效值)。

  • 对等地址:端口:远程地址和端口(或者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               Local Address:Port                  Peer Address:Port Process 
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表示路由网络链接,用于在内核和用户空间进程之间传输信息。

列出所有套接字

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

ss -a
Netid State  Recv-Q Send-Q    Local Address:Port                 Peer Address:Port    Process 
nl    UNCONN 0      0                  rtnl:NetworkManager/535               * 
nl    UNCONN 0      0                  rtnl:evolution-addre/2987 * 
...
u_str LISTEN 0      100       public/showq 23222                            * 0 
u_str LISTEN 0      100      private/error 23225                            * 0 
u_str LISTEN 0      100      private/retry 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    Local Address:Port Peer   Address:Port Process 
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:domain      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               Local Address:Port  Peer Address:Port    Process 
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"选项按套接字所在的状态列出它们。这适用于已建立,正在侦听或者已关闭状态。我们还将使用resolveoption(-r),它将网络地址解析为名称,将端口解析为协议。

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

ss -t -r state established

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

我们可以重复此操作以在侦听状态下查找套接字:

ss -t -r state listening
Recv-Q Send-Q Local Address:Port   Peer Address:Port Process 
0      128        localhost:5939        0.0.0.0:* 
0      4096    localhost%lo:domain      0.0.0.0:* 
0      128          0.0.0.0:ssh         0.0.0.0:* 
0      5          localhost:ipp         0.0.0.0:* 
0      100        localhost:smtp        0.0.0.0:* 
0      128             [::]:ssh         [::]:* 
0      5      ip6-localhost:ipp         [::]:* 
0      100    ip6-localhost:smtp        [::]:*

按协议列出套接字

我们可以使用带有dport和sport选项的特定协议列出套接字,分别代表目标端口和源端口。

我们键入以下内容以在已建立的连接上使用HTTPS协议列出套接字(请注意在左括号后和闭括号前的空间):

ss -a state established ‘( dport = :https or sport = :https )’

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

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

ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’

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

列出到特定IP地址的连接

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

我们输入以下内容:

ss -a dst 192.168.4.25

识别过程

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

sudo ss -t -p
State Recv-Q Send-Q  Local Address:Port   Peer Address:Port  Process 
ESTAB 0      0       192.168.4.28:57650  54.218.19.119:https users:(("firefox",pid=3378,fd=151)) 
ESTAB 0      0       192.168.4.28:ssh     192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))

这向我们显示SSH守护程序和Firefox正在使用TCP套接字上的两个已建立的连接。