매일 업데이트
2022-11-26 08:05 13 min

tcpdump로 네트워크 트래픽을 캡처하고 분석하는 방법은 무엇입니까?

네트워크 스니핑을 위한 강력한 명령줄 도구: tcpdump

tcpdump는 네트워크 패킷을 캡처하고 분석하는 데 있어 매우 유용한 명령줄 도구입니다. 이는 TCP/IP 패킷을 감시하고 분석하기 위한 업계 표준으로 널리 사용되고 있습니다.

이 도구는 네트워크 문제를 진단하고 해결하는 데 탁월한 도움을 제공합니다. 캡처한 패킷을 파일로 저장하여 나중에 상세하게 분석할 수 있으며, 네트워크 활동을 지속적으로 모니터링하는 데에도 유용합니다.

tcpdump 출력 결과 분석

tcpdump는 TCP/IP 패킷의 헤더를 자세히 검사할 수 있게 해줍니다. 각 패킷에 대한 정보를 한 줄씩 출력하며, 사용자가 Ctrl+C를 눌러 종료할 때까지 지속적으로 실행됩니다.

tcpdump 출력의 한 줄 예시를 통해 그 구조를 살펴보겠습니다.

20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0

각 줄은 다음 구성 요소들로 이루어져 있습니다:

  • 유닉스 타임스탬프: (20:58:26.765637) - 패킷이 캡처된 시간입니다.
  • 프로토콜: (IP) - 사용된 네트워크 프로토콜입니다.
  • 소스 호스트 정보: (10.0.0.50.80) - 패킷의 출발지 IP 주소 및 포트 번호입니다.
  • 대상 호스트 정보: (10.0.0.1.53181) - 패킷의 목적지 IP 주소 및 포트 번호입니다.
  • TCP 플래그: (Flags [F.]) - 연결 상태를 나타내는 TCP 플래그입니다. 여러 플래그가 동시에 설정될 수 있습니다. 예를 들어, [F.]는 FIN-ACK을 의미합니다. 다음은 자주 사용되는 플래그들입니다:
    • S - SYN (연결 설정의 첫 단계)
    • F - FIN (연결 종료)
    • . - ACK (승인 패킷 수신 확인)
    • P - PUSH (데이터 즉시 처리 지시)
    • R - RST (통신 중단)
  • 시퀀스 번호: (seq 1) - 패킷 내 데이터의 순서 번호입니다.
  • 확인 번호: (ack 2) - 수신자가 기대하는 다음 시퀀스 번호입니다.
  • 윈도우 크기: (win 453) - 수신 버퍼에서 사용 가능한 바이트 수입니다. 이후에는 TCP 옵션 정보가 따라옵니다.
  • 데이터 길이: (length 0) - 패킷 페이로드의 길이입니다.

tcpdump 설치 방법

데비안 기반 시스템에서는 다음 APT 명령어를 사용하여 tcpdump를 설치할 수 있습니다:

# apt install tcpdump -y

RPM 기반 시스템에서는 YUM을 사용하여 설치할 수 있습니다:

# yum install tcpdump -y

RHEL 8 이상에서는 DNF를 사용합니다:

# dnf install tcpdump -y

tcpdump 명령어 옵션

tcpdump를 실행하려면 루트 권한이 필요합니다. 다양한 옵션과 필터를 지원하며, 옵션 없이 실행하면 기본 인터페이스를 통해 전달되는 모든 패킷을 캡처합니다.

시스템에서 사용 가능한 네트워크 인터페이스 목록을 확인하고 tcpdump가 패킷을 캡처할 수 있는지 확인하려면 다음 명령어를 사용합니다:

# tcpdump -D

또는

# tcpdump --list-interfaces
1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.eth1
5.any (Pseudo-device that captures on all interfaces)
6.lo [Loopback]

이 명령어는 인터페이스 목록을 보여주는 다른 명령어가 없는 시스템에서 특히 유용합니다.

특정 인터페이스를 통해 전달되는 패킷을 캡처하려면 '-i' 플래그와 함께 인터페이스 이름을 사용합니다. '-i' 옵션이 없으면 tcpdump는 처음 발견된 네트워크 인터페이스를 사용합니다.

# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 1, length 64
01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 4761, seq 1, length 64
01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 2, length 64

'-v' 플래그는 패킷에 대한 정보량을 증가시키고, '-vv'는 더 자세한 정보를 제공합니다.

