SW/리눅스

Linux : Tcpdump 명령어, 예제, 방법

얇은생각 2022. 6. 15. 07:30
반응형

tcpdump는 시스템을 오가는 네트워크 트래픽을 캡처하고 검사하는 데 사용할 수 있는 명령줄 유틸리티입니다. 네트워크 관리자가 네트워크 문제 해결 및 보안 테스트를 위해 가장 많이 사용하는 도구입니다.

tcpdump라는 이름에도 불구하고 UDP, ARP 또는 ICMP와 같은 TCP가 아닌 트래픽도 캡처할 수 있습니다. 캡처된 패킷은 파일 또는 표준 출력에 쓸 수 있습니다. tcpdump 명령의 가장 강력한 기능 중 하나는 필터를 사용하고 분석하려는 데이터만 캡처하는 기능입니다.

Linux에서 tcpdump 명령을 사용하는 방법에 대한 기본 사항에 대해 설명합니다.

 

 

Linux : Tcpdump 명령어, 예제, 방법

 

 

tcpdump를 설치

tcpdump는 대부분의 Linux 배포 및 macOS에 기본적으로 설치됩니다. 시스템 유형에서 tcpdump 명령을 사용할 수 있는지 확인하려면 다음과 같이 하십시오.

tcpdump --version

# tcpdump version 4.9.2
# libpcap version 1.8.1
# OpenSSL 1.1.1b  26 Feb 2019

 

 

시스템에 tcpdump가 없는 경우 위의 명령은 "tcpdump: command not found"를 출력합니다. distro의 패키지 관리자를 사용하여 tcpdump를 쉽게 설치할 수 있습니다.

 

 

 

Ubuntu 및 Debian에 tcpdump를 설치

sudo apt update && sudo apt install tcpdump

 

 

CentOS 및 Fedora에 tcpdump를 설치

sudo yum install tcpdump

 

 

 

Arch Linux에 tcpdump를 설치

sudo pacman -S tcpdump

 

 

 

tcpdump를 사용하여 패킷을 캡처

tcpdump 명령에 대한 일반적인 구문은 다음과 같습니다.

tcpdump [options] [expression]

 

 

명령 옵션을 사용하면 명령의 동작을 제어할 수 있습니다.

필터 식은 캡처할 패킷을 정의합니다.

 

sudo 권한이 있는 루트 또는 사용자만 tcpdump를 실행할 수 있습니다. 권한 없는 사용자로 명령을 실행하려고 하면 "해당 장치에서 캡처할 권한이 없습니다."라는 오류가 표시됩니다.

가장 간단한 사용 사례는 옵션 및 필터 없이 tcpdump를 호출하는 것입니다.

sudo tcpdump

# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
# listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
# 15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
# 15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
# 15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
# 
# ... Long output suppressed
# 
# 23116 packets captured
# 23300 packets received by filter
# 184 packets dropped by kernel

 

 

tcpdump는 계속 패킷을 캡처하여 인터럽트 신호를 수신할 때까지 표준 출력에 씁니다. Ctrl+C 키 조합을 사용하여 인터럽트 신호를 보내고 명령을 중지합니다.

자세한 내용을 보려면 -v 옵션을, 더 자세한 내용을 보려면 -vv를 전달하십시오.

sudo tcpdump -vv

 

 

-c 옵션을 사용하여 캡처할 패킷 수를 지정할 수 있습니다. 예를 들어 10개의 패킷만 캡처하려면 다음을 입력합니다.

sudo tcpdump -c 10

 

 

패킷을 캡처한 후 tcpdump가 중지됩니다.

인터페이스가 지정되지 않은 경우 tcpdump는 해당 인터페이스를 통과하는 모든 패킷을 찾은 후 덤프합니다.

tcpdump가 패킷을 수집할 수 있는 모든 사용 가능한 네트워크 인터페이스 목록을 인쇄하려면 -D 옵션을 사용합니다.

sudo tcpdump -D

# 1.ens3 [Up, Running]
# 2.any (Pseudo-device that captures on all interfaces) [Up, Running]
# 3.lo [Up, Running, Loopback]

 

 

