ss命令
ss(Socket Statistics)命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。
ss的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比netstat 更快。当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢。ss 命令利用到了 TCP 协议栈中 tcp_diag,tcp_diag 是一个用于分析统计的模块,可以获得 Linux 内核中第一手的信息,因此 ss 命令的性能会好很多。
语法
ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]
# FILTER选项
FILTER := [ state STATE-FILTER ] [ EXPRESSION ]
STATE-FILTER := {TCP-STATES|all|connected|synchronized|bucket|big}
#STATE-FILTER 各项可选值
TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listening|closing}
connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
bucket := {syn-recv|time-wait}
big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listening|closing}
#EXPRESSION可选值
[dst|src|dport|sport]
常用选项:
- -t, –tcp 显示 TCP 协议的 sockets
- -u, –udp 显示 UDP 协议的 sockets
- -x, –unix 显示 unix domain sockets,与 -f 选项相同
- -n, –numeric 不解析服务的名称(默认不解析),如 “22” 端口不会显示成 “ssh”
- -r, –resolve 把 IP 解释为域名,把端口号解释为协议名称
- -l, –listening 只显示处于监听状态的端口
- -p, –processes 显示监听端口的进程(Ubuntu 上需要 sudo)
- -a, –all 显示所有连接
- -4, --ipv4 只显示IPv4的连接
- -6, --ipv6 只显示IPv6的连接
FILTER说明:
STATE-FILTER:
- TCP-STATES tcp各状态,
- connected,synchronized,bucket,bucket,big 是TCP-STATES的部分状态的组合
EXPRESSION:
- dst 目标主机IP
- src 本地IP
- dport 目标主机端口
- sport 本地端口
示例:
$ ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.16.200.90:45906 10.16.200.90:22122
ESTAB 0 0 127.0.0.1:32001 127.0.0.1:31001
ESTAB 0 0 127.0.0.1:58627 127.0.0.1:epmd
ESTAB 0 0 10.16.200.90:22122 10.16.200.90:45906
SYN-SENT 0 1 10.16.200.90:37602 10.18.200.91:microsan
ESTAB 0 0 ::ffff:10.16.200.90:mysql ::ffff:10.16.7.179:56881
......
查tcp协议, -a对TCP协议来说,既包含监听的端口,也包含建立的连接
$ ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22122 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 *:23000 *:*
LISTEN 0 128 *:15672 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 1 127.0.0.1:32001 *:*
LISTEN 0 128 *:25672 *:*
ESTAB 0 0 10.16.200.90:45906 10.16.200.90:22122
TIME-WAIT 0 0 10.16.200.90:51780 10.16.200.90:22122
ESTAB 0 0 127.0.0.1:32001 127.0.0.1:31001
TIME-WAIT 0 0 10.16.200.90:51758 10.16.200.90:22122
ESTAB 0 0 127.0.0.1:58627 127.0.0.1:4369
ESTAB 0 0 10.16.200.90:22122 10.16.200.90:45906
ESTAB 0 0 10.16.200.90:23000 10.16.200.97:36808
TIME-WAIT 0 0 10.16.200.90:51810 10.16.200.90:22122
......
也可结合grep命令输出过滤结果,如: sudo ss -tlp | grep ssh
dst/src dport/sport 过滤
可以通过 dst/src/dport/sprot 语法来过滤连接的来源和目标的地址或端口
匹配本地地址和端口号,示例:
$ ss src 10.16.200.6
$ ss src 10.16.200.6:http
$ ss src 10.16.200.6:80
匹配远程地址和端口号,示例:
$ ss dst 10.16.200.90
$ ss dst 10.16.200.90:443
$ ss dst 10.16.200.90:http
端口号的过滤可以使用一些比较符,语法如下:
ss [sport | dport] [OP] port
OP表示比较符,如下表:
符号 | 实体符 | 比较运算 |
---|---|---|
<= | le | 小于等于 |
< | lt | 小于 |
>= | ge | 大于等于 |
> | gt | 大于 |
!= | ne | 不等于 |
如果使用>,<原始符号需要使用\转义, 如>
查看本地端口大于3306的tcp连接:
$ ss -tln sport gt 3306
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22122 *:*
LISTEN 0 128 *:8880 *:*
LISTEN 0 128 *:4369 *:*
LISTEN 0 128 *:63796 *:*
LISTEN 0 128 *:23000 *:*
LISTEN 0 128 *:15672 *:*
LISTEN 0 1 127.0.0.1:32001 *:*
LISTEN 0 128 *:25672 *:*
LISTEN 0 128 :::9998 :::*
LISTEN 0 128 :::8080 :::*
LISTEN 0 50 :::20880 :::*
LISTEN 0 128 :::8081 :::*
LISTEN 0 128 :::4369 :::*
LISTEN 0 1 ::ffff:127.0.0.1:5010 :::*
状态过滤 语法:
ss [ OPTIONS ] [ state FILTER ]
示例:
# 列出IPv4状态为connected选项包含的状态值的连接
$ ss -4 state connected
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 10.16.200.90:45906 10.16.200.90:22122
tcp TIME-WAIT 0 0 10.16.200.90:59038 10.16.200.90:22122
tcp TIME-WAIT 0 0 10.16.200.90:epmd 10.16.200.90:37635
tcp SYN-SENT 0 1 10.16.200.90:49214 10.18.200.91:dnp
tcp TIME-WAIT 0 0 10.16.200.90:58978 10.16.200.90:22122
tcp ESTAB 0 0 127.0.0.1:32001 127.0.0.1:31001
tcp ESTAB 0 0 127.0.0.1:58627 127.0.0.1:epmd
...
# 列出IPv4状态为connected选项包含的状态值的且端口大于22122的连接
$ ss -4n state connected sport ge 22122
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp TIME-WAIT 0 0 10.16.200.90:59666 10.16.200.90:22122
tcp ESTAB 0 0 10.16.200.90:45906 10.16.200.90:22122
tcp ESTAB 0 0 127.0.0.1:32001 127.0.0.1:31001
tcp ESTAB 0 0 127.0.0.1:58627 127.0.0.1:4369
tcp ESTAB 0 0 10.16.200.90:22122 10.16.200.90:45906
tcp ESTAB 0 0 10.16.200.90:23000 10.16.200.97:36808
tcp TIME-WAIT 0 0 10.16.200.90:59748 10.16.200.90:22122
tcp TIME-WAIT 0 0 10.16.200.90:59786 10.16.200.90:22122
...