노드 서버 모니터링을 위한 tcp6 커넥션파싱 

 

/proc/15610/net 

/proc/[node서버PID] /net  여러가지 파일이 있다. 

Tcp udp 현재 http request tcp6 나오기에 이걸 파싱 

 

16진수이다 

엔디언(Endianness)은 컴퓨터의 메모리 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며,바이트 배열하는 방법을 특히 바이트 순서(Byte order) 한다. 

엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-endian) 작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌  있으며 경우에 속하지 않거나 둘을 모두 지원하는 것을 미들 엔디언(Middle-endian)이라 부르기도 한다. 

 

엔디언이 리틀엔디언같다. 

sl  local_address                         remote_address                        st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode 

   0: 00000000000000000000000000000000:0050 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 13596 1 b2828000 100 0 0 10 0 

   1: 00000000000000000000000000000000:1F91 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 16602 1 b67f06c0 100 0 0 10 0 

   2: 00000000000000000000000000000000:0015 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000   111        0 79271 1 b2830000 100 0 0 10 0 

   3: 00000000000000000000000000000000:C8D5 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000   113        0 12155 1 b28086c0 100 0 0 10 0 

   4: 00000000000000000000000000000000:0016 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 12971 1 b67f0000 100 0 0 10 0 

   5: 00000000000000000000000000000000:0BB8 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 1087391 1 b282a880 100 0 0 10 0 

   6: 00000000000000000000000000000000:0BB9 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 1087390 1 b282e540 100 0 0 10 0 

   7: 00000000000000000000000000000000:01BB 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 13600 1 b28286c0 100 0 0 10 0 

   8: 0000000000000000FFFF00000400A8C0:0050 0000000000000000FFFF000075246A2ㅁㅁ7:2203 05 00000000:00000000 03:0000144A 00000000     0        0 0 3 9ed2eb80 

   9: 0000000000000000FFFF00000400A8C0:0015 0000000000000000FFFF0000646A8873:2291 01 00000000:00000000 02:0002795F 00000000   111        0 1054971 2 b282ca40 43 4 18 4 4 

  10: 0000000000000000FFFF00000400A8C0:0050 0000000000000000FFFF000075246A27:21BA 06 00000000:00000000 03:00001377 00000000     0        0 0 3 94498678 

  11: 0000000000000000FFFF00000400A8C0:0015 0000000000000000FFFF0000646A8873:22CE 01 00000000:00000000 02:0002884F 00000000   111        0 1052403 2 b282f2c0 57 4 31 3 2 

 

현재 필요한건 remote addr st이다. 

 

 0000000000000000FFFF0000646A8873:22CE  

이부분을 보게 되면 

 

FF FF 00 00 64 6A 88 73:22CE  

256 256  0 0 100 6 136 115:8910  

이렇게 볼수있고  리틀앤디언이니 

115.136.6.100:8910에서 커넥션했다고 할수있다 

 

St 경우엔 상태값을 나타내는데  값의 정의를 찾아보면 

 

cat /usr/include/netinet/tcp.h 

 

 

이렇게 되어있고  

 

enum 

{ 

  TCP_ESTABLISHED = 1, 

  TCP_SYN_SENT, 

  TCP_SYN_RECV, 

  TCP_FIN_WAIT1, 

  TCP_FIN_WAIT2, 

  TCP_TIME_WAIT, 

  TCP_CLOSE, 

  TCP_CLOSE_WAIT, 

  TCP_LAST_ACK, 

  TCP_LISTEN, 

  TCP_CLOSING   /* now a valid state */ 

}; 

 

 

뜻을보면 검색을해보니  

  

LISTEN: 요청을 받을 수 있도록 연결 요구를 기다리는 상태. 즉 포트가 열려있음을 의미. HTTP(80), MAIL(25), FTP(21), TELNET(23) 등. 

SYN_SENT: 로컬에서 원격으로 연결 요청(SYN 신호를 보냄)을 시도한 상태. 

SYN_RECV: 원격으로부터 연결 요청을 받은 상태. 요청을 받아 SYN+ACK 신호로 응답을 상태지만 ACK는 받지 못했다. 윈도우와 솔라리스에서는 SYN_RECEIVED로, FreeBSD는 SYN_RCVD로 표시한다. 

