Linux ss 命令教程

返回工具箱首页

在早期运维工作中,查看服务器连接数一般都会用netstat命令。其实,有一个命令比netstat更高效,那就是ss(Socket Statistics)命令!

netstat命令是net-tools工具集中的一员,这个工具一般linux系统会默认安装的;ss命令是iproute工具集中的一员;
net-tools是一套标准的Unix网络工具,用于配置网络接口、设置路由表信息、管理ARP表、显示和统计各类网络信息等等,但是遗憾的是,这个工具自2001年起便不再更新和维护了。
iproute,这是一套可以支持IPv4/IPv6网络的用于管理TCP/UDP/IP网络的工具集。

SS的用法

语法

ss [参数]
ss [参数] [过滤]

选项

-n, --numeric   不解析服务名称
-r, --resolve   解析主机名
-a, --all       显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options   显示计时器信息
-p, --processes 显示使用套接字(socket)的进程
-i, --info      显示 TCP内部信息
-s, --summary   显示套接字(socket)使用概况
-4, --ipv4      仅显示IPv4的套接字(sockets)
-6, --ipv6      仅显示IPv6的套接字(sockets)
-0, --packet    显示 PACKET 套接字(socket)
-t, --tcp       仅显示 TCP套接字(sockets)
-u, --udp       仅显示 UCP套接字(sockets)
-d, --dccp      仅显示 DCCP套接字(sockets)
-w, --raw       仅显示 RAW套接字(sockets)
-x, --unix      仅显示 Unix套接字(sockets)
-f, --family=FAMILY  显示 FAMILY类型的套接字(sockets),FAMILY可选,支持  unix, inet, inet6, link, netlink
 -F, --filter=FILE  从文件中都去过滤器信息
       FILTER := [ state TCP-STATE ] [ EXPRESSION ]

实例

ss -t -a    # 显示TCP连接
ss -s       # 显示 Sockets 摘要
ss -l       # 列出所有打开的网络连接端口
ss -pl      # 查看进程使用的socket
ss -lp | grep 3306  # 找出打开套接字/端口应用程序
ss -u -a    显示所有UDP Sockets
ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有状态为established的SMTP连接
ss -o state established '( dport = :http or sport = :http )' # 显示所有状态为Established的HTTP连接
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24  # 列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字

# ss 和 netstat 效率对比
time netstat -at
time ss

# 匹配远程地址和端口号
# ss dst ADDRESS_PATTERN
ss dst 192.168.1.5
ss dst 192.168.119.113:http
ss dst 192.168.119.113:smtp
ss dst 192.168.119.113:443

# 匹配本地地址和端口号
# ss src ADDRESS_PATTERN
ss src 192.168.119.103
ss src 192.168.119.103:http
ss src 192.168.119.103:80
ss src 192.168.119.103:smtp
ss src 192.168.119.103:25

将本地或者远程端口和一个数比较

# ss dport OP PORT 远程端口和一个数比较;
# ss sport OP PORT 本地端口和一个数比较
# OP 可以代表以下任意一个:
# <= or le : 小于或等于端口号
# >= or ge : 大于或等于端口号
# == or eq : 等于端口号
# != or ne : 不等于端口号
# < or gt : 小于端口号
# > or lt : 大于端口号
ss  sport = :http
ss  dport = :http
ss  dport \> :1024
ss  sport \> :1024
ss sport \< :32000
ss  sport eq :22
ss  dport != :22
ss  state connected sport = :http
ss \( sport = :http or sport = :https \)
ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24

用TCP 状态过滤Sockets

ss -4 state closing
# ss -4 state FILTER-NAME-HERE
# ss -6 state FILTER-NAME-HERE
# FILTER-NAME-HERE 可以代表以下任何一个:
# established、 syn-sent、 syn-recv、 fin-wait-1、 fin-wait-2、 time-wait、 closed、 close-wait、 last-ack、 listen、 closing、
# all : 所有以上状态
# connected : 除了listen and closed的所有状态
# synchronized :所有已连接的状态除了syn-sent
# bucket : 显示状态为maintained as minisockets,如:time-wait和syn-recv.
# big : 和bucket相反.

