ss - socket statistics
ss 명령어는 deprecated 된 netstat 명령어를 대체하는 명령어입니다. netstat 보다 많은 정보를 출력할 수 있으며 더 빠릅니다. netstat 명령어가 정보를 수집하기 위해 다양한 /proc 파일들을 읽는데 이러한 방식은 표시할 연결이 많을 경우 속도를 느리게 만듭니다. 이와 달리 ss 명령어는 정보를 커널 스페이스에서 직접 가져옵니다. ss 명령어에 사용하는 옵션은 netstat과 매우 비슷하기 때문에 쉽게 대체 사용이 가능합니다.
1. 모든 연결 출력
$ ss | less
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 * 15545 * 15544
u_str ESTAB 0 0 * 12240 * 12241
u_str ESTAB 0 0 @/tmp/dbus-2hQdRvvg49 12726 * 12159
u_str ESTAB 0 0 * 11808 * 11256
u_str ESTAB 0 0 * 15204 * 15205
.....
2. TCP, UDP, UNIX 연결 필터링
TCP는 t, UDP는 u, UNIX는 x 옵션 사용
$ ss -t 또는 ss -A tcp기본적으로 t 옵션은 "established"나 "CONNECTED" 상태인 연결만 출력합니다. 즉, "LISTENING" 상태인 것들은 출력하지 않습니다. 그것들까지 출력하려면 -a 옵션을 t 옵션과 함께 사용하면 됩니다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.2:43839 108.160.162.37:http
ESTAB 0 0 192.168.1.2:43622 199.59.149.201:https
ESTAB 0 0 192.168.1.2:33141 83.170.73.249:ircd
ESTAB 0 0 192.168.1.2:54028 74.125.135.125:xmpp-client
$ ss -ua 또는 ss -a -A udpa 옵션은 "CONNECTED"와 "LISTENING" 상태의 소켓을 출력합니다. UDP는 연결이 없는 프로토콜이기 때문에 대부분의 경우 "ss -u" 명령어로는 아무 내용도 출력되지 않으므로 모든 UDP 연결을 출력하려면 a 옵션을 사용해야 합니다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 192.168.1.2:48268 *:*
UNCONN 0 0 192.168.1.2:56575 *:*
UNCONN 0 0 *:40309 *:*
UNCONN 0 0 192.168.1.2:56879 *:*
UNCONN 0 0 *:49014 *:*
UNCONN 0 0 192.168.1.2:53124 *:*
UNCONN 0 0 127.0.1.1:domain *:*
3. 호스트네임 해석 방지
빠른 출력을 위해 n 옵션을 사용하여 IP 주소를 호스트네임으로 해석하는 것을 막을 수 있습니다. 다만 포트 번호도 해석하지 않게 됩니다.
$ ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80
ESTAB 0 0 192.168.1.2:51350 74.125.200.84:443
ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667
ESTAB 0 0 192.168.1.2:54028 74.125.135.125:5222
ESTAB 0 0 192.168.1.2:48156 66.196.120.44:5050
4. LISTENING 소켓만 출력
$ ss -ltn위 명령어는 모든 "listening" "tcp" 연결을 출력합니다. n 옵션은 IP 주소를 호스트네임으로 번역하는 것을 막아 출력을 더 빠르게 해줍니다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 127.0.1.1:53 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 128 ::1:631 :::*
모든 listening udp 연결을 출력시키려면 t를 u로 바꿉니다.
$ ss -lun
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 127.0.1.1:53 *:*
UNCONN 0 0 *:68 *:*
UNCONN 0 0 192.168.1.2:123 *:*
UNCONN 0 0 127.0.0.1:123 *:*
UNCONN 0 0 *:123 *:*
UNCONN 0 0 *:5353 *:*
UNCONN 0 0 *:47799 *:*
UNCONN 0 0 *:25322 *:*
UNCONN 0 0 :::54310 :::*
.....
5. 프로세스 이름과 PID 출력
연결을 소유한 프로세스 이름/PID를 출력할 때는 p 옵션을 사용합니다.
$ ss -ltproot 권한으로 실행하면 더 많은 출력 결과가 나옵니다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 127.0.0.1:9050 *:*
LISTEN 0 128 *:90 *:*
LISTEN 0 128 *:db-lsp *:* users:(("dropbox",3566,32))
LISTEN 0 5 127.0.0.1:6600 *:*
LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0))
s -ltp
[sudo] password for enlightened:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",2051,12))
LISTEN 0 128 *:90 *:* users:(("nginx",1701,6),("nginx",1700,6),("nginx",1699,6),("nginx",1697,6),("nginx",1696,6))
LISTEN 0 5 127.0.0.1:6600 *:* users:(("mpd",2392,5))
LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0),("php5-fpm",1616,7))
LISTEN 0 16 *:2633 *:* users:(("oned",1853,16))
LISTEN 0 50 127.0.0.1:mysql *:* users:(("mysqld",1095,10))
LISTEN 0 5 127.0.1.1:domain *:* users:(("dnsmasq",1347,5))
LISTEN 0 32 *:ftp *:* users:(("vsftpd",1051,3))
LISTEN 0 128 *:ssh *:* users:(("sshd",1015,3))
LISTEN 0 128 127.0.0.1:ipp *:* users:(("cupsd",688,11))
LISTEN 0 128 :::http :::* users:(("apache2",5322,4),("apache2",5321,4),("apache2",5317,4),("apache2",5316,4),("apache2",5313,4),("apache2",2505,4))
LISTEN 0 128 :::ssh :::* users:(("sshd",1015,4))
LISTEN 0 128 ::1:ipp :::* users:(("cupsd",688,10))
6. 통계 현황 출력
$ ss -s
Total: 526 (kernel 0)
TCP: 10 (estab 7, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 0 - -
RAW 0 0 0
UDP 15 9 6
TCP 10 9 1
INET 25 18 7
FRAG 0 0 0
7. 연결 유지 시간 출력
$ ss -tn -o
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80
ESTAB 0 0 192.168.1.2:36335 204.144.140.26:80 timer:(keepalive,26sec,0)
ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667
ESTAB 0 0 192.168.1.2:58857 74.121.141.84:80 timer:(keepalive,23sec,0)
ESTAB 0 0 192.168.1.2:42794 173.194.40.239:80 timer:(keepalive,32sec,0)
8. IPv4 또는 IPv6 소켓 연결만 출력
IPv4 소켓 연결만 출력하려면 '-f inet' 옵션이나 '-4' 옵션을 사용한다.
$ ss -tl -f inetIPv6 연결만 출력하려면 '-f inet6' 옵션이나 '-6' 옵션을 사용한다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 127.0.0.1:9050 *:*
LISTEN 0 128 *:90 *:*
LISTEN 0 128 *:db-lsp *:*
LISTEN 0 5 127.0.0.1:6600 *:*
$ ss -tl6
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 ::1:smtp :::*
LISTEN 0 128 :::12865 :::*
LISTEN 0 128 :::http :::*
LISTEN 0 128 :::ssh :::*
LISTEN 0 128 ::1:ipp :::*
9. TCP 상태에 따른 필터링
특정 연결에 대해서만 출력시킬 수 있다. 필터 표현식은 모든 옵션 뒤에 나열해야 한다. 아래와 같은 형식으로 사용할 수 있다.
$ ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]"CONNECTED" 상태인 모든 IPv4 TCP 소켓을 출력하는 방법은 아래와 같다.
$ ss -t4 state established'TIME-WAIT' 상태인 소켓을 출력하는 방법은 아래와 같다.
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 192.168.1.2:54436 165.193.246.23:https
0 0 192.168.1.2:43386 173.194.72.125:xmpp-client
0 0 192.168.1.2:38355 199.59.150.46:https
0 0 192.168.1.2:56198 108.160.162.37:http
$ ss -t4 state time-wait상태는 아래와 같은 것들이 있다.
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 192.168.1.2:42261 199.59.150.39:https
0 0 127.0.0.1:43541 127.0.0.1:2633
1. establishedsyn-sent, syn-recv를 포함한 많은 상태들은 볼 일이 많지 않다. 그런 상태는 매우 짧은 시간 동안만 존재하기 때문이다. 그런 상태를 실시간으로 감지하려면 watch 명령어를 사용하는 것이 좋다.
2. syn-sent
3. syn-recv
4. fin-wait-1
5. fin-wait-2
6. time-wait
7. closed
8. close-wait
9. last-ack
10. closing
11. all - 위의 모든 상태 포함
12. connected - listen과 closed를 제외한 모든 상태
13. synchronized - syn-sent를 제외한 모든 connected 상태
14. bucket - 미니소켓으로 유지되고 있는 상태(예: time-wait과 syn-recv)
15. big - bucket과 정반대 상태
$ watch -n 1 "ss -t4 state syn-sent"위의 명령어를 실행한 후 브라우저에서 아무 웹사이트나 열어보거나 뭔가를 다운로드 하고 즉시 출력 결과를 살펴보면 짧은 시간 동안 아래처럼 특수한 상태를 확인할 수 있다.
Every 1.0s: ss -t4 state syn-sent Tue Apr 1 10:07:33 2014
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 1 192.168.1.2:55089 202.79.210.121:https
0 1 192.168.1.2:33733 203.84.220.80:https
0 1 192.168.1.2:36240 106.10.198.33:https
10. 주소와 포트 번호로 출력 걸러내기
출발지나 목적지 포트가 SSH인 모든 소켓 연결을 출력
$ ss -at '( dport = :ssh or sport = :ssh )'목적지 포트가 443이나 80인 소켓
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 :::ssh :::*
$ ss -nt '( dst :443 or dst :80 )'아래의 명령어로 위와 같은 효과를 얻을 수 있다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.2:58844 199.59.148.82:443
ESTAB 0 0 192.168.1.2:55320 165.193.246.23:443
ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80
ESTAB 0 0 192.168.1.2:54889 192.241.177.148:443
ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80
ESTAB 0 0 192.168.1.2:33440 38.127.167.38:443
$ ss -nt dst :443 or dst :80기타 예제
# 주소로 걸러내기포트는 dport와 sport 옵션을 통해서도 걸러낼 수 있다. 포트 번호 앞에는 ":"을 반드시 붙여야 한다.
$ ss -nt dst 74.125.236.178
# CIDR 표기법도 지원
$ ss -nt dst 74.125.236.178/16
# 주소와 포트 모두 이용
$ ss -nt dst 74.125.236.178:80
$ ss -nt dport = :80'ss -nt dst :80' 명령어로 위의 명령어와 같은 효과를 볼 수 있다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80
ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80
ESTAB 0 0 192.168.1.2:55043 74.125.236.178:80
아래는 필터링에 대한 다른 예제이다.
# 출발지 주소가 127.0.0.1이며 출발지 포트가 5000보다 큰 경우아래 연산자는 포트 번호를 비교할 때 사용할 수 있다.
$ ss -nt src 127.0.0.1 sport gt :5000
# 로컬 SMTP(25번 포트) 소켓
$ sudo ss -ntlp sport eq :smtp
# 포트 번호가 25보다 큰 경우
$ sudo ss -nt sport gt :1024
# 원격지의 포트가 100 미만인 경우
$ sudo ss -nt dport \< :100
# 원격지 포트 80번에 대한 연결
$ sudo ss -nt state connected dport = :80
<= or le : 포트 이하필터 문법에 대한 문서는 iproute2-doc 패키지(데비안/우분투 시스템 기준)에 있으며 /usr/share/doc/iproute2-doc/ss.html 파일에 ss 명령어의 필터 문법이 상세히 기록되어 있다.
>= or ge : 포트 이상
== or eq : 해당 포트
!= or ne : 해당 포트가 아닌 포트
< or gt : 포트 미만
> or lt : 포트 초과