tcpdump는 libpcap을 사용해 네트워크 인터페이스의 패킷을 캡처하거나 저장된 capture file을 읽는 CLI 분석 도구다. 캡처 대상을 BPF capture filter로 제한할 수 있다.
sudo apt update sudo apt install tcpdump
sudo dnf install tcpdump
macOS에는 /usr/sbin/tcpdump가 기본 제공된다. Apple이 제공하는 버전을 먼저 사용하고 다음 명령으로 확인한다.
/usr/sbin/tcpdump --version
공식 Homebrew tcpdump formula와 Windows용 winget package는 확인되지 않았다. tcpdump upstream은 Windows build에 Npcap과 Visual Studio/CMake가 필요하다고 안내한다. Windows에서 일반적인 packet capture가 목적이면 TShark 또는 Wireshark를 고려한다.
tcpdump --version
tcpdump -i eth0 tcp port 80 tcpdump -i any port 80 tcpdump -qns 0 -A -r packet.pcap tcpdump -i enp4s0 -Q out 'dst host example.com'
tcpdump [OPTIONS] [EXPRESSION]-D: 캡처 가능한 인터페이스 목록을 출력한다.-i INTERFACE: 패킷을 캡처할 인터페이스를 지정한다. Linux의 any는 모든 일반 인터페이스를 뜻한다.-c COUNT: 지정한 수의 패킷을 처리한 뒤 종료한다.-n: 주소를 hostname으로 변환하지 않는다.-nn: hostname 변환과 service name 변환을 모두 끈다.-s SNAPLEN: 각 패킷에서 캡처할 byte 수를 지정한다. -s 0은 현재 버전에서 전체 패킷을 캡처한다.-w FILE: raw packet을 capture file에 저장한다.-r FILE: 저장된 capture file을 읽는다.-A: packet payload를 ASCII로 출력한다.-X: packet payload를 hex와 ASCII로 출력한다.-e: link-layer header를 함께 출력한다.-q: protocol 상세 출력을 줄인다.-v, -vv, -vvv: 출력 상세도를 단계적으로 높인다.-Q in|out|inout: 지원하는 플랫폼에서 capture 방향을 제한한다.-G SECONDS: 지정한 시간마다 새 output file로 전환한다.-C FILE_SIZE: file 크기가 기준에 도달하면 다음 output file로 전환한다.-W FILE_COUNT: rotation에서 유지할 file 수를 제한한다.
tcpdump의 마지막 EXPRESSION은 pcap/BPF capture filter다. and, or, not과 괄호로 조건을 조합할 수 있다. shell이 특수 문자를 해석하지 않도록 filter 전체를 작은따옴표로 감싸는 편이 안전하다.
src host IP_OR_NAME: 출발지를 지정한다.dst host IP_OR_NAME: 목적지를 지정한다.host IP_OR_NAME: 출발지 또는 목적지를 지정한다.src port PORT: 출발지 port를 지정한다.dst port PORT: 목적지 port를 지정한다.port PORT: 출발지 또는 목적지 port를 지정한다.tcp, udp, icmp, ip6: protocol을 지정한다.net NETWORK: network prefix를 지정한다.tcpdump -D
sudo tcpdump -i eth0 -nn -c 100 'tcp port 443' sudo tcpdump -i any -nn 'host 192.0.2.10 and not port 22'
sudo tcpdump -i eth0 -nn -s 0 -c 1000 -w packet.pcap 'port 53' tcpdump -nn -r packet.pcap tcpdump -qns 0 -A -r packet.pcap
-w는 사람이 읽는 text가 아니라 raw packet을 저장한다. text 보고서가 필요하면 capture file을 -r로 다시 읽어 표준 출력을 별도 파일로 redirect한다.
sudo tcpdump -i enp4s0 -Q out 'dst host example.com'
-Q 지원 여부와 사용할 수 있는 값은 OS와 capture backend에 따라 다르다.
sudo tcpdump -i eth0 -nn -s 0 -C 100 -W 10 -w 'capture.pcap'
root로 실행하기 전에 조직의 packet capture 정책을 확인한다. 지속적인 비root capture가 필요하면 배포판의 전용 group 또는 최소 capability 구성을 사용하고, 실행 파일에 광범위한 권한을 임의로 부여하지 않는다.
tcpdump -D로 실제 interface 이름을 확인한다.-nn을 사용한다.
capture filter, -c, -G, -C, -W를 조합해 시간·크기·파일 수를 제한한다. rotation 후 command를 실행하는 -z에는 임의 입력을 넣지 않는다.
-Q 방향 제한, timestamp 기능은 OS와 libpcap backend에 따라 다르다.any interface는 주로 Linux에서 제공되며 일반 physical interface와 link-layer header가 다를 수 있다.