ss即socket state,也就是說,是可以查看系統中socket的狀態的。我們可以用netstat,但為什么還要用ss這個工具呢,當然ss也是有好處的。當我們打開的socket數量很多時,netstat就會變得慢了。
我們先來看看ss的使用格式:
[root@redhat ~]# ss ? ss: bison bellows (while parsing filter): "syntax error!" Sorry. Usage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTER ] -h, --help this message -V, --version output version information -n, --numeric don't resolve service names -r, --resolve resolve host names -a, --all display all sockets -l, --listening display listening sockets -o, --options show timer information -e, --extended show detailed socket information -m, --memory show socket memory usage -p, --processes show process using socket -i, --info show internal TCP information -s, --summary show socket usage summary -4, --ipv4 display only IP version 4 sockets -6, --ipv6 display only IP version 6 sockets -0, --packet display PACKET sockets -t, --tcp display only TCP sockets -u, --udp display only UDP sockets -d, --dccp display only DCCP sockets -w, --raw display only RAW sockets -x, --unix display only Unix domain sockets -f, --family=FAMILY display sockets of type FAMILY -A, --query=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -F, --filter=FILE read filter information from FILE FILTER := [ state TCP-STATE ] [ EXPRESSION ] [root@redhat ~]#
ss的強大之處,大於可以設定過濾條件,我們可以根據socket的狀態來進行過濾,也可通過端口與ip地址進行過濾。也就是我們在命令格式里面看到的STATE-FILTER與ADDRESS-FILTER。
首先看看STATE-FILTER,STATE-FILTER可用的過濾條件有:
1. 所有的TCP狀態,包含:established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, close-wait, last-ack, listen and closing.
2. all,包含所有的狀態。
3. connected,除了listen與closed的所有其它狀態。
4. synchronized,除了syn-sent的所有connected的狀態。
5. bucket
6. big
使用時,如:
$ ss state connected再看看ADDRESS-FILTER,ADDRESS-FILTER用於過濾端口與地址。而且可以進行表達式組合。可用的子表達式有:
1. dst ADDRESS_PATTERN
2. src ADDRESS_PATTERN
3. dport RELOP PORT
4. sport RELOP PORT
5. autobound
其中ADDRESS_PATTERN為ip地址與端口匹配,ip:port,可以用*代替。RELOP為<= >=或==。
如:
[root@redhat ~]# ss dst 169.254.7.1 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45831 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45827 ESTAB 0 0 169.254.6.1:36202 169.254.7.1:37520 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45832 ESTAB 0 0 169.254.0.1:11001 169.254.7.1:39425 ESTAB 0 0 169.254.0.1:11003 169.254.7.1:57108 ESTAB 0 0 169.254.0.1:7331 169.254.7.1:55076 ESTAB 0 0 169.254.0.1:11002 169.254.7.1:60527 ESTAB 0 0 169.254.6.1:57477 169.254.7.1:7331 ESTAB 0 0 169.254.0.1:shell 169.254.7.1:54370 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45812 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45813 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45810 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45811 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45808 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45816 ESTAB 0 0 169.254.0.1:4565 169.254.7.1:45806 [root@redhat ~]#
多個子表達式之間可以組合,當然跟tcpdump一樣,可以用or and not來組合。但括號要用轉義符號表示。
如:
[root@redhat ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 193.233.7/24
看看幾個例子:
查看系統總體信息:
[root@redhat ~]# ss -s Total: 160 (kernel 194) TCP: 48 (estab 31, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 49 Transport Total IP IPv6 * 194 - - RAW 0 0 0 UDP 5 5 0 TCP 48 48 0 INET 53 53 0 FRAG 0 0 0 [root@redhat ~]#
想看當前機器的11001端口被誰占用了:
[root@redhat ~]#ss -lp src :11001 Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 169.254.0.1:11001 *:* users:(("syslog-ng",21761,12)) [root@redhat ~]#
我們可以看到,是一個叫syslog-ng的進程,進程id是21761。