ESTABLISHED: 상호 연결이 된 상태. 

 

 

 

네트워크 관련되어선 핸드쉐이킹이니 아무것도 모르기때문에 뜻만보면 

FIN_WAIT1: 소켓이 닫히고 연결이 종료되고 있는 상태. 원격의 응답은 계속 받을 수 있다. 

FIN_WAIT2: 로컬이 원격으로부터 연결 종료 요구를 기다리는 상태. 

CLOSE_WAIT: 원격이 종료 요청을 받고 연결이 종료되기를 기다리는 상태. 원격으로 부터 FIN+ACK 신호를 받고 ACK 신호를 원격으로 보냈다. 

TIME_WAIT: 종료 준비가 끝났으나 원격의 수신 보장을 위해 기다리는 상태(Apache에서 KeepAlive를 OFF로 해둔 경우, Tomcat 서버를 쓰는 경우 등에서 이 상태를 자주 볼 수 있다.). 마지막으로 ACK를 보냈으나 바로 CLOSED 하지 않고 2 MSL(Maximum segment lifetime) 동안 이 상태를 유지한다. 그 이유는 아래에 자세히 설명. 

LAST_WAIT: 연결은 종료되었고 ACK를 기다리는 상태. 

CLOSED: 완전히 연결이 종료된 상태. 

 

 

 

으로 볼수있다. 

 

 

첨부터 상태값 모니터링 상태를 보여주기위한 지식도 필요해서 긁어왓따. 

 

TIME_WAIT 상태를 유지하는 이유 

TIME_WAIT가 필요한 이유는 2가지가 있다. 《Unix Network Programming》에서는 TIME_WAIT 상태가 있는 이유에 대해 다음과 같이 설명한다. 

  1. to implement TCP's full-duplex connection termination reliably, and 

  2. to allow old duplicate segments to expire in the network. 

 

첫 번째 이유는 원격의 종료까지 확인하여 신뢰성 있는 연결 종료를 위한 것이고, 두 번째 이유는 만료된 연결의 패킷 제거를 위해서인데, 종료한 소켓이 TIME_WAIT 상태에서 금방 사라지지 않는 이유가 두 번째 이유 때문이다. 이런 상황을 가정할 수 있다. 둘이 패킷을 주고 받다가 정상적으로 연결을 끊었다. 그리고 둘이 곧바로 연결을 해서 방금 전과 같은 포트로 연결되었다. 여기서 문제가 발생하는데 이전에 연결이 되었을 때 보낸 패킷이 라우터의 일시적인 오류로 네트워크를 뱅뱅 돌다가 다시 새로운 연결이 되었을 때 도착할 수 있다. 즉, 모든 패킷 순서를 엄격히 보장하는 TCP에서 원하지 않는 데이터가 수신되었으니 네트워크 오류가 발생할 수 있다. 이 때 TIME_WAIT 상태를 유지하면 같은 포트를 다른 프로세스가 다시 이용하는 것을 막는다. 같은 연결이 발생하지 못하도록 방지한다. 그리고 TIME_WAIT 상태는 2 MLS 시간 동안 유지한다. 즉, 네트워크에 패킷이 존재하는 시간보다 두 배 길게 설정된다. 따라서 TIME_WAIT 상태가 끝나면 네트워크 상에는 이전 연결에 보내졌던 패킷이 모두 소멸되었다고 확신할 수 있으므로 새로운 연결을 만들어도 문제가 발생하지 않을 것이다. 

 

* TIME_WAIT로 인해 부하가 걸리지는 않는다. 실제로 웹 서버를 운영하면 TIME_WAIT 상태가 수십, 수백 개 생기기도 한다. 수십 개 정도는 일반적인 수준이다. 

* SYN_RECV 상태가 너무 많다면 문제가 생길 수는 있다(DOS 공격을 받고 있을 수 있다.). 

 

 

 

 


'오락기 > Linux' 카테고리의 다른 글

모니터링 메모리 파싱  (0) 2018.08.17
모니터링 cpu 사용량  (0) 2018.08.17
Centos7 svn 셋팅  (0) 2017.06.21
Centos7 oracle 설치 셋팅  (0) 2017.06.21
centos 7 에 jdk 와 tomcat 설치  (0) 2017.06.14

+ Recent posts