본문 바로가기
  • Vetheuil in Summer
Tech/TCP IP

TCP DUMP

by 눈꽃산행 2020. 3. 26.

 Tcpdump
컴퓨터 네트워크상에 트래픽을 듣고 감시하는 네트워크 모니터링 응용프로그램으로 가장 오래된 패킷 모니터링 도구이며 전문가들에게 널리 사용되고 있는 네트워크 모니터링 도구이다.


● 사용법
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
          [ -c count ] [ -C file_size ]
          [ -E spi@ipaddr algo:secret,... ]
          [ -F file ] [ -G rotate_seconds ] [ -i interface ]
          [ --immediate-mode ] [ -j tstamp_type ] [ -m module ]
          [ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ]
          [ -r file ] [ -s snaplen ] [ -T type ] [ --version ]
          [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]
          [ -z postrotate-command ] [ -Z user ]
          [ --time-stamp-precision=tstamp_precision ]
          [ expression ] [host]


● 주요 OPTION
-c count : 제시된 수의 패킷을 받은 후 종료한다.
-d : comile 된 packet-matching code 를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.
-dd : packet-matching code 를 C program 의 일부로 출력한다.
-ddd : packet-matching code 를 숫자로 출력한다.
-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
-f : 외부의 internet address 를 가급적 심벌로 출력한다.
-F file : filter 표현의 expression 의 입력으로 파일을 사용한다. 커맨드 라인에 주어진 추가의 expression 들은 모두 무시된다.
-i interface : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지정되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한다.(이때 loopback 은 제외된다)
-l : 표준 출력으로 나가는 데이터들을 line buffering 한다. 다른 프로그램에서 tcpdump 로부터 데이터를 받고자 할 때, 유용하다.
-n : 모든 주소들을 번역하지 않는다.(port, host address 등등)
-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.
-O : packet-matching code optimizer 를 실행하지 않는다. 이 옵션은 optimizer 에 있는 버그를 찾을 때 쓰인다.
-p : 인터페이스를 promiscuous mode 로 두지 않는다.
-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
-r file : 패킷들을 '-w' 옵션으로 만들어진 파일로부터 읽어 들인다. 파일에 '-' 가 사용되면 표준 입력을
통해서 받아들인다.
-S : TCP sequence 번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
-s length : 패킷들로부터 추출하는 샘플을 default 값인 68Byte 외의 값으로 설정할 때 사용한다.(SunOS 의 NIT 에서는 최소가 96Byte이다). 68Byte는 IP, ICMP, TCP, UDP 등에 적절한 값이지만 Name Server 나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation 할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만 아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게 되는 것이다. 따라서 가급적 캡처하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.
-T type : 조건 식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type 에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)
-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.
-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
-v : 좀 더 많은 정보들을 출력한다.
-vv : '-v' 보다 좀 더 많은 정보들을 출력한다.
-w : 캡처한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.
-x : 각각의 패킷을 헥사코드로 출력한다.


 표현식(expression) – 종류 지정
원하는 패킷을 덤프 하고자 할 때 수식 표현식을 사용할 수 있으며 그 종류는 host, net, port 등이 있다. 만일 아무것도 지정하지 않으면 모든 패킷을 덤프 한 것으로 간주한다.

- 특정 호스트, 도메인 이름, IP 주소에 대한 패킷을 덤프 하고자 할 때
tcpdump - i eth0 -v host www.sample.com

- 특정 네트워크에 대한 패킷을 덤프하고자 할 때
tcpdump - i eth0 -v net 192.168

- 포트 23번에 대하여 패킷을 덤프하고자 할 때
tcpdump – i eth0 –v port 23


● 표현식(expression) – 방향 지정
Tcpdump 의 표현식으로 ip 헤더의 도착지 또는 출발지 주소에 대한 방향을 지정할 수 있으며 가능한 방향은 'src', 'dst', 'src or dst', 'src and dst' 등이 있다. 아무것도 지정하지 않으면 양방향 모드를 가리키는 것이다.

- 출발지 도메인 이름에 대한 패킷을 덤프 하고자 할 때
tcpdump - i eth0 -v src www.sample.com

- 도착지 도메인 이름에 대한 패킷을 덤프 하고자 할 때
tcpdump - i eth0 -v dst www.sample.com

