시작...

블로그 이미지
mutjin

Article Category

분류 전체보기 (148)
기록 (3)
개발새발 (8)
2010년 이전 글 (133)

Recent Post

Recent Comment

Recent Trackback

Calendar

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Archive

My Link

  • Total
  • Today
  • Yesterday

1. tcpdump
 

 

 

 

tcpdump는 네트워크 인테페이스 상에 있는 패킷중에서 명시된 expression에 일치하는 것만을 선별하여 그 패킷의 헤더 정보를 보여주는 도구 이다.
이프로그램을 컴파일하여 설치하기 위해서는 libpcab(packet capture library)이 먼저 설치되어있어야 한다.

참고로 시모무라 소토무가 케빈 미트닉을 잡을 때 사용했던 프로그램으로도 유명하다.
이프로그램은 네트워크 상에서 돌아다니는 모든 패킷을 캡처함으로서 여러분들에게 유용한 정보를 보여준다.

 

 

 

2.소스 가져오기
 

 

 

 

 

 

 

3. 설치
 

 

 

 

 libpcap-0.6.2설치

shell> gunzip libpcap-0.6.2.tar.gz
shell> tar xvf libpcap-0.6.2.tar
libpcap-0.6.2/./
libpcap-0.6.2/./CVS/
libpcap-0.6.2/./CVS/Root
libpcap-0.6.2/./CVS/Repository
libpcap-0.6.2/./CVS/Entries
libpcap-0.6.2/./CVS/Tag

<생략>

shell> ./configure
creating cache ./config.cache
checking host system type... i586-pc-linux-gnu
checking target system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu

<생략>
shell> make
gcc -O2 -I.  -DHAVE_CONFIG_H -c ./pcap-linux.c
gcc -O2 -I.  -DHAVE_CONFIG_H -c ./pcap.c
gcc -O2 -I.  -DHAVE_CONFIG_H -c ./inet.c

<생략>
shell> make install
[ -d /usr/local/lib ] || \
    (mkdir -p /usr/local/lib; chmod 755 /usr/local/lib)
/usr/bin/install -c -m 644 libpcap.a /usr/local/lib/libpcap.a ranlib /usr/local/lib/libpcap.a
[ -d /usr/local/include ] || \
    (mkdir -p /usr/local/include; chmod 755 /usr/local/include)

/usr/bin/install -c -m 644 ./pcap.h /usr/local/include/pcap.h
/usr/bin/install -c -m 644 ./pcap-namedb.h \
    /usr/local/include/pcap-namedb.h
[ -d /usr/local/include/net ] || \
    (mkdir -p /usr/local/include/net; chmod 755/usr/local/include/net)
/usr/bin/install -c -m 644 ./bpf/net/bpf.h \
    /usr/local/include/net/bpf.h
[ -d /usr/local/man/man3 ] || \
        (mkdir -p /usr/local/man/man3; chmod 755/usr/local/man/man3)
/usr/bin/install -c -m 644 ./pcap.3 \
    /usr/local/man/man3/pcap.3

shell> 

 

 tcpdump-3.6.2설치

shell> gunzip tcpdump-3.6.2.tar.gz
shell> tar xvf tcpdump-3.6.2.tar
tcpdump-3.6.2/./
tcpdump-3.6.2/./CVS/
tcpdump-3.6.2/./CVS/Root
tcpdump-3.6.2/./CVS/Repository
tcpdump-3.6.2/./CVS/Entries
tcpdump-3.6.2/./CVS/Tag
<생략>
shell> cd tcpdump-3.6.2
shell> ./configure
creating cache ./config.cache
checking host system type... i586-pc-linux-gnu
checking target system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu
checking for gcc... gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
<생략>
shell> make
gcc -O2 -DHAVE_CONFIG_H -I. -I../libpcap-0.6.2  -I./missing -I/usr/local/ssl/inc
lude -I/usr/local/ssl/include/openssl -c ./tcpdump.c
gcc -O2 -DHAVE_CONFIG_H -I. -I../libpcap-0.6.2  -I./missing -I/usr/local/ssl/inc
lude -I/usr/local/ssl/include/openssl -c ./print-arp.c
gcc -O2 -DHAVE_CONFIG_H -I. -I../libpcap-0.6.2  -I./missing -I/usr/local/ssl/inc lude -I/usr/local/ssl/include/openssl -c ./print-atalk.c
<생략>
shell> make install
[ -d /usr/local/sbin ] || \
    (mkdir -p /usr/local/sbin; chmod 755 /usr/local/sbin)
/usr/bin/install -c tcpdump /usr/local/sbin/tcpdump
[ -d /usr/local/man/man1 ] || \
    (mkdir -p /usr/local/man/man1; chmod 755/usr/local/man/man1)
