Skip to content

Tcpdump

tcpdump는 명령 줄에서 실행하는 일반적인 패킷 가로채기 소프트웨어이다. 사용자가 TCP/IP뿐 아니라, 컴퓨터에 부착된 네트워크를 통해 송수신되는 기타 패킷을 가로채고 표시할 수 있게 도와 준다. BSD 허가서를 통해 배포되는 tcpdump는 자유 소프트웨어이다.

tcpdump는 리눅스, 솔라리스, BSD, 맥 OS X, HP-UX, AIX 따위의 대부분의 유닉스 계열 운영 체제에서 동작하며 여기서 libpcap 라이브러리를 사용하여 패킷을 포획한다. 윈도용 tcpdump 이식판으로는 WinDump가 있으며, 이는 libpcap의 윈도 이식판인 WinPcap을 이용한다.

Synopsis

$ tcpdump [ -AdDefIKlLnNOpqRStuUvxX ][ -B buffer_size ][ -c count ][ -C file_size ][ -G rotate_seconds ][ -F file ][ -i interface ][ -m module ][ -M secret ][ -r file ][ -s snaplen ][ -T type ][ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ][ -z postrotate-command ][ -Z user ]

Flags

-d
comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.
-dd
packet-matching code를 C program의 일부로 출력한다.
-ddd
packet-matching code를 숫자로 출력한다.
-e
출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
-f
외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은 가급적 피하자).
-F file
filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.
-l
표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.
-n
모든 주소들을 번역하지 않는다(port,host address 등등)
-N
호스트 이름을 출력할 때, 도메인을 찍지 않는다.
-O
packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.
-p
인터페이스를 promiscuous mode로 두지 않는다.
-q
프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
-r file
패킷들을 -w옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 - 가 사용되면 표준 입력을 통해서 받아들인다.
-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)
-S
TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
-t
출력되는 각각의 라인에 시간을 출력하지 않는다.
-tt
출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
-v
좀 더 많은 정보들을 출력한다.
-vv
-v보다 좀 더 많은 정보들을 출력한다.
-x
구문 분석 및 인쇄시 각 패킷의 헤더를 인쇄하는 것 외에도 각 패킷의 데이터 (링크 레벨 헤더를 뺀)를 16 진으로 인쇄합니다. 전체 패킷 또는 더 작은 바이트 중 작은 크기가 인쇄됩니다. 이것은 전체 링크 계층 패킷이므로 패딩하는 링크 계층 (예 : 이더넷)의 경우 상위 계층 패킷이 필요한 패딩보다 짧을 때 패딩 바이트도 인쇄됩니다.
-xx
파싱 및 인쇄시 각 패킷의 헤더를 인쇄하는 것 외에도 링크 수준 헤더를 포함하여 각 패킷의 데이터를 16 진수로 인쇄합니다.
-X
구문 분석 및 인쇄시 각 패킷의 헤더를 인쇄하는 것 외에도 각 패킷의 데이터 (링크 레벨 헤더를 뺀)를 16 진 및 ASCII로 인쇄하십시오. 이것은 새로운 프로토콜 분석에 매우 편리합니다.
-XX
구문 분석 및 인쇄시 각 패킷의 헤더를 인쇄하는 것 외에도 링크 레벨 헤더를 포함하여 각 패킷의 데이터를 16 진 및 ASCII로 인쇄하십시오.

Packet flags

S(SYN)
SYN패킷, 접속요청을 할 때 보내는 패킷을 말한다. TCP접속시에 가장먼저 보내는 패킷이다.
ack(ACK)
ACK패킷, 상대방으로부터 패킷을 받은 뒤에 알려주는 패킷을 말한다. 다른 플래그와 같이 출력되는 경우도 있다.
F(FIN)
접속종료를 위한 플래그로 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용한다.
R(RESET)
이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을끊고자 할 때 사용한다.
P(PUSH)
데이터를 즉시 목적지로 보내라는 의미이다. 텔넷과 같이 상호작용이 중요한 프로그램의 경우 빠른 응답이 중요한다. 이때 사용하는 플래그이다.
URG(UGENT)
긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다. 예를 들어 ftp로 자료를 받고 있는 도중 [CTRL]+[C]를 받으면 즉시 자료받기를 중단해야 하는것처럼 이 때 사용하는 플래그이다.
.(Placeholder)
패킷이 SYN, FINISH, RESET, PUSH등의 플래그가 없는 경우 이 플래그가 세팅된다. 이 플래그는 ACK플래그와 함께 사용되는 경우도 있다.

