tcpdump는 시스템을 오가는 네트워크 트래픽을 캡처하고 검사하는 데 사용할 수 있는 명령줄 유틸리티입니다. 네트워크 관리자가 네트워크 문제 해결 및 보안 테스트를 위해 가장 많이 사용하는 도구입니다.
tcpdump라는 이름에도 불구하고 UDP, ARP 또는 ICMP와 같은 TCP가 아닌 트래픽도 캡처할 수 있습니다. 캡처된 패킷은 파일 또는 표준 출력에 쓸 수 있습니다. 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 웹 사이트를 참조하십시오.
'SW > 리눅스' 카테고리의 다른 글
Linux : CentOS 8 : Ruby 설치 방법, 예제, 명령어 (0) | 2022.06.17 |
---|---|
Linux : Timeout 명령어, 예제, 사용 방법 (0) | 2022.06.16 |
Linux : Debian 10 : Vagrant 설치 방법, 예제, 명령어 (0) | 2022.06.14 |
Linux : Debian 10 : OpenCV 설치 방법, 예제, 명령어 (0) | 2022.06.13 |
Linux : PHP 버전 체크, 확인 방법, 예제, 명령어 (0) | 2022.06.12 |