如何在Linux上使用ss命令
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套接字上的两个已建立的连接。