기본적으로 tcpdump는 IP 주소를 호스트 이름으로 변환하고, 포트 번호 대신 서비스 이름도 사용합니다. DNS에 문제가 있거나 tcpdump가 이름 조회를 수행하지 않도록 하려면 '-n' 옵션을 사용합니다.

# tcpdump -n
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100

특정 개수의 패킷만 캡처하려면 '-c' 플래그를 사용합니다. 예를 들어, 5개의 패킷만 캡처하려면:

#tcpdump -c 5
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100
5 packets captured

기본적으로 tcpdump 출력은 유닉스 타임스탬프를 사용합니다. 사람이 읽기 쉬운 타임스탬프로 패킷을 캡처하려면 '-tttt' 옵션을 사용합니다:

# tcpdump -tttt
2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, length 36
2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 36:72, ack 1, win 37232, length 36
2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 72:108, ack 1, win 37232, length 36

tcpdump 필터 표현식 활용

필터 표현식을 사용하여 표시할 패킷 헤더를 선택할 수 있습니다. 필터가 적용되지 않으면 모든 패킷 헤더가 표시됩니다. 일반적으로 사용되는 필터로는 포트, 호스트, src, dst, tcp, udp, icmp 등이 있습니다.

포트 필터

특정 포트로 들어오는 패킷을 보려면 'port' 필터를 사용합니다:

# tcpdump -i eth1 -c 5 port 80
23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80: Flags [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971: Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80: Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972: Flags [S.E], seq 1363851389, ack 226341106, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0

호스트 필터

IP 주소가 10.0.2.15인 호스트에서 오거나 해당 호스트로 향하는 모든 패킷을 캡처하려면:

# tcpdump host 10.0.2.15
03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36
03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 36:72, ack 1, win 37232, length 36
03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 72:108, ack 1, win 37232, length 36

eth1 인터페이스에서 특정 프로토콜 유형(예: icmp)의 패킷을 캡처하려면:

# tcpdump -i eth1 icmp
04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 75, length 64
04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 75, length 64
04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 76, length 64
04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 76, length 64
04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 77, length 64

필터 표현식 조합

필터 표현식을 AND, OR 및 NOT 연산자와 함께 사용하여 더욱 정밀하게 패킷을 격리할 수 있습니다. 이를 통해 복잡한 네트워크 상황을 분석하는 데 유용한 명령을 만들 수 있습니다.

특정 IP에서 특정 포트로 향하는 패킷을 캡처하려면:

# tcpdump -n -i eth1 src 10.0.0.1 and dst port 80
00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80: Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0
00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0
00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80: Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499: HTTP: GET / HTTP/1.1
00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174 ecr 5983566], length 0

ICMP를 제외한 모든 패킷을 캡처하려면 NOT 연산자를 사용합니다:

# tcpdump -i eth1 not icmp

패킷 헤더를 파일에 저장

tcpdump 출력은 화면에 빠르게 스크롤될 수 있으므로 '-w' 플래그를 사용하여 패킷 헤더를 파일에 저장할 수 있습니다. 저장되는 파일은 pcap 형식으로 '.pcap' 확장자를 가집니다.

PCAP는 패킷 캡처를 의미하며, 다음 명령어는 eth1 인터페이스의 출력 10줄을 'icmp.pcap' 파일에 저장합니다.

# tcpdump -i eth1 -c 10 -w icmp.pcap
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

저장된 파일은 '-r' 플래그를 사용하여 읽을 수 있습니다.

tcpdump -r icmp.pcap
reading from file icmp.pcap, link-type EN10MB (Ethernet)
05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 33, length 64
05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 33, length 64
05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 34, length 64
05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 34, length 64
05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 35, length 64

패킷 세부 정보 확인

지금까지 패킷 헤더만 확인했지만, 패킷의 내용을 보려면 '-A' 옵션을 사용합니다. 이 옵션은 패킷의 내용을 ASCII 형식으로 출력하여 네트워크 문제 해결에 도움을 줍니다. 또한 '-X' 플래그를 사용하여 출력을 16진수 형식으로 표시할 수도 있지만, 암호화된 연결에서는 큰 도움이 되지 않을 수 있습니다.

# tcpdump -c10 -i eth1 -n -A port 80
23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1
E..'[email protected]@.%.
...
..2...P..M.
uE............
.6.}.Q.bGET / HTTP/1.1
Host: 10.0.0.50
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT

결론

tcpdump는 설치와 사용이 간편하며, 다양한 옵션과 필터를 이해하고 활용하면 네트워크 문제를 해결하고 네트워크를 안전하게 보호하는 데 효과적으로 사용할 수 있습니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.