검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/네트워크와 보안
참조 원문: 10 examples of Linux ss command to monitor network connections

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
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
  기본적으로 t 옵션은 "established"나 "CONNECTED" 상태인 연결만 출력합니다. 즉, "LISTENING" 상태인 것들은 출력하지 않습니다. 그것들까지 출력하려면 -a 옵션을 t 옵션과 함께 사용하면 됩니다.
$ ss -ua 또는 ss -a -A udp
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                 *:*
  a 옵션은 "CONNECTED"와 "LISTENING" 상태의 소켓을 출력합니다. UDP는 연결이 없는 프로토콜이기 때문에 대부분의 경우 "ss -u" 명령어로는 아무 내용도 출력되지 않으므로 모든 UDP 연결을 출력하려면 a 옵션을 사용해야 합니다.

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
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" "tcp" 연결을 출력합니다. n 옵션은 IP 주소를 호스트네임으로 번역하는 것을 막아 출력을 더 빠르게 해줍니다.

  모든 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 -ltp
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))
  root 권한으로 실행하면 더 많은 출력 결과가 나옵니다.
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 inet
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                   *:*
  IPv6 연결만 출력하려면 '-f inet6' 옵션이나 '-6' 옵션을 사용한다.
$ 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
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
  'TIME-WAIT' 상태인 소켓을 출력하는 방법은 아래와 같다.
$ 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. established
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과 정반대 상태
  syn-sent, syn-recv를 포함한 많은 상태들은 볼 일이 많지 않다. 그런 상태는 매우 짧은 시간 동안만 존재하기 때문이다. 그런 상태를 실시간으로 감지하려면 watch 명령어를 사용하는 것이 좋다.
$ 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 )'
State      Recv-Q Send-Q    Local Address:Port        Peer Address:Port  
LISTEN     0      128                   *:ssh                    *:*      
LISTEN     0      128                  :::ssh                   :::*
  목적지 포트가 443이나 80인 소켓
$ 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
  기타 예제
# 주소로 걸러내기
$ ss -nt dst 74.125.236.178

# CIDR 표기법도 지원
$ ss -nt dst 74.125.236.178/16

# 주소와 포트 모두 이용
$ ss -nt dst 74.125.236.178:80
  포트는 dport와 sport 옵션을 통해서도 걸러낼 수 있다. 포트 번호 앞에는 ":"을 반드시 붙여야 한다.
$ ss -nt dport = :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
  'ss -nt dst :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 : 포트 이하
>= or ge : 포트 이상
== or eq : 해당 포트
!= or ne : 해당 포트가 아닌 포트
< or gt : 포트 미만
> or lt : 포트 초과
  필터 문법에 대한 문서는 iproute2-doc 패키지(데비안/우분투 시스템 기준)에 있으며 /usr/share/doc/iproute2-doc/ss.html 파일에 ss 명령어의 필터 문법이 상세히 기록되어 있다.


2014/10/21 15:45 2014/10/21 15:45