Example

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 tcp port 80
tcp 80 포트로 통신하는 패킷 보여줌
tcpdump -i eth0 src 192.168.0.1
source ip 가 이것인 패킷 보여줌
tcpdump -i eth0 dst 192.168.0.1
dest ip 가 이것인 패킷 보여줌
tcpdump -i eth0 src 192.168.0.1 and tcp port 80
source ip 가 이것이면서 tcp port 80 인 패킷 보여줌
and 옵션으로 여러가지 조건의 조합 가능
tcpdump -i eth0 dst 192.168.0.1
dest ip 가 이것인 패킷 보여줌
tcpdump host 192.168.0.1
host 를 지정하면, 이 ip 로 들어오거가 나가는 양방향 패킷 모두 보여줌
tcpdump src 192.168.0.1
host 중에서 src 가 이것인것 만 지정
tcpdump dst 192.168.0.1
host 중에서 dst 가 이것인것 만 지정
tcpdump net 192.168.0.1/24
CIDR 포맷으로 지정할 수 있다.
tcpdump tcp
TCP 인것만
tcpdump udp
UDP 인것만
tcpdump -nn icmp
서버로 들어오는 ICMP(ping) 에 대한 모든 패킷 출력, -nn 옵션을 사용하면 IP주소(raw)로 보인다.
tcpdump port 3389
포트 양뱡향으로 이것인 것.
tcpdump src port 3389
src 포트가 이것인 것.
tcpdump dst port 3389
dst 포트가 이것인 것.
tcpdump udp and src port 53
UDP 이고 src 포트가 53 인 것
and, or, not 으로 여러가지를 조합해서 사용 가능
tcpdump src x.x.x.x and not dst port 22
src ip 가 x.x.x.x 이고 dst 포트가 22 가 아닌 것
tcpdump 'src x.x.x.x and ( dst port 3389 or 22 )'
src ip 가 x.x.x.x 이고 ( dst 포트가 3389 또는 22 ) 인 것
()를 사용한 Grouping
tcpdump -i eth1 -w 0906.pcap -C 16 -s 1500 -n -Z root
리눅스에서 TCPDump를 이용하여 Wireshark(PCAP)파일로 분할 패킷 캡쳐방법.
eth1 인터페이스에서 capture 하며 0906.pcap 파일로 저장하고 16M 로 분할하여 생성. 패킷바이트 1500byte size 이하만 캡쳐하고 계정은 root.
tcpdump -i eth1
tcpdump -i를 사용하여 특정 이더넷 인터페이스에서 패킷 캡처
tcpdump -c 2 -i eth0
tcpdump -c를 사용하여 N개의 패킷만 캡처
tcpdump -A -i eth0
tcpdump -A를 사용하여 캡처된 패킷을 ASCII로 표시
tcpdump -XX -i eth0
tcpdump -XX를 사용하여 캡처된 패킷을 HEX 및 ASCII로 표시
tcpdump -w 08232010.pcap -i eth0
tcpdump -w를 사용하여 패킷을 캡처하고 파일에 쓰기
tcpdump -tttt -r data.pcap
tcpdump -r을 사용하여 저장된 파일에서 패킷 읽기
tcpdump -n -i eth0
tcpdump -n을 사용하여 IP 주소가 있는 패킷 캡처
tcpdump -n -tttt -i eth0
tcpdump -tttt를 사용하여 적절한 읽을 수 있는 타임스탬프가 있는 패킷 캡처
tcpdump -w g_1024.pcap greater 1024
N바이트보다 긴 패킷 읽기
tcpdump -i eth0 arp
특정 프로토콜 유형의 패킷만 수신
tcpdump -w l_1024.pcap less 1024
N바이트보다 작은 패킷 읽기
tcpdump -i eth0 port 22
tcpdump port를 사용하여 특정 포트에서 패킷 흐름 수신
tcpdump -w xpackets.pcap -i eth0 dst 10.181.140.216 and port 22
특정 대상 IP 및 포트에 대한 패킷 캡처
tcpdump -w comm.pcap -i eth0 dst 16.181.170.246 and port 22
두 호스트 간의 TCP 통신 패킷 캡처
tcpdump -i eth0 not arp and not rarp
패킷 필터링 - arp와 rarp 외의 모든 패킷 캡처

HTTP 서버 예제

  • 서버 PC 가 192.168.0.100 이고 (8080 포트 사용)
  • 클라이언트 PC 가 192.168.0.2 일 때

서버에서 들어오는 패킷을 캡쳐하고 싶다면

sudo tcpdump -XX -i eth0 dst 192.168.0.100 and tcp port 8080
## 또는 (src 경로가 여러 이름일 수 있다. 따라서 src 조건을 제거한다.)
sudo tcpdump -XX -i eth0 tcp port 8080

클라이언트에서 서버로 나가는 패킷을 캡쳐하고 싶다면

sudo tcpdump -XX -i eth0 dst 192.168.0.100 and tcp port 8080
## 또는 (src 경로가 여러 이름일 수 있다. 따라서 src 조건을 제거한다.)
sudo tcpdump -XX -i eth0 tcp port 8080