/usr/bin/install -c -m 644 ./tcpdump.1 /usr/local/man/man1/tcpdump.1
shell>

 

 

 

4. 사용법
 

 

 

 

tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]  [ expression ]

 <Option>

-a :

Network & Broadcast 주소들을 이름들로 바꾼다.

-c :

Number : 제시된 수의 패킷을 받은 후 종료한다

-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 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.

-i device :

어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한다(이 때 loopback은 제외된다).

-l :

표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.

-n :

모든 주소들을 번역하지 않는다(port,host address 등등)

-N :

호스트 이름을 출력할 때, 도메인을 찍지 않는다.

-O :

packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.

-p :

인터페이스를 promiscuous mode로 두지 않는다.

-q :

프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.

-r <file>:

패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다.

-s <spaplen>:

패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.

-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'보다 좀 더 많은 정보들을 출력한다.

-w :

캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.

-x :

각각의 패킷을 헥사코드로 출력한다.

<expression>

expression은 패킷을 선택적으로 캡처하기 위한 조건을 적는 부분이다. expression이 없다면 네트워크상의 모든 패킷을 캡처하여 보여 주며expression이 정의 되어있다면 이 expression을 참으로 하는 패킷만을 선별하여 보여준다. expression은 하나이상이 primitives로 구성되며, primitives는 일반적으로qualifer을 앞에 내세운 id(이름이나 숫자)로 구성된다.

[Qualifier]

type :

id(이름이나 숫자)가 어떠한 의미를 가지는지를 알려준다. 가능한 type으로는 host, net, port가 있다.

 

ex) " host foo", "net 123.4", "port 23"      특별한 qualifier가 정해져 있지 않으면 "host"로 가정한다.

dir   :

전송방향을 결정한다. 가능한 방향은 "src", "dst", "src or dst", "src and dst"이다

 

ex) "src foo", "dst net 123.4", "src or dst port ftp"   특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

proto :

특정한 프로토콜의 패킷만을 받아들이게 한다. 가능한 proto로는 "either", "fddi", "ip" ,"arp", "rarp", "decnet", "lat", "sca", "moprd", "mopdl", "tcp","udp"가 있다.

 

ex) "either src foo", "arp net 123.4", "tcp port 23" 특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

[primitives]

dst host <host> :

패킷의목적지 필드에 있는 IP주소와 <host> (hostname, name 둘다 가능)가 일치하면 참.

src host <host> :

패킷의 발신지 필드에 있는 IP주소와 <host> (hostname, name 둘다 가능)가 일치하면 참.

host <host> :

패킷의 목적지 IP나 발싲니 IP중 어느하나라도 <host>와 일치하면 참.

ether dst <ehost> :

패킷의 목적지 ethernet 주소(48bit의 주소로 일반적으로 X:X:X:X:X;X로 표시된다.여기서 X는 16진수)가<ehost>와 일치하면 참

ether dst <ehost> :

패킷의 목적지 ethernet 주소가  <ehost>와 일치하면 참.

gateway <ehost> :

 <host>가 gateway로 쓰일 때 참. 즉, ethernet발신지 혹은 목적지 주소는 <host>이나 IP 발신지 혹은 목적지 주소로 <host>는 될 수 없다는 것을 의미한다. <host>는 반드시 /etc/hosts와 /etc/ethers에서 찾을 수 있어야 한다.이 expression은 "ether host <ehost> and not host <host>"와 동일한 의미를 가진다.

dst net <net> :

패킷의 IP목적지 주소가 <net>과 동일한 테트워크 번호(network number)를 가지면 참.

 

src net <net> : 패킷의 IP발신지 주소가 <net>과 동일한 테트워크 번호(network number)를 가지면 참.

net <net> :

패킷이 IP목적지 혹은 발신지 주소 둘 중 어느 하나라도 <net>과 동일한 network number를 가지면 참 .

net <net> mask <mask> :

IP주소가 지정된 netmask(<mask>)를 통하여 network number <net>와 일치하면 참.

net <net>/<len> :

IP주소가 network number <net>과 netmaks의 <len>비트만큼 일치하면 참.

dst port <port> :

패킷이 IP혹은 UDP 이면서 목적지 port값으로 <port>를 가지고 있다면 참. <port>는 숫자나 /etc/services에 정의 되어있는 port이름을 사용할 수 있다.

src port <port> :

패킷이 IP혹은 UDP 이면서 발신지 port값으로 <port>를 가지고 있다면 참.

port <port> :

패킷의 목적지 혹은 발신지 port값에서 둘주 어느하나라도 <port>와 같으면 참이된다. 위의 port expression들은 "tcp"나 "udp"와 함께쓰일 수 있다.
  ex) tcpdump tcp src port 23  -tcp패킷중에서 발신지 port 23인 것만 검출하여 보내준다.