- 도착지 도메인 이름 또는 출발지 가 ftp 인 패킷을 덤프 하고자 할 때
tcpdump - i eth0 -v dst www.sample.com or src ftp


 표현식(expression) – 프로토콜 지정
Tcpdump 프로토콜 설정은 ether, fddi, ip, arp, rarp, decent, lat, tcp, udp, icmp 등 이 있으며 지정하지 않으면 모든 프로토콜을 지정한 것으로 간주한다.

- 프로토콜은 tcp 이고 출발지는 www.sample.com 인 모든 패킷을 덤프 하고자 할 때
tcpdump - i eth0 -v tcp and src www.sample.com

- 프로토콜은 arp이고 출발 혹은 도착 네트워크는 192.168인 패킷을 덤프하고자 할 때
tcpdump - i eth0 -v arp and net 192.168


이 밖에도 위의 패턴을 따르지 않는 expression 들이 존재하며(gateway, broadcst, less, greater, 산술식 등) 좀 더 정교한 expression 을 사용하려면, 'and(&&)', 'or(||)', 'not(!)' 들을 사용하여 여러 expression 들을 연결하면 된다. 같은 표현들은 생략될 수 있다.


 Tcpdump 사용 예제
tcpdump -i eth0 ⇒ 인터페이스 eth0 을 보여줌
tcpdump -w tcpdump.log ⇒ 결과를 파일로 저장, txt 가 아닌 bin 형식으로 저장됨
tcpdump -r tcpdump.log ⇒ 저장한 파일을 읽음
tcpdump -i eth0 -c 10 ⇒ 카운터 10개만 보여줌
tcpdump -i eth0 tcp port 80 ⇒ tcp 80 포트로 통신하는 패킷 보여줌
tcpdump -i eth0 src 192.168.0.1 ⇒ source ip 가 192.168.0.1 인 패킷 보여줌
tcpdump -i eth0 dst 192.168.0.1 ⇒ destination ip 가 192.168.0.1 인 패킷 보여줌
tcpdump host 192.168.0.1 ⇒ host 를 지정하면, 이 ip 로 들어 오거나 나가는 양방향 패킷 모두 보여줌
tcpdump src 192.168.0.1 ⇒ host 중에서 src 가 192.168.0.1 인 패킷 보여줌
tcpdump dst 192.168.0.1 ⇒ host 중에서 dst 가 192.168.0.1 인 패킷 보여줌
tcpdump net 192.168.0.1/24 ⇒ CIDR 포맷으로 지정할 수 있다.
tcpdump tcp ⇒ TCP 인 패킷 보여줌
tcpdump udp ⇒ UDP 인 것 보여줌인 패킷 보여줌
tcpdump port 3389 ⇒ 포트 양뱡항으로 3389 인 패킷 보여줌
tcpdump src port 3389 ⇒ src 포트가 3389 인 패킷 보여줌
tcpdump dst port 3389 ⇒ dst 포트가 3389 인 패킷 보여줌

▶ combine : and ( && ) , or ( || ) , not ( ! ) 으로 여러 가지를 조합해서 사용 가능
tcpdump udp and src port 53 ⇒ UDP 이고 src 포트가 53 인 패킷 보여줌
tcpdump src x.x.x.x and not dst port 22 ⇒ src ip 가 x.x.x.x 이고 dst 포트가 22 가 아닌 것

▶ grouping : ( )
tcpdump ‘src x.x.x.x and ( dst port 3389 or 22 )’ ⇒ src ip 가 x.x.x.x 이고 ( dst 포트가 3389 또는 22 ) 인 것. 여기서는 ‘ ‘ 가 반드시 있어야 한다.


 Tcpdump 결과 분석
Tcpddump 에 의해 생성된 패킷의 결과물은 바이너리 형태이며 tcpdump 만의 독특한 데이터 형태를 가지고 있으므로 주의 깊게 해석해야 한다.

Tcpdump 포맷 결과

① 시간, 분, 초 및 정밀화된 소수점 여섯 자리 초 형제
② 출발지 호스트명으로 –n 옵션 사용 시 IP
③ 출발지 포트
④ 방향 표시
⑤ 도착지 호스트명
⑥ 도착지 포트
⑦ Tcp flag
⑧ Tcp 시작 시퀀스 번호
⑨ Window 크기