명령어는 각 인터페이스에 대해 인터페이스 이름, 간단한 설명 및 관련 인덱스(숫자)를 인쇄합니다.

위의 출력은 ens3가 tcpdump에 의해 발견되어 명령에 인터페이스가 제공되지 않을 때 사용되는 첫 번째 인터페이스임을 보여줍니다. 두 번째 인터페이스는 모든 활성 인터페이스를 캡처할 수 있는 특수 장치입니다.

트래픽을 캡처할 인터페이스를 지정하려면 명령을 -i 옵션과 함께 호출한 다음 인터페이스 이름 또는 관련 인덱스를 사용합니다. 예를 들어 모든 인터페이스에서 모든 패킷을 캡처하려면 인터페이스를 지정합니다.

sudo tcpdump -i any

 

 

기본적으로 tcpdump는 IP 주소에 대해 역 DNS 확인을 수행하고 포트 번호를 이름으로 변환합니다. -n 옵션을 사용하여 변환을 비활성화합니다.

sudo tcpdump -n

 

 

DNS 조회를 건너뛰면 DNS 트래픽이 생성되지 않고 출력이 더 읽기 쉬워집니다. tcpdump를 호출할 때마다 이 옵션을 사용하는 것이 좋습니다.

출력을 화면에 표시하는 대신 리디렉션 연산자 > 및 >>를 사용하여 파일로 리디렉션할 수 있습니다.

sudo tcpdump -n -i any > file.out

 

 

tee 명령을 사용하여 파일에 저장하면서 데이터를 볼 수도 있습니다.

sudo tcpdump -n -l | tee file.out

 

 

위 명령의 -l 옵션은 tcpdump에게 출력 줄을 버퍼링하도록 지시합니다. 이 옵션을 사용하지 않으면 새 라인이 생성될 때 출력이 화면에 기록되지 않습니다.

 

 

 

tcpdump 출력을 이해

tcpdump가 새 줄에 캡처된 각 패킷에 대한 정보를 출력합니다. 각 행에는 프로토콜에 따라 해당 패킷에 대한 정보와 타임스탬프가 포함됩니다.

TCP 프로토콜 라인의 일반적인 형식은 다음과 같습니다.

[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]

 

 

필드별로 이동하여 다음 줄을 설명하겠습니다.

15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108

 

 

 

 

15:47:24.248737 - 캡처된 패킷의 타임스탬프는 로컬 시간이며 다음 형식을 사용합니다. hours:minutes:seconds.frac. 여기서 frac는 자정 이후 1초의 분수입니다 .

IP - 패킷 프로토콜입니다. 여기서 IP는 인터넷 프로토콜 버전 4(IPv4)를 의미합니다.

192.168.1.185.22 - 소스 IP 주소 및 포트이며 점(.)으로 구분됩니다.

192.168.1.150.37445 - 대상 IP 주소 및 포트이며 점(.)으로 구분됩니다.

 

 

Flags [P.] - TCP Flags 필드를 누릅니다. 이 예에서 [P.]는 이전 패킷을 확인하고 데이터를 전송하는 데 사용되는 Push Acknowledgement 패킷을 의미합니다. 기타 일반적인 플래그 필드 값은 다음과 같습니다.

 

[.] - ACK(승인)

[S] - SYN(연결 시작)

[P] - PSH(데이터 푸시)

[F] - FIN(연결 완료)

[R] - RST(연결 재설정)

[S.] - SYN-ACK(SynAcK 패킷)

 

seq 201747193:201747301 - 시퀀스 번호는 첫 번째:마지막 표기법입니다. 패킷에 포함된 데이터 수를 표시합니다. 데이터 스트림에서 이 숫자가 절대인 첫 번째 패킷을 제외하고 모든 후속 패킷은 상대 바이트 위치로 사용됩니다. 이 예제에서 숫자는 201747193:201747301이며, 이는 이 패킷에 데이터 스트림의 바이트 201747193 ~ 201747301이 포함되어 있음을 의미합니다. 절대 시퀀스 번호를 인쇄하려면 -S 옵션을 사용합니다.

