검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/네트워크와 보안
참조 원문: Unix: Gaining network insights with tcpdump

  tcpdump는 들어온 패킷(더 정확히는 "프레임")을 잡아 내용을 볼 수 있는 "스니퍼"입니다. 기본적으로 로컬 머신에 들어온 모든 트래픽을 볼 수 있는 promiscuous mode로 동작하는데 이 상태에서는 목적지가 로컬 머신이 아닌 트래픽도 모두 잡아서 볼 수 있습니다. 이 기능을 꺼서 자신이 적절한 목적지인 트래픽만 보고 싶다면 -p 옵션을 주면 됩니다. 여담으로 -p가 "promiscuous를 켜라"가 아니라 "promiscuous를 꺼라"라는 의미라서 좀 햇갈리죠.

  만약 tcpdump를 실행했을 때 "No suitable driver found"라는 메시지와 함께 종료된다면 root 권한이 없어서 그런 겁니다. 안타깝게도 이 프로그램을 사용하려면 root 권한이 필요하죠.

  일단 실행에 성공하면 엄청난 내용들이 화면에 가득하게 됩니다. 심지어 트래픽이 거의 없는 네트워크라도 말이죠. 그래서 옵션이 중요합니다. 먼저 알아볼 옵션은 원하는 개수의 패킷(정확히는 "프레임")만 출력하고 종료하는 겁니다. -c (숫자) 옵션을 주면 수집할 프레임의 개수를 정할 수 있습니다.
# tcpdump -c 2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
13:40:11.368233 IP xyz-boson-1.particles.com.ssh > 10.2.230.115.58774: P 3706680
062:3706680258(196) ack 474521172 win 71
13:40:11.368501 IP 10.20.30.115.58774 > xyz-boson-1.particles.com.ssh: . ack 196
 win 255
2 packets captured
5 packets received by filter
0 packets dropped by kernel
  출력된 프레임의 내용 중 첫 번째 항목은 시간입니다. 위에서 13:40:11.507360에 해당하는 부분이죠. 그 뒤에는 출발지(>의 왼쪽)와 목적지(>의 오른쪽) 및 패킷의 내용이 있습니다.

  패킷을 파일로 캡쳐해서 나중에 다시 볼 수도 있습니다. 아래는 10개의 패킷을 캡쳐해서 /tmp/c10 파일에 저장하는 모습입니다.
# tcpdump -c 10 -w /tmp/c10
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10 packets captured
12 packets received by filter
0 packets dropped by kernel
  이렇게 만든 파일은 아래의 방법으로 읽을 수 있습니다.
# tcpdump -r /tmp/c10
  이러면 저장했던 내용을 모두 읽습니다.

  -i 옵션을 통해 사용할 인터페이스를 지정할 수 있습니다.
# tcpdump -c 10 -w /tmp/c10 -i bond0
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 96 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel
  -D 옵션을 사용하면 패킷을 수집할 수 있는 인터페이스 목록을 보여줍니다.
# tcpdump -D
1.eth0
2.bond0
3.eth1
4.any (모든 인터페이스를 캡쳐하는 가상 장치)
5.lo
  수집할 패킷의 출발지나 목적지(또는 둘 다)를 지정하는 것도 가능합니다. 다만 출발지를 10.20.30.40로 지정하고 목적지를 10.20.30.50으로 지정했다면 10.20.30.50이 10.20.30.40에게 응답하는 패킷을 볼 수 없습니다. 서로의 역할이 뒤바꼈기 때문이죠. 특정 시스템으로 향하거나 그곳으로부터 오는 것을 모두 볼 때는 "host"라는 단어를 사용할 수도 있습니다.
# tcpdump -c 100 src fermion.particles.org
# tcpdump host boson.particles.org -w /tmp/boson$$
  비슷한 명령어를 통해 출발 포트나 목적 포트를 지정하는 것도 가능합니다. 아래의 예는 로컬 웹 서버로 가는 트래픽을 수집합니다.
# tcpdump -i bond0 dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on bond0, link-type EN10MB (Ethernet), capture size 96 bytes
14:38:13.301801 IP nagios.particles.com.59344 > www.particles.org.http: S 3558234
391:3558234391(0) win 5840 <mss 1460,sackOK,timestamp 3398452148 0,nop,wscale 7>
14:38:13.301900 IP nagios.particles.com.59344 > www.particles.org.http: . ack 231
4423727 win 46 <nop,nop,timestamp 3398452148 2437740292>
  수집하는 패킷을 어떤 모습으로 출력시킬지도 선택할 수 있습니다. 아래는 수집한 패킷을 헥스와 ASCII 형태로 모두 출력하고 있습니다.
# tcpdump -i bond0 -c 1 -XX
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on bond0, link-type EN10MB (Ethernet), capture size 96 bytes
17:38:31.570524 IP xyz-boson-1.particles.com.ssh > 10.20.30.115.54669: P 3162608
328:3162608524(196) ack 830478067 win 80
        0x0000:  0000 0c07 ac01 782b cb5f a949 0800 4510  ......x+._.I..E.
        0x0010:  00ec 3cc6 4000 4006 0025 0a01 029b 0a02  ..<.@.@..%......
        0x0020:  e673 0016 d58d bc81 92c8 3180 16f3 5018  .s........1...P.
        0x0030:  0050 33c4 0000 8775 514e a605 e7f7 505c  .P3....uQN....P\
        0x0040:  f6e6 559e 3bc7 2317 f28d 9a29 8798 cf04  ..U.;.#....)....
        0x0050:  b4a7 36f0 30e9 89d1 1da0 0860 3bb7 cfed  ..6.0......`;...
2015/03/03 15:12 2015/03/03 15:12