less <length> :

패킷의 길이가 <length>Byte보다 작거나 같으면 참이된다.

greater <length> :

패킷의 길이가 <length>Byte보다 크거나 같으면 참이된다.

ip proto <protocol> :

패킷이 <protocol> protocol형태의 ip패킷이면 참. <protocol>에는 icmp, igrp, udp , tcp이름이 들어갈 수 있다. tcp, udp,icmp는 키워드로도 사용되기 때문에 <protocol>의 값이 되기 위해서는 앞에 backslash를 붙여준다.

ether broadcast :

패킷이 ethernet broadcast패킷이면 참. "ehter" keyword는 생략 가능.
ip broadcast : 패킷이 ip broadcast패킷이면 참.

ether multicast :

패킷이 ethernet multicast 패킷이면 참이된다. "ether"keyword 는 생략가능.

ip multicast :

패킷이 ip multicast패팃이면 참.

ether proto <protocol> :

패킷이 <protocol>의 ether형태라면 참. <protocol>의값으로는 숫자나 ip, arp, rarp와 같은 이름이 될수있다.

decnet src <host> :

DECNET발신지 주소가 <host>이면 참이 된다. <host>의 값으로는 "10.123"나 DECNET호스트 이름이 될수있다.

decnet dst <host> :

DECNET목적지 주소가 <host>이면 참.

decnet host <host> :

DECNET목적지혹은 발신지 주소중에서 어느 하나라도 <host>와 일치하면 참.

ip, arp, rarp, decnet :

"ether proto <p>"의 축약형이다. 여기서 <p>값은 위의 protocol중의 하나가된다.

tcp, udp, icmp :

"ip proto <p>"의 축약형이다. 여기서 <p>값은 위의 protocol중 하나가된다.

간단한 expression들을 다음의 관계연산자를 통하여 묶음으로서 더욱 복잡한 filter expression을 구성할 수 있다.

    Nagation : "!", "not"
    Concatenation : "&&", "and"
    Alternation : "||", "or"

 

 

 

 

5. tcp_dump의 사용
 

 

 

 

 

shell> tcpdump -t
tcpdump: listening on eth0
0:a0:c9:4:2e:48 sap c4 > 0:60:b0:f2:5f:b sap b4 sabme/Plen=43
arp who-has 143.248.1.200 (6:6b:e8:c0:4:11) tell kaist-gw.kaist.ac.kr
211.205.0.142.1432 > gaya.kaist.ac.kr.telnet: . ack 4254948997 win 15826 (DF)
gaya.kaist.ac.kr.telnet > 211.205.0.142.1432: P 1:93(92) ack 0 win 32522 (DF)
arp who-has ns.kaist.ac.kr tell gaya.kaist.ac.kr
arp reply ns.kaist.ac.kr is-at 8:0:20:cc:66:1f
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17263+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17263 NXDomain*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17264+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17264*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17265+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17265 NXDomain[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17266+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17266*[|domain] (DF)

Example 1)
(1. icmp패킷만 출력한다. 2. 패킷의 수신지 혹은 발신지가apple 인 것을 출력한다. 3. 패킷의 수신지 혹은 발신지가 sun이나 moon이면 출력하지 않는다.)

    shell> tcpdump ip proto '\icmp && host apple && !(sun || moon)'
    or
    shell> tcpdump ip proto \\icmp and host apple and not \(sun || moon \))

Example 2)
패킷의 발신지가apple이고 수신지는 banana가 아닌 패킷을 출력한다.

    shell> tcpdump src host apple and not dst host banana

 Example 3)
echo requests/replies가 아닌 모든 ICMP패킷을 출력한다.

    shell> tcpdump 'icmp[0] != 8 and icmp[0] != 0"

Example 4)
(tcp 프로토콜 통신에서 123.45.67.89가 수신지나 발신지가 아닌 모든 SYN , FIN 패킷을 출력한다)

    shell> tcpdump 'tcp[13] & 3 != 0 and not net 123.45.67.89'

     

     

    **********************************8

    위의 내용은 초고속연구망실무자 협의회에서 발췌한 글이며..

    저작권 문제가 있을경우 바로 삭제 하겠습니다.

'2010년 이전 글 > computer' 카테고리의 다른 글

한글 putty 0.58  (1) 2008.11.04
TCPDUMP 사용법  (0) 2007.10.30
블루스크린 ErrorCode Define 값입니다.  (0) 2007.09.21
HP-UX 쉘 명령어 총정리  (0) 2007.08.22
gcc와 make 강좌  (0) 2007.05.01
and