ack 1226568763 승인 번호는 이 연결의 다른 쪽 끝에서 예상되는 다음 데이터의 시퀀스 번호입니다.

win 402 - 창 번호는 수신 버퍼에서 사용 가능한 바이트 수입니다.

options [nop, nop, TS va; 1051794587 ecr 2679218230] - TCP 옵션입니다. nop 또는 "no operation"은 TCP 헤더를 4바이트의 배수로 만드는 데 사용되는 패딩입니다. TS val은 TCP 타임스탬프이고 ecr은 에코 응답을 나타냅니다. TCP 옵션에 대한 자세한 내용은 IANA 설명서를 참조하십시오.

length 108 - 페이로드 데이터의 길이입니다.

 

 

tcpdump 필터

tcpdump가 필터 없이 호출되면 모든 트래픽을 캡처하고 대량의 출력을 생성하여 관심 패킷을 찾고 분석하기가 매우 어렵습니다.

필터는 tcpdump 명령의 가장 강력한 기능 중 하나입니다. 표현식과 일치하는 패킷만 캡처할 수 있기 때문입니다. 예를 들어 웹 서버와 관련된 문제를 해결할 때 필터를 사용하여 HTTP 트래픽만 가져올 수 있습니다.

tcpdump는 BPF(Berkeley Packet Filter) 구문을 사용하여 프로토콜, 소스 및 대상 IP 주소, 포트 등과 같은 다양한 가공 매개 변수를 사용하여 캡처된 패킷을 필터링합니다.

가장 일반적인 필터 몇 가지를 살펴보겠습니다. 사용 가능한 모든 필터 목록을 보려면 pcap 필터 맨 페이지를 확인하십시오.

 

 

프로토콜별로 필터링

캡처를 특정 프로토콜로 제한하려면 프로토콜을 필터로 지정합니다. 예를 들어 UDP 트래픽만 캡처하려면 다음을 실행합니다.

sudo tcpdump -n udp

 

 

 

프로토콜을 정의하는 또 다른 방법은 프로토콜 번호 다음에 프로토 한정자를 사용하는 것입니다. 다음 명령은 프로토콜 번호 17을 필터링하고 위의 결과와 동일한 결과를 생성합니다.

sudo tcpdump -n proto 17

 

 

숫자에 대한 자세한 내용은 IP 프로토콜 번호 목록을 확인하십시오.

 

 

 

호스트별로 필터링

특정 호스트와 관련된 패킷만 캡처하려면 호스트 한정자를 사용합니다.

sudo tcpdump -n host 192.168.1.185

 

 

호스트는 IP 주소 또는 이름일 수 있습니다.

네트워크 한정자를 사용하여 지정된 IP 범위로 출력을 필터링할 수도 있습니다. 예를 들어 10.10.0.0/16과 관련된 패킷만 덤프하려면 다음을 사용합니다.

sudo tcpdump -n net 10.10

 

 

 

포트별로 필터링

특정 포트의 패킷으로만 캡처를 제한하려면 포트 한정자를 사용합니다. 아래 명령은 다음 명령을 사용하여 SSH(포트 22) 서비스와 관련된 패킷을 캡처합니다.

sudo tcpdump -n port 23

 

 

포트 범위 한정자를 사용하면 다음과 같은 포트 범위에서 트래픽을 캡처할 수 있습니다.

sudo tcpdump -n portrange 110-150

 

 

 

소스 및 대상별로 필터링

src, dst, src 및 dst와 src 또는 dst 한정자를 사용하여 소스 또는 대상 포트 또는 호스트를 기준으로 패킷을 필터링할 수도 있습니다.

다음 명령은 IP 192.168.1.185를 사용하는 호스트에서 들어오는 패킷을 캡처합니다.

sudo tcpdump -n src host 192.168.1.185

 

 

모든 소스에서 포트 80으로 전송되는 트래픽을 찾으려면 다음을 사용합니다.

sudo tcpdump -n dst port 80

 

 

 

복합 필터