참고로 127.0.0.1 같이 로컬 PC 에서 테스트할 경우 Loopback Interface (lo) 를 사용해야할 수 있다.

서버 패킷 분석

서버의 패킷을 pcap 파일로 저장한다:

sudo -s
cd ~
tcpdump -i eno4 -w eno4.pcap tcp

분석 완료 후 Ctrl+C로 종료한 후 저장된 eno4.pcap 파일을 Wireshark에 드래그 앤 드롭 한다.

저장 파일 분할 시간 및 파일명에 날짜 지정

tcpdump -i eno4 -w "eno4_%Y-%m-%d_%H-%M.pcap" -G 3600 tcp
  • -i eno4 - eno4 네트워크 인터페이스에서 패킷을 캡처합니다.
  • -w "eno4_%Y-%m-%d_%H-%M.pcap" - 캡처한 패킷을 파일에 저장하며, 파일명에 날짜와 시간을 포함합니다.
    • %Y - 연도 (예: 2024)
    • %m - 월 (예: 11)
    • %d - 일 (예: 21)
    • %H - 시간 (예: 14)
    • %M - 분 (예: 30)
  • -G 3600 - 3600초(1시간)마다 새 파일로 분할합니다.
  • tcp - TCP 패킷만 캡처합니다.

패킷 자르기

editcap 또는 tshark 를 사용해야 할듯

저장된 패킷 시뮬레이션 하기

  • tcpreplay - PCAP 파일에 저장된 트래픽을 네트워크로 재전송하는 도구.
  • NS-3 - 네트워크 시뮬레이션을 지원하는 오픈소스 플랫폼.
  • Mininet - 가상화된 네트워크 토폴로지를 설정하여 PCAP 데이터를 재생. OpenFlow 스위치와 컨트롤러 테스트에 유용.
  • scapy - Scapy는 네트워크 패킷을 보내고, 훔치고 또는 패킷을 위조할 수 있는 파이썬(Python) 프로그램이다.

침투 테스트

공격 트래픽을 시뮬레이션하여 방화벽, IDS/IPS의 반응 확인.

성능 테스트

네트워크 장비 또는 애플리케이션의 처리 능력을 평가.

Troubleshotting

No tcp header

$ tcpdump -i lo -l -w - port 23 | tcpflow -C -r -

or

$ tcpflow -c port 6667

Couldn't change ownership of savefile

$ sudo tcpdump -i eno4 -w eno4.pcap tcp
tcpdump: Couldn't change ownership of savefile

결론만 말하면 사용자 Ownership과 동일한 위치의 디렉토리에 파일을 작성해야 한다.

sudo -s
cd ~
tcpdump -i eno4 -w eno4.pcap tcp

Permission denied

다음과 같이 실행하면

tcpdump -i eno4 -w "eno4_%Y%m%d_%H%M.pcap" -G 3600 tcp

첫 번째 파일은 잘 저장되는데 두 번째 파일부터 권한 오류가 발생된다.

tcpdump: listening on eno4, link-type EN10MB (Ethernet), capture size 262144 bytes
tcpdump: eno4_20241121_1227.pcap: Permission denied

tcpdump 사용자/그룹 인 디렉토리를 새로 만들고 해당 디렉토리에서 실행하자.

mkdir tcpdump
chown tcpdump:tcpdump tcpdump
cd tcpdump
tcpdump -i eno4 -w "eno4_%Y%m%d_%H%M.pcap" -G 3600 tcp

유의할 점은 pcap 파일의 저장경로 위치가 절대경로면 전체 경로가 "tcpdump" 사용자/그룹 체크가 들어가는 듯 하다.

tcpdump -i eno4 -w /root/tcpdump/eno4_%Y%m%d_%H%M.pcap -G 3600 tcp

따라서 위와 같이 절대경로로 입력하지 말고 권한이 있는 현재 디렉토리에 그냥 적는걸 추천한다:

tcpdump -i eno4 -w eno4_%Y%m%d_%H%M.pcap -G 3600 tcp

See also

  • WireShark
  • libpcap
  • tcp/ip
  • iPerf
  • tcpflow
  • scapy - Scapy는 네트워크 패킷을 보내고, 훔치고 또는 패킷을 위조할 수 있는 파이썬(Python) 프로그램이다.
  • netfilter
  • iptable
  • tshark - CLI 에서 사용 가능한 Wireshark.
  • editcap
  • Kyanos - eBPF 기반의 네트워크 이슈 분석 도구
  • tcpreplay - PCAP 파일에 저장된 트래픽을 네트워크로 재전송하는 도구.
  • NS-3 - 네트워크 시뮬레이션을 지원하는 오픈소스 플랫폼.
  • Mininet - 가상화된 네트워크 토폴로지를 설정하여 PCAP 데이터를 재생. OpenFlow 스위치와 컨트롤러 테스트에 유용.

Favorite site