列出所有端口为 22(ssh)的连接

[root@localhost ~]# ss state all sport = :ssh
Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port
tcp   LISTEN     0      128                    *:ssh                                  *:*
tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540
tcp   LISTEN     0      128                   :::ssh                                 :::*

查看TCP的连接状态

[root@localhost ~]# ss  -tan|awk 'NR>1{++S[$1]}END{for (a in S) print a,S[a]}'
LISTEN 7
ESTAB 31
TIME-WAIT 28

ss命令和netstat命令比较

ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。原因如下:


1)当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。


2)而ss快的秘诀在于它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢(但仍然比 netstat要快)。

为了验证ss比netstat更快更高效,可以如下做几个实验看看效果:

如果没有ss命令,可以如下安装:
[root@wang ~]# yum install iproute iproute-doc

当服务器维持30000个socket连接时,使用netstat和ss命令统计连接数的耗时情况如下:
[root@wang ~]# netstat -at | wc -l     //耗时15.60秒
[root@wang ~]# ss -atr | wc -l          //耗时5.40秒(未利用tcp_diag)
[root@wang ~]# ss -atr | wc -l         //耗时0.47秒(利用tcp_diag)

--------------------------连接状态------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CLOSED         初始(无连接)状态。
LISTEN         侦听状态,等待远程机器的连接请求。
SYN_SEND       在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV       在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED    完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1     在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2     在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT      在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING        在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT     在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK       在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
 
主动连接端可能的状态有:    CLOSED        SYN_SEND        ESTABLISHED
主动关闭端可能的状态有:    FIN_WAIT_1    FIN_WAIT_2      TIME_WAIT
被动连接端可能的状态有:    LISTEN        SYN_RECV        ESTABLISHED
被动关闭端可能的状态有:    CLOSE_WAIT    LAST_ACK        CLOSED
 
查看tomcat的并发数:netstat -an|grep 10050|awk '{count[$6]++} END{for (i in count) print(i,count[i])}'

附录:

1. netstat属于net-tools工具集,ss属于ipoute工具集。替换方案如下:

在这里插入图片描述

2. netstat 用法:

与 netstat 命令一起使用的常见命令行选项有:

-l, –listening 显示监听服务器套接字
-a, –all 显示所有套接字(默认:已连接)
-r, –route 显示路由表
–i, –interfaces 显示接口表
-g, –groups 显示组播组成员资格
-s, –statistics 显示网络统计信息(如 SNMP)
-M, –masquerade 显示伪装的连接
-v, –verbose 详细
-W, –wide 不截断 IP 地址
-n, –numeric 不解析名称< br>-e, –extend 显示其他/更多信息
-p, –programs 显示套接字的 PID/程序名称
-o, –timers 显示计时器
-F, –fib 显示转发信息库(默认)
-C, –cache 显示路由缓存而不是FIB

用法示例:

显示所有套接字(默认:已连接)

要获取系统上不同协议的所有活动连接的列表,请运行:

$ netstat -a

列出所有 UDP 端口

$ netstat -au

列出所有 TCP 端口:

$ netstat -at

列出所有监听端口:

$ netstat -l

列出所有侦听 TCP 端口:

$ netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State 
tcp 0 0 0.0.0.0:nfs 0.0.0.0:* LISTEN 
tcp 0 0 localhost.localdo:18083 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:37959 0.0.0.0:* LISTEN 
tcp 0 0 localhost.locald:mshvlm 0.0.0.0:* LISTEN 

列出所有监听的udp端口:

要列出侦听 udp 端口,请使用选项-lu

$ netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State 
udp 0 0 0.0.0.0:52179 0.0.0.0:* 
udp 0 0 0.0.0.0:mountd 0.0.0.0:* 
udp 0 0 dev.jmtai.com:bootpc 0.0.0.0:* 
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:* 
 ....

显示内核路由表

选项-r用于查看内核路由表。

$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default _gateway 0.0.0.0 UG 0 0 0 tun0
default _gateway 0.0.0.0 UG 0 0 0 wlp1s0
10.10.46.0 _gateway 255.255.255.0 UG 0 0 0 tun0
10.20.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0

查看哪个进程正在侦听特定端口:

格式为:netstat -pln | grep <端口> | awk ‘{print $NF}’。作为查看哪个进程正在侦听端口 22 的示例:

$ sudo netstat -pln | grep 22 | awk '{print $NF}'
7885/sshd

要确认这一点,请通过 ps 命令进行检查。

$ ps aux | grep 7885
root 7885 0.0 0.0 40692 5452 ? Ss 18:54 0:00 /usr/bin/sshd -D

仅显示 IPv4 侦听端口(TCP 和 UDP)

默认情况下,Netstat 会提供 IPv4 和 IPv6 侦听端口列表。要获取仅包含 IPv4 的列表,请使用:

$ sudo netstat -vutlnp --listening -4
Active Internet connections (only servers)
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 7885/sshd 
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - 
tcp 0 0 127.0.0.1:18083 0.0.0.0:* LISTEN 429/vboxwebsrv 
tcp 0 0 0.0.0.0:37959 0.0.0.0:* LISTEN - 
tcp 0 0 127.0.0.1:6600 0.0.0.0:* LISTEN 678/mpd 
tcp 0 0 0.0.0.0:49743 0.0.0.0:* LISTEN 422/rpc.statd 
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init 
...

显示所有接口的网络统计信息

可以使用命令选项-s查看界面统计信息。

sudo netstat -s

要显示 tcp 统计信息,请使用 -st, 要显示 udp 统计信息,请使用 -su

显示 IPv4 和 IPv6 的多播组成员身份

组播是组通信,其中数据传输同时发送到一组目标计算机。要获取多播组成员身份,请使用选项-g

$ sudo netstat -g
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
lo 1 all-systems.mcast.net
wlp1s0 1 224.0.0.251
wlp1s0 1 all-systems.mcast.net
tun0 1 224.0.0.251
tun0 1 all-systems.mcast.net
lo 1 ff02::1
lo 1 ff01::1
wlp1s0 1 ff02::fb
wlp1s0 1 ff02::1:ff48:91f8
wlp1s0 1 ff02::1
wlp1s0 1 ff01::1
tun0 1 ff02::fb
tun0 1 ff02::1
tun0 1 ff01::1

列出所有正在侦听的 UNIX 端口

$ sudo netstat -lx
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 21766 /tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 276493 /run/user/1000/pulse/cli
unix 2 [ ACC ] STREAM LISTENING 21789 /run/user/1000/i3/ipc-socket.644
unix 2 [ ACC ] STREAM LISTENING 49182 /tmp/qtsingleapp-HipCha-9b70-3e8
unix 2 [ ACC ] STREAM LISTENING 21765 @/tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 18468 /run/gssproxy.sock
unix 2 [ ACC ] STREAM LISTENING 2609 /run/systemd/private
unix 2 [ ACC ] STREAM LISTENING 2620 /run/rpcbind.sock
...

查找正在运行的进程使用的端口

$ sudo netstat -ap | grep ssh
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 7885/sshd 
tcp6 0 0 [::]:ssh [::]:* LISTEN 7885/sshd

在可能的情况下显示 IP 地址的域名:

netstat -ltF

此命令将列出侦听 tcp 端口,但在输出中显示域名。

以连续模式显示输出

使用 –c  选项可以通过每五秒刷新一次来连续显示输出。

netstat -ac 5