Dev/기타

TCP 기본 연결, 종료 과정

newtype 2006. 8. 18. 16:53

netstat의 State 필드에 표시되는 TCP 상태표시가 갖는 의미를 알아봅시다.
RFC 793 문서에 있는 TCP 기본 연결, 종료 과정을 보면 이해가 더 빠를 거라 생각한다.
 
-----------------------------------------------------------
# netstat -atn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address    State
... 생략 ...
tcp    0   0 0.0.0.0:25       0.0.0.0:*       LISTEN   <-- 포트가 열렸음
tcp    0   0 192.168.123.10:32799  207.46.106.141:1863  ESTABLISHED <-- 서로 연결중
tcp    0   0 192.168.123.10:32794  218.xxx.xx.xx:22   ESTABLISHED
tcp    0   0 192.168.123.10:32802  207.46.108.46:1863  CLOSE_WAIT <-- 종료 대기중
tcp    0   0 192.168.123.10:33244  211.xxx.xx.x:80    ESTABLISHED
... 생략 ...
-----------------------------------------------------------
 
1) TCP 연결관련 상태
 
* RFC 793문서에 나온 기본적인 TCP 연결 과정

   TCP A                           TCP B

 1. CLOSED                           LISTEN
 2. SYN-SENT  --> < SEQ=100>< CTL=SYN>          --> SYN-RECEIVED
 3. ESTABLISHED <-- < SEQ=300>< ACK=101>< CTL=SYN,ACK>   <-- SYN-RECEIVED
 4. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>     --> ESTABLISHED
 5. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>< DATA> --> ESTABLISHED

LISTEN   : 데몬이 요청을 발을 수 있도록 연결 요구를 기다리는 상태.
            즉, 포트가 열려있음을 의미. http(80), mail(25), ftp(21), telnet(23) 등 위에서 포트 25(mail)이 메일을 받을 수 있도록 열려 있는 상태.
            윈도우즈에서는 LISTENING으로 표시
SYN_SENT  : 로컬에서 원격으로 연결 요청(SYN 신호를 보냄)을 시도한 상태
SYN_RECV  : 원격으로 부터 연결 요청을 받은 상태.
            요청을 받아 SYN+ACK 신호로 응답은 한 상태이지만 ACK는 받지 못했다.
           netstat로 확인할 때 SYN_RECV가 상당히 많다면 TCP SYN 플러딩(Flooding) 공격일 가능성이 있다.
           윈도우즈와 솔라리스에서는 SYN_RECEIVED으로, FreeBSD는 SYN_RCVD으로 표시
ESTABLISHED : 서로 연결이 되어 있는 상태
            위에서 192.168.123.10의 포트 32794과 218.xxx.xx.xx의 포트 22(ssh)이 서로 연결되어 있는 상태

2) TCP 종료관련 상태

* 정상적인 연결 종료 과정

   TCP A                          TCP B

 1. ESTABLISHED                       ESTABLISHED
 2. (Close)
   FIN-WAIT-1 --> < SEQ=100>< ACK=300>< CTL=FIN,ACK> --> CLOSE-WAIT
 3. FIN-WAIT-2 <-- < SEQ=300>< ACK=101>< CTL=ACK>   <-- CLOSE-WAIT
 4.                             (Close)
   TIME-WAIT  <-- < SEQ=300>< ACK=101>< CTL=FIN,ACK> <-- LAST-ACK
 5. TIME-WAIT  --> < SEQ=101>< ACK=301>< CTL=ACK>   --> CLOSED
 6. (2 MSL)
   CLOSED                           

FIN_WAIT1  : 소켓이 닫히고 연결이 종료되고 있는 상태. 원격의 응답은 받을 수 있다.
            솔라리스에서는 FIN_WAIT_1로 표시
FIN_WAIT2  : 로컬이 원격으로 부터 연결 종료 요구를 기다리는 상태.
           솔라리스에서는 FIN_WAIT_2로 표시
CLOSE_WAIT : 원격의 연결 요청을 받고 연결이 종료되기를 기다리는 상태.
            원격으로 부터 FIN+ACK 신호를 받고 ACK 신호를 원격에 보냈다.
TIME_WAIT  : 연결은 종료되었으나 원격의 수신 보장을 위해 기다리고 있는 상태.
           이 상태를 특히 자주 보게되는 Apache에서 KeepAlive를 OFF로 해둔 경우,  Tomcat 서버를 쓰는 경우 등