필터는 및 (&&) 또는 (||) 연산자를 사용하여 결합할 수 있으며 (!) 연산자를 사용할 수 없습니다.

예를 들어 소스 IP 주소 192.168.1.185에서 오는 모든 HTTP 트래픽을 캡처하려면 다음 명령을 사용합니다.

sudo tcpdump -n src 192.168.1.185 and tcp port 80

 

 

 

괄호를 사용하여 보다 복잡한 필터를 그룹화하고 생성할 수도 있습니다.

sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'

 

 

특수 문자를 사용할 때 구문 분석 오류를 방지하려면 필터를 작은 따옴표 안에 넣으십시오. 

다음은 소스 IP 주소 192.168.1.185에서 SSH를 제외한 모든 트래픽을 캡처하는 또 다른 예제 명령입니다.

sudo tcpdump -n src 192.168.1.185 and not dst port 22

 

 

 

패킷 검사

기본적으로 tcpdump는 패킷 헤더만 캡처합니다. 그러나 패킷 내용을 검사해야 하는 경우도 있습니다.

tcpdump를 사용하면 ASCII 및 HEX로 패킷 내용을 인쇄할 수 있습니다. 

-A 옵션은 tcpdump에게 각 패킷을 ASCII로 인쇄하고 -x를 HEX로 인쇄하도록 지시합니다.

sudo tcpdump -n -A

 

 

패킷 내용을 HEX와 ASCII로 모두 표시하려면 -X 옵션을 사용합니다.

sudo tcpdump -n -X

 

 

 

 

파일에 캡처를 읽고 쓰기

tcpdump의 또 다른 유용한 기능은 패킷을 파일에 쓰는 것입니다. 이 기능은 많은 수의 패킷을 캡처하거나 나중에 분석하기 위해 패킷을 캡처할 때 유용합니다. 

파일에 쓰기를 시작하려면 -w 옵션 다음에 출력 캡처 파일을 사용합니다.

sudo tcpdump -n -w data.pcap

 

 

위의 명령은 캡처한 내용을 data.pcap라는 파일에 저장합니다. 파일 이름을 원하는 대로 지정할 수 있지만 .pcap 확장자(패킷 캡처)를 사용하는 것이 일반적인 관례입니다.

-w 옵션을 사용하면 출력이 화면에 표시되지 않습니다. tcpdump는 원시 패킷을 기록하고 일반 텍스트 편집기로 읽을 수 없는 이진 파일을 생성합니다.

파일 내용을 검사하려면 tcpdump를 -r 옵션으로 호출하십시오.

sudo tcpdump -r data.pcap

 

 

tcpdump를 백그라운드에서 실행하려면 명령 끝에 앰퍼샌드 기호(&)를 추가하십시오.

캡처 파일은 Wireshark와 같은 다른 패킷 분석기 도구로 검사할 수도 있습니다. 

장기간 패킷을 캡처할 때 파일 순환을 사용하도록 설정할 수 있습니다. tcpdump를 사용하면 새 파일을 만들고 지정된 시간 간격 또는 고정 크기로 덤프 파일을 회전할 수 있습니다. 다음 명령은 이전 파일을 덮어쓰기 전에 최대 10개의 200MB 파일(file.pcap0, file.pcap1 등)을 만듭니다.

sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap

 

 

10개의 파일이 생성되면 오래된 파일을 덮어씁니다. 

tcpdump는 문제 해결 중에만 실행해야 합니다.

특정 시간에 tcpdump를 시작하려면 cronjob을 사용할 수 있습니다. tcpdump에는 지정된 시간 후에 종료하는 옵션이 없습니다. tcpdump는 일정 시간 후에 tcpdump를 중지하기 위해 timeout 명령을 사용할 수 있습니다. 예를 들어, 5분 후에 종료하려면 다음을 사용합니다.

sudo timeout 300 tcpdump -n -w data.pcap

 

 

tcpdump는 네트워크 관련 문제를 분석하고 해결하기 위한 명령줄 도구입니다.

tcpdump 사용 및 구문의 기본 사항을 소개합니다. 자세한 내용은 tcpdump 웹 사이트를 참조하십시오.

반응형