
tcpdump 명령어는 흔히 패킷 분석기(packet analyzer)라고도 불리는 강력한 네트워크 진단 도구입니다.
tcpdump는 대부분의 유닉스 계열 운영체제에서 동작하며, 캡처한 패킷을 파일로 저장해 나중에 다시 분석할 수 있다는 장점이 있습니다. 저장된 파일은 tcpdump 명령어 자체로도 열어볼 수 있고, Wireshark 같은 오픈소스 소프트웨어로도 손쉽게 확인할 수 있습니다.
이 글에서는 tcpdump를 실무에서 바로 활용할 수 있는 15가지 대표 예제를 하나씩 살펴보겠습니다.
1. 특정 이더넷 인터페이스에서 패킷 캡처하기 (-i 옵션)
옵션 없이 tcpdump를 실행하면 모든 인터페이스를 통과하는 패킷을 전부 캡처합니다. -i 옵션을 함께 사용하면 특정 이더넷 인터페이스만 골라서 캡처할 수 있습니다.
$ tcpdump -i eth1 14:59:26.608728 IP xx.domain.netbcp.net.52497 > valh4.lell.net.ssh: . ack 540 win 16554 14:59:26.610602 IP resolver.lell.net.domain > valh4.lell.net.24151: 4278 1/0/0 (73) 14:59:26.611262 IP valh4.lell.net.38527 > resolver.lell.net.domain: 26364+ PTR? 244.207.104.10.in-addr.arpa. (45)
위 예제에서는 eth1 인터페이스로 흐르는 모든 패킷을 캡처해 표준 출력으로 보여줍니다.
참고: Editcap 유틸리티를 사용하면 덤프 파일에서 특정 패킷만 선택하거나 제거하고, 원하는 형식으로 변환할 수 있습니다.
2. 지정한 개수(N개)만큼만 패킷 캡처하기 (-c 옵션)
tcpdump는 실행을 중단하기 전까지 끝없이 패킷을 캡처합니다. -c 옵션을 사용하면 캡처할 패킷의 개수를 직접 지정할 수 있습니다.
$ tcpdump -c 2 -i eth0 listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 14:38:38.184913 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 1457255642:1457255758(116) ack 1561463966 win 63652 14:38:38.690919 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 116:232(116) ack 1 win 63652 2 packets captured 13 packets received by filter 0 packets dropped by kernel
위 명령은 eth0 인터페이스에서 딱 2개의 패킷만 캡처하고 종료됩니다.
참고: Mergecap과 TShark — Mergecap은 여러 개의 덤프 파일을 하나로 합쳐주는 도구이며, TShark는 Wireshark 배포판에 포함된 강력한 네트워크 패킷 캡처 및 트래픽 분석 도구입니다.
3. 캡처한 패킷을 ASCII 형식으로 출력하기 (-A 옵션)
다음 구문은 캡처한 패킷 내용을 ASCII 문자로 화면에 출력합니다.
$ tcpdump -A -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
14:34:50.913995 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 1457239478:1457239594(116) ack 1561461262 win 63652
E.....@.@..]..i...9...*.V...]...P....h....E...>{..U=...g.
......G..7\+KA....A...L.
14:34:51.423640 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 116:232(116) ack 1 win 63652
E.....@.@..\..i...9...*.V..*]...P....h....7......X..!....Im.S.g.u:*..O&....^#Ba...
E..(R.@.|.....9...i.*...]...V..*P..OWp........
참고: ifconfig 명령어는 네트워크 인터페이스를 설정할 때 사용하는 기본 도구입니다.
4. HEX와 ASCII 형식으로 함께 출력하기 (-XX 옵션)
16진수 값으로 패킷을 분석하고 싶은 경우도 있습니다. tcpdump는 -XX 옵션을 통해 ASCII와 HEX 두 가지 형식을 동시에 출력해 줍니다.
$tcpdump -XX -i eth0 18:52:54.859697 IP zz.domain.innetbcp.net.63897 > valh4.lell.net.ssh: . ack 232 win 16511 0x0000: 0050 569c 35a3 0019 bb1c 0c00 0800 4500 .PV.5.........E. 0x0010: 0028 042a 4000 7906 c89c 10b5 aaf6 0f9a .(.*@.y......... 0x0020: 69c4 f999 0016 57db 6e08 c712 ea2e 5010 i.....W.n.....P. 0x0030: 407f c976 0000 0000 0000 0000 @..v........ 18:52:54.877713 IP 10.0.0.0 > all-systems.mcast.net: igmp query v3 [max resp time 1s] 0x0000: 0050 569c 35a3 0000 0000 0000 0800 4600 .PV.5.........F. 0x0010: 0024 0000 0000 0102 3ad3 0a00 0000 e000 .$......:....... 0x0020: 0001 9404 0000 1101 ebfe 0000 0000 0300 ................ 0x0030: 0000 0000 0000 0000 0000 0000 ............
5. 캡처한 패킷을 파일로 저장하기 (-w 옵션)
tcpdump로 캡처한 패킷을 파일에 저장해 두면, 나중에 해당 파일을 가지고 심층 분석을 진행할 수 있습니다.
$ tcpdump -w 08232010.pcap -i eth0 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 32 packets captured 32 packets received by filter 0 packets dropped by kernel
-w 옵션은 패킷을 지정한 파일에 기록합니다. 파일 확장자는 반드시 .pcap으로 지정해야 하며, 이렇게 만들어진 파일은 어떤 네트워크 프로토콜 분석기로도 열어볼 수 있습니다.
6. 저장된 파일에서 패킷 불러와 읽기 (-r 옵션)
앞서 저장한 pcap 파일을 다시 읽어 패킷을 확인하고 분석할 수 있습니다.
$tcpdump -tttt -r data.pcap 2010-08-22 21:35:26.571793 00:50:56:9c:69:38 (oui Unknown) > Broadcast, ethertype Unknown (0xcafe), length 74: 0x0000: 0200 000a ffff 0000 ffff 0c00 3c00 0000 ............<... 0x0010: 0000 0000 0100 0080 3e9e 2900 0000 0000 ........>.)..... 0x0020: 0000 0000 ffff ffff ad00 996b 0600 0050 ...........k...P 0x0030: 569c 6938 0000 0000 8e07 0000 V.i8........ 2010-08-22 21:35:26.571797 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.50570: P 800464396:800464448(52) ack 203316566 win 71 2010-08-22 21:35:26.571800 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.50570: P 52:168(116) ack 1 win 71 2010-08-22 21:35:26.584865 IP valh5.lell.net.ssh > 11.154.12.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADC
7. DNS 대신 IP 주소로 패킷 캡처하기 (-n 옵션)
기본 상태에서 tcpdump는 호스트명(DNS) 기준으로 결과를 출력하지만, -n 옵션을 사용하면 이름 조회를 건너뛰고 실제 IP 주소를 그대로 표시해 줍니다.
$ tcpdump -n -i eth0 15:01:35.170763 IP 10.0.19.121.52497 > 11.154.12.121.ssh: P 105:157(52) ack 18060 win 16549 15:01:35.170776 IP 11.154.12.121.ssh > 10.0.19.121.52497: P 23988:24136(148) ack 157 win 113 15:01:35.170894 IP 11.154.12.121.ssh > 10.0.19.121.52497: P 24136:24380(244) ack 157 win 113
8. 사람이 읽기 쉬운 타임스탬프로 캡처하기 (-tttt 옵션)
-tttt 옵션을 추가하면 연월일까지 포함된 사람이 읽기 편한 타임스탬프 형식으로 출력됩니다.
$ tcpdump -n -tttt -i eth0 2010-08-22 15:10:39.162830 IP 10.0.19.121.52497 > 11.154.12.121.ssh: . ack 49800 win 16390 2010-08-22 15:10:39.162833 IP 10.0.19.121.52497 > 11.154.12.121.ssh: . ack 50288 win 16660 2010-08-22 15:10:39.162867 IP 10.0.19.121.52497 > 11.154.12.121.ssh: . ack 50584 win 16586
9. N바이트보다 큰 패킷만 캡처하기
greater 필터를 사용하면 지정한 바이트 수보다 큰 패킷만 골라서 받을 수 있습니다.
$ tcpdump -w g_1024.pcap greater 1024
10. 특정 프로토콜 타입의 패킷만 받기
프로토콜 종류를 조건으로 패킷을 필터링할 수도 있습니다. 지정 가능한 프로토콜에는 fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp, udp 등이 있습니다. 아래 예제는 eth0 인터페이스를 통해 흐르는 ARP 패킷만 캡처합니다.
$ tcpdump -i eth0 arp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 19:41:52.809642 arp who-has valh5.lell.net tell valh9.lell.net 19:41:52.863689 arp who-has 11.154.12.1 tell valh6.lell.net 19:41:53.024769 arp who-has 11.154.12.1 tell valh7.lell.net
11. N바이트보다 작은 패킷만 캡처하기
반대로 less 필터를 사용하면 지정한 바이트 수보다 작은 패킷만 받을 수 있습니다.
$ tcpdump -w l_1024.pcap less 1024
12. 특정 포트로 오가는 패킷만 캡처하기 (port)
특정 포트로 들어오거나 나가는 모든 패킷을 확인하고 싶다면 port 필터를 사용하면 됩니다. 아래 예제는 22번 포트(SSH) 관련 패킷만 캡처합니다.
$ tcpdump -i eth0 port 22 19:44:44.934459 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 18932:19096(164) ack 105 win 71 19:44:44.934533 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 19096:19260(164) ack 105 win 71 19:44:44.934612 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 19260:19424(164) ack 105 win 71
13. 특정 목적지 IP와 포트의 패킷 캡처하기
모든 패킷에는 출발지와 목적지의 IP 주소 및 포트 번호가 포함되어 있습니다. tcpdump에서는 이 정보를 기준으로 출발지 또는 목적지 조건을 걸어 필터링할 수 있습니다. 아래 명령은 eth0 인터페이스에서 목적지 IP가 10.181.140.216이면서 포트 번호가 22인 패킷만 캡처해 파일로 저장합니다.
$ tcpdump -w xpackets.pcap -i eth0 dst 10.181.140.216 and port 22
14. 두 호스트 간의 TCP 통신 패킷 캡처하기
서로 다른 두 머신의 프로세스가 TCP 프로토콜로 통신하고 있다면, tcpdump로 해당 통신 패킷을 그대로 잡아낼 수 있습니다.
$tcpdump -w comm.pcap -i eth0 dst 16.181.170.246 and port 22
저장된 comm.pcap 파일은 어떤 네트워크 프로토콜 분석 도구로도 열어볼 수 있으며, 잠재적인 문제를 디버깅하는 데 활용할 수 있습니다.
15. arp와 rarp를 제외한 모든 패킷 캡처하기
tcpdump에서는 and, or, not 논리 조건을 조합해 원하는 패킷만 정교하게 필터링할 수 있습니다. 아래 예제는 ARP와 RARP 패킷을 제외한 나머지 모든 패킷을 캡처합니다.
$ tcpdump -i eth0 not arp and not rarp 20:33:15.479278 IP resolver.lell.net.domain > valh4.lell.net.64639: 26929 1/0/0 (73) 20:33:15.479890 IP valh4.lell.net.16053 > resolver.lell.net.domain: 56556+ PTR? 255.107.154.15.in-addr.arpa. (45) 20:33:15.480197 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 540:1504(964) ack 1 win 96 20:33:15.487118 IP zz.domain.innetbcp.net.63897 > valh4.lell.net.ssh: . ack 540 win 16486 20:33:15.668599 IP 10.0.0.0 > all-systems.mcast.net: igmp query v3 [max resp time 1s]