LAST_ACK  : 연결은 종료되었고 승인을 기다리는 상태
CLOSED   : 완전히 연결이 종료된 상태

※ 위의 FIN_WAIT1, FIN_WAIT2, CLOSE_WAIT 3개 상태는 연결 종료를 위해 서로간에 신호를 주고받는 과정에 나타나는 상태로 이해하면 된다.
  종료 요청을 한 곳에서는 FIN_WAIT1, FIN_WAIT2, TIME_WAIT 상태가 종료 요청을 받는 곳에서는 CLOSE_WAIT, LAST_ACK 상태가 표시된다.

3) 기타

CLOSING   : 연결은 종료되었으나 전송도중 데이타가 분실된 상태
UNKNOWN   : 소켓의 상태를 알 수 없음

솔라리스의 netstat 명령에서는 다음 2개의 상태를 더 표시한다.

IDLE    : 소켓이 열렸지만 binding 되지 않은 상태
BOUND    : listen이나 연결을 위한 준비 상태

※ 참고 문서 
- netstat 맨페이지(linux, solaris)
- RFC 793 ( http://www.ietf.org/rfc/rfc0793.txt )

출처 : 커피닉스( http://coffeenix.net/ )
작성 : 좋은진호
출처 : http://sinilyu.linuxstudy.pe.kr/qaboard/QaBoardContentProcess.php3?page=6&no=780&s_name=&s_value=




자신의 컴퓨터와 연결되었거나 연결될 목록을 프로토콜과 함께 보여주는 명령어

유닉스나 윈도우에는 사용자 컴퓨터의 네트워크의 상태를 알려주는 netstat라는 명령어가 있다. 즉 어떤 포트가 열려 있고 어떻게  사용되고 있는지 모두 알 수가 있고 이 명령어를 잘 활용하면 맨손으로도 해킹을 감지해 낼 수 있습니다. 그러나 사용자의 대부분은  netstat란 명령어를 모르고 있는것 같아 이번에는 netstat명령어의 사용법을 익힘으로써 다른 소프트웨어 도움을 받지 않고  해킹을 감지해 내는 능력을 길러봅니다.

1. netstat로 알아보는 내 컴퓨터의 포트상태
c:>netstat
Proto    Local Address    Foreign Address    State
TCP     acy7807:1023       211.233.45.89:80     ESTABLISHED

- Proto : 현재 사용한 프로토콜
- Local Address : 현재 열려 있는 사용자 컴퓨터의 IP/호스트 네임과 사용중인 포트
- Foreign Address : 현재 사용자의 컴퓨터에 접속되어 있는 IP/호스트 네임과 사용중인 포트
- State : 연결 상태를 나타내는 것
  - ESTABLISHED : 현재 연결되어 있다는 뜻
  - LISTENING : 연결을 위하여 접속을 기다리는 상태
  - TIME_WAIT : 이미 해당 사이트와 연결이 종료되었거나 다음 연결을 위해 기다리는 상태
  - SYN_SENT : 접속하기 위해 패킷을 보냈다는 뜻



2. netstat옵션 배우기
c:>netstat ?

netstat -a : 연결된 혹은 연결을 기다리고 있는 모든 포트를 보여줍니다. -a 옵션이 없으면 연결된 목록만 보여주는데, -a 옵션을 주면 연결되었거나 연결을 기다리는 목록을 모두 보여줍니다.

netstat -n : 통상 연결 목록이 컴퓨터 이름이 나오는데, -n 옵션을 주면 컴퓨터 이름 대신 ip 주소가 뜹니다.

netstats -an or -na : 컴퓨터와 연결되었던 혹은 연결을 기다리는 목록을 ip 주소로 바꾸어서 보여줍니다.

이제 netstat 명령을 알았으니 가끔씩 실행시켜주면 됩니다. netstat 명령으로 검색했을 때 알 수 없는 포트가 있거나,  포트중에 31337, 12345, 54321과 같이 트로이 목마가 사용하는 포트가 하나 열려 있거나 열려진 포트로 특정 IP가 접 속해 있다면 이는 십중팔구 해킹인 것입니다.


///// 응용 /////
#netstat -nap (열려 있는 모든 포트)
#netstat -l 또는 netstat -nap | grep LISTEN (LISTEN 되는 모든 포트)
#netstat -nap | grep ESTABLISHED | wc -l ( 모든 서비스 동시 접속자 수)
#netstat -nap | grep :80 | grep ESTABLISHED | wc -l ( 웹 동시 접속자 수)
반응형