● Tcpdump 에서 표현된 TCP flag 요약

TCP 플래그

플래그 표현

플래그 의미

SYN

S

TCP 연결의 첫 번째 부분인 세션 연결 요청

FIN

F

송신 호스트가 수신 호스트와의 정상적인 연결 종료를 요구

RESET

R

송신 호스트가 수신 호스트와의 연결을 즉시 종료하기 위해 사용

PUSH

P

데이터 전송

URGENT

U

긴급한 데이터가 다른 데이터에 우선함을 나타냄

Placeholder

.

패킷의 플래그에 SYN, FINISH, RESET, PUSH 등의 플래그가 설정되어 있지 않은 경우 이 플래그가 세팅된다. 이 플래그는 ACK 플래그와 함께 사용되는 경우도 있다.



● Tcpdump 결과 예제
▶ TCP 연결
tcpdump -nn host 192.168.2.165 and port 23

20:06:32.845356 192.168.2.10.1249 > 192.168.2.165.23:S 3263977215:3263977215(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
위에서 보면 192.168.2.10 호스트가 192.168.2.165 로 telnet(23) 을 요청한 것을 알 수 있다. SYN으로 통신을 요청하였고 initial sequence number 는 3263977215 이다.

20:06:32.845725 192.168.2.165.23 > 192.168.2.10.1249: S48495364:48495364(0) ack 3263977216 win 32120 <mss 1460,nop,nop,sackOK> (DF)
telnet 서버는 ISN에 +1 을 해서 ACK 를 보낸다. 또한 다시 SYN 을 보내서 응답을 요청한다.

20:06:32.845921 192.168.2.10.1249 > 192.168.2.165.23: . ack 1 win 17520(DF)
초기에 전송 요청을 했던 응답자가 ACK 를 보냄으로써 연결은 성립되게 된다.

▶ TCP 연결 해제
tcpdump -nn host 192.168.2.165 and port 23

20:07:32.916410 192.168.2.165.23 > 192.168.2.10.1249: F 147:147(0) ack56 win 32120 (DF)
일반적으로 세션을 끊을 때는 서버 쪽에서 먼저 끊게 된다. 192.168.2.165 에서 FIN 을 요청하였고

20:07:32.928907 192.168.2.10.1249 > 192.168.2.165.23: F 56:56(0) ack 148 win 17374 (DF)
클라이언트는 ACK 로 응답하면서 FIN을 요청한다.

20:07:32.929121 192.168.2.165.23 > 192.168.2.10.1249: . ack 57 win 32120(DF)
그러면 서버 쪽에서는 ACK 로 응답하면서 정상적인 세션을 종료하게 된다.


● IP fragmentation(단편화)
fragment 가 있는 인터넷 데이터그램은, 아래와 같이 표현된다.

(frag id:size@offset+)
(frag id:size@offset)

첫 번째 형식은 아직 fragment가 있는 것을 나타내며, 두 번째의 형식은 이것이 마지막 fragment 인 것을 나타낸다. id 는 fragment ID, size 는 fragment 사이즈를 바이트 단위로 나타낸 것이며 IP 헤더 사이즈는 포함하지 않는다. offset 은 원래 데이터그램에서의 해당 데이터그램의 fragment 오프셋(offset)를 바이트 단위로 나타낸 것이다. 아래는 fragmentation 가 발생한 데이터그램의 예제이다.

arizona.ftp-data > rtsg. 1170: .  1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
arizona > rtsg: (frag 595a:204@328)
rtsg. 1170 > arizona.ftp-data: .  ack 1536 win 2560

fragment 불가 플래그가 설정된 패킷은, 마지막 부분에 (DF) 를 붙일 수 있다.

 

[출처] Tcpdump|작성자 별의수다

 

'Tech > TCP IP' 카테고리의 다른 글

TCP 커널 파라메터  (0) 2023.08.29
TCP Time-Wait & TCP Port number reused  (0) 2021.09.02
SSL Handshake ( SNI 프로파일 )  (0) 2019.09.26
SSL TLS ( TLS Alert Protocol )  (0) 2019.03.26
TCP 3 Way / 4 Way Handshake  (0) 2019.02.13