análisis de un interfaz de red

Anuncio
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
PRACTICA Nº 4
ANÁLISIS DE UN INTERFAZ DE RED
OBJETIVOS
ƒ
ƒ
Realizar una aplicación en C que capture tramas de una red Ethernet, y analizar su
contenido, mostrándolo por pantalla y calculando al finalizar estadísticas del tráfico
interceptado.
Para desarrollar esta práctica se utilizará la librería C libpcap, que permite capturar
tramas Ethernet de forma independiente al sistema operativo utilizado.
Esta práctica se divide en dos partes:
1. Se plantea desarrollar un programa en C que acceda al interfaz de red del equipo y
obtenga su dirección de red y su máscara de red. Esta parte está enfocada a servir como
introducción al uso de la librería libpcap, que se utilizará para la realización de la
segunda parte de la práctica.
2. La segunda parte consiste en la implementación de un analizador de red que active el
modo promiscuo en la tarjeta de red de la estación de trabajo, y capture todas las tramas
que circulan por la red local y muestre a continuación unas estadísticas de las tramas que
ha capturado.
DESARROLLO
1.
PRIMERA PARTE
La aplicación debe ser desarrollada en Lenguaje C, utilizando la librería libpcap para capturar
tramas Ethernet.
Consiste en el desarrollo de una aplicación que acceda al interfaz de red y muestre por pantalla el
nombre del dispositivo de red que se va a analizar, su dirección IP y su máscara. No necesita que
se le introduzcan parámetros al fichero ejecutable.
2.
SEGUNDA PARTE
La aplicación debe ser desarrollada en Lenguaje C, utilizando la librería libpcap para capturar
tramas Ethernet.
Para cada trama capturada, debe obtenerse la dirección Ethernet origen y destino, así como el tipo
de paquete encapsulado.
La información encapsulada en esos paquetes también debe ser extraída: paquetes IP, ARP,
RARP, etc. En cada uno de ellos deberá extraerse la información oportuna: direcciones IP origen y
destino, en el caso de IP, y el contenido de las peticiones / respuestas ARP y RARP.
Página 1 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
Toda esta información debe ser visualizada por la salida estándar. Por ejemplo:
Wed Mar 24 21:49:07 2001
[IEEE 802.3]
Dirección origen: 00:00:f1:34:23:12
Dirección destino: ff:ff:ff:ff:ff:ff
Longitud: 60 bytes
Wed Mar 24 21:49:08 2001
[ETHERNET]
Direccion origen: 00:00:f1:34:23:11
Direccion destino: ff:ff:ff:ff:ff:ff
Longitud: 60 bytes
Tipo: 0x0806 (ARP)
[ARP]
Tipo direccion hardware: 0x0001
Tipo direccion protocolo: 0x0800
Longitud direccion hardware: 06 bytes
Longitud direccion protocolo: 04 bytes
Codigo operacion: 01 (Petici_on)
Direccion Ethernet emisor: 00:00:f1:34:23:11
Direccion IP emisor: 157.88.128.1
Direccion Ethernet objetivo: 00:00:00:00:00:00
Direccion IP objetivo: 157.88.128.3
Wed Mar 24 21:49:09 2001
[ETHERNET]
Direccion origen: 00:00:f1:34:23:11
Direccion destino: ff:ff:ff:ff:ff:ff
Longitud: 68 bytes
Tipo: 0x0800 (IP)
[IP]
Direccion origen: 157.88.128.1
Direccion destino: 157.88.128.5
Tipo: 06 (TCP)
[TCP]
Puerto origen: 2048
Puerto destino: 80
Figura 1: Formato de tramas IEEE 802.3
Página 2 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
Requisitos:
Î El programa tendrá como parámetro obligatorio de llamada el número máximo de tramas
que capturará antes de finalizar. Si este parámetro es 0, el programa se ejecutará
indefinidamente hasta que sea interrumpido por el usuario al pulsar ctrl-c. Esta
combinación de teclas hace que el sistema operativo envíe la señal de interrupción SIGINT
que deberá ser capturada por el programa para que analice la captura y se impriman los
datos estadísticos finales (antes de terminar el programa).
Î Para cada trama recibida, debe obtenerse el instante de captura (fecha y hora), la dirección
origen y destino, la longitud en bytes (formato numérico decimal) así como el tipo de
paquete encapsulado, en formato numérico hexadecimal, para el caso de trama Ethernet
(los códigos correspondientes a los tipos de paquetes se encuentran en el Anexo I). Sólo
será necesario expresar el tipo de paquete en formato texto (además del numérico
hexadecimal) para los tipos más comunes: IP, ARP y RARP. Las direcciones Ethernet
deberán presentarse como 6 grupos de 2 dígitos hexadecimales separados por ‘:’ (ejemplo
00:03:0E:12:EF:EE).
Î En el caso de que el tipo de paquete encapsulado sea ARP, deberán extraerse todos los
campos. El formato de los paquetes ARP puede verse en la Figura 2. Las direcciones IP
deberán presentarse como 4 grupos de números decimales comprendidos entre 0 y 255
separados por '.’ (ejemplo 157.88.128.15).
Î En el caso de que el tipo de paquete encapsulado sea IP, deberán extraerse las
direcciones IP origen y destino, y el protocolo encapsulado3 (en formato decimal). El
formato de los paquetes IP (cabecera) puede verse en la Figura 3.
Î En el caso de que el paquete IP transporte un segmento TCP o UDP, deberán extraerse
los números de puerto origen y destino (formato numérico decimal). El formato de los
segmentos TCP y UDP puede verse en las Figuras 4 y 5.
Figura 2: Formato de paquetes ARP
Página 3 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
Figura 3: Formato de la cabecera de un paquete IP
Figura 4: Formato de la cabecera de un segmento TCP
Figura 5: Formato de la cabecera de un segmento UCP
Página 4 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
La captura de tramas finalizará cuando el usuario presione Ctrl-C o cuando se alcance el número
máximo de tramas especificado en la llamada del sistema. El programa capturará la señal de fin de
ejecución, y antes de finalizar mostrará en pantalla unas estadísticas que contengan, al menos:
ƒ
ƒ
ƒ
Número total de tramas Ethernet capturadas, especificando el número de paquetes IP,
paquetes ARP y el de otros tipos y sus porcentajes respecto al total de tramas.
Número de paquetes TCP, UDP y otros encapsulados dentro de los paquetes IP y sus
porcentajes respecto al número total de paquetes IP.
Desglosar la información anterior por cada par de direcciones IP origen y destino.
Toda esta información deberá mostrarse por la salida estándar con el formato presentado en el
siguiente ejemplo:
Número total de tramas recibidas: 10
Número total de tramas descartadas: 0
Número total de paquetes IP: 8 (80%)
Número total de paquetes ARP: 2 (20%)
Resto de paquetes: 0 (0%)
Número total de paquetes TCP: 6 (75%)
Número total de paquetes UDP: 2 (25%)
Resto de paquetes: 0 (0%)
[157.88.128.1] <->
Número de paquetes
Número de paquetes
Resto de paquetes:
[157.88.128.3]
TCP: 4 (80%)
UDP: 1 (20%)
0
[157.88.128.3] <->
Número de paquetes
Número de paquetes
Resto de paquetes:
[157.88.128.5]
TCP: 2 (66'66%)
UDP: 1 (33'33%)
0
Tras la impresión de estas estadísticas el programa terminará.
3.
COMPILACIÓN DE PROGRAMAS
El modo promiscuo es un flag software de la tarjeta de red que, si se activa, provoca que la tarjeta
capture de la red todos las tramas, sin preocuparse de quien es el destinatario de la misma.
Normalmente este flag está desactivado, y el sistema operativo sólo recibe las tramas cuya
dirección Ethernet destino es la suya.
En los sistemas Unix, únicamente el usuario root tiene permisos para activar el modo promiscuo.
Dado que la aplicación que se va a desarrollar debe obtener permisos especiales para poder
acceder a la tarjeta de red será necesario compilarlo de forma especial. Para ello se utilizará el
comando mkpcap. La forma de utilización es la siguiente;
mkpcap fichero_ejecutable fichero_fuente_1 fichero fuente_2 ....
Aviso importante: el programa mkpcap registra las acciones del usuario. Cualquier intento de
violar la seguridad del sistema conllevará el suspenso automático de la asignatura
Página 5 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
4.
Libpcap: LIBRERÍA DE CAPTURA DE TRAMAS
Libpcap es una librería con primitivas para la captura de tramas Ethernet independiente del
sistema operativo. Permite desarrollar aplicaciones de monitorización de red, seguridad, etc
fácilmente portables a diferentes sistemas Unix.
En el Anexo II de este documento puede encontrarse la página de manual que describe las
funciones disponibles en libpcap.
Para poder utilizar las funciones debemos incluir el siguiente fichero de cabecera en nuestro código
C:
#include "pcap.h"
/* Fichero de
Cabecera de LIBPCAP */
Las funciones más interesantes se describen a continuación (ver Anexo II para una descripción
completa del interfaz de llamada):
pcap_lookupdev
Devuelve un descriptor que apunta al primer dispositivo de red del sistema. Ese descriptor
deberá ser utilizado en la llamada a otras funciones de la librería. Ejemplo:
char *dispositivo = NULL;
char buffer_error[PCAP_ERRBUF_SIZE];
[...]
dispositivo = pcap_lookupdev(buffer_error);
pcap_open_live
Devuelve un descriptor de tipo pcap, necesario para la captura de las tramas. Admite
varios parámetros, entre ellos es necesario pasarle el descriptor de dispositivo obtenido de
la salida de pcap_lookupdev. Ejemplo:
pcap_t *descriptor;
int snaplen = DEFAULT_SNAPLEN;
[...]
descriptor = pcap_open_live (dispositivo,
snaplen,0,1000,buffer_error);
pcap_open_offline
Devuelve un descriptor de tipo pcap, necesario para la captura de las tramas. Permite
utilizar como origen de datos un fichero de capturas (por ejemplo, generado con tcpdump).
Puede ser útil también para depurar el programa con gdb, al no tener que acceder a un
dispositivo de red real.
pcap_loop
Función principal de libpcap. Toma el control del programa realizando un bucle e
invocando a la rutina que indique el programador cada vez que captura una trama.
Ejemplo:
pcap_loop(descriptor, -1, ether_print,(u_char *)0)
Página 6 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
5.
ANÁLISIS DEL TRÁFICO CAPTURADO
Una vez desarrollado y depurado el programa, deberán realizarse una serie de capturas de tramas
y analizar el tráfico obtenido. Para realizar cada una de las capturas, se arrancará el programa de
captura de tramas redirigiendo la salida hacia un fichero. Por ejemplo captura_tramas >
trafico. Puede limitarse el número total de paquetes capturados si se considera necesario.
Mientras se realiza la captura, se ejecutarán algunos programas que generen tráfico en la red y se
realizarán operaciones con ellos. En concreto, deberán realizarse pruebas con los siguientes (una
o varias capturas por cada programa):
ƒ telnet
ƒ ftp
ƒ un programa que transfiera datos entre dos máquinas sin necesidad de establecer una
conexión TCP, por ejemplo tftp (consultar la página de manual de este programa para
ver las opciones). Intentar recibir un fichero mediante este programa (no importa que se
produzcan errores).
Repetir las capturas anteriores con distintas máquinas (locales de la universidad y remotas,
aunque no respondan a los programas).
6.
NORMAS PARA EL DESARROLLO DE LA PRÁCTICA
Será necesario entregar una memoria detallada por parejas o de forma individual, explicando
su diseño, desarrollo y ejecución. Un ejemplo de la tabla de contenidos del documento puede ser:
1. Introducción.
2. Diseño de la aplicación.
1. Módulo X: xxx.h y xxx.c
2. Módulo Y: yyy.h e yyy.c
3. [...]
3. Utilización de la aplicación (Forma de Ejecución)
4. Ejemplos de capturas y de estadísticas ofrecidas.
5. Explicación de problemas encontrados durante el desarrollo y su solución.
6. Anexo enumerando las mejoras optativas introducidas en la práctica, explicando por qué
se ha elegido esas mejoras y no otras, y estimando el esfuerzo de desarrollo de las mismas.
7. Fecha de entrega y revisión
La entrega y revisión de la práctica se realizará los días 22 y 23 de Abril. Cada alumno entregará y
revisará la práctica de forma individual en el turno de prácticas que le corresponda durante esa
semana, los alumnos pertenecientes al turno B se repartirán de la siguiente manera:
• Los apellidos que empiezan con letra < M Æ Turno del grupo A
• Los apellidos que empiezan con letra >= M Æ Turno del grupo C
Página 7 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
Anexo I
Tipos correspondientes a los protocolos encapsulados de una trama
Ethernet
La información de esta sección ha sido extraída del RFC 1370. Los tipos que aparecerán
normalmente son el 0x0800 (IP), 0x0806 (ARP) y 0x8035 (RARP)
Ethernet
Type field
---------------------decimal
Hex
000
0000-05DC
257
0101-01FF
512
0200
513
0201
1536
0600
2048
0800
2049
0801
2050
0802
2051
0803
2052
0804
2053
0805
2054
0806
2055
0807
2076
081C
2184
0888-088A
2304
0900
2560
0A00
2561
0A01
2989
0BAD
4096
1000
4097
1001-100F
5632
1600
16962
4242
21000
5208
24576
6000
24577
6001
24578
6002
24579
6003
24580
6004
24581
6005
24582
6006
24583
6007
24584
6008-6009
24586
6010-6014
28672
7000
28674
7002
28704
7020-7029
28720
7030
28724
7034
32771
8003
32772
8004
32773
8005
32774
8006
Description
----------IEEE802.3 Length Field
Experimental
XEROX PUP (see 0A00)
PUP Addr Trans (see 0A01)
XEROX NS IDP
DOD IP
X.75 Internet
NBS Internet
ECMA Internet
Chaosnet
X.25 Level 3
ARP
XNS Compatability
Symbolics Private
Xyplex
Ungermann-Bass net debugr
Xerox IEEE802.3 PUP
PUP Addr Trans
Banyan Systems
Berkeley Trailer nego
Berkeley Trailer encap/IP
Valid Systems
PCS Basic Block Protocol
BBN Simnet
DEC Unassigned (Exp.)
DEC MOP Dump/Load
DEC MOP Remote Console
DEC DECNET Phase IV Route
DEC LAT
DEC Diagnostic Protocol
DEC Customer Protocol
DEC LAVC, SCA
DEC Unassigned
3Com Corporation
Ungermann-Bass download
Ungermann-Bass dia/loop
LRT
Proteon
Cabletron
Cronus VLN
Cronus Direct
HP Probe
Nestar
Página 8 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
32776
32784
32787
32788
32789
32790
32793
32815
32816
32821
32822
32824
32825
32829
32830
32831
32832
32836
32838
32839
32841
32859
32860
32861
32864
32866
32869
32871
32872
32873
32874
32876
32877
32878
32890
32891
32892
32893
32896
32897
32923
32924
32927
32931
32932
32960
32966
32967
32968
32973
32974
32979
32981
32989
8008
8010
8013
8014
8015
8016
8019
802E
802F
8035
8036
8038
8039-803C
803D
803E
803F
8040-8042
8044
8046
8047
8049
805B
805C
805D
8060
8062
8065-8066
8067
8068
8069
806A
806C
806D
806E-8077
807A
807B
807C
807D-807F
8080
8081-8083
809B
809C-809E
809F
80A3
80A4-80B3
80C0-80C3
80C6
80C7
80C8-80CC
80CD-80CE
80CF-80D2
80D3-80D4
80D5
80DD
AT&T
Excelan
SGI diagnostics
SGI network games
SGI reserved
SGI bounce server
Apollo Computers
Tymshare
Tigan, Inc.
Reverse ARP
Aeonic Systems
DEC LANBridge
DEC Unassigned
DEC Ethernet Encryption
DEC Unassigned
DEC LAN Traffic Monitor
DEC Unassigned
Planning Research Corp.
AT&T
AT&T
ExperData
Stanford V Kernel exp.
Stanford V Kernel prod.
Evans & Sutherland
Little Machines
Counterpoint Computers
Univ. of Mass. @ Amherst
Veeco Integrated Auto.
General Dynamics
AT&T
Autophon
ComDesign
Computgraphic Corp.
Landmark Graphics Corp.
Matra
Dansk Data Elektronik
Merit Internodal
Vitalink Communications
Vitalink TransLAN III
Counterpoint Computers
Appletalk
Datability
Spider Systems Ltd.
Nixdorf Computers
Siemens Gammasonics Inc.
DCA Data Exchange Cluster
Pacer Software
Applitek Corporation
Intergraph Corporation
Harris Corporation
Taylor Instrument
Rosemount Corporation
IBM SNA Service on Ether
Varian Associates
Página 9 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
32990
32992
32996
33010
33011
33012
33015
33023
33031
33072
33073
33079
33081
33100
36864
36865
36866
36867
65280
80DE-80DF
80E0-80E3
80E4-80F0
80F2
80F3
80F4-80F5
80F7
80FF-8103
8107-8109
8130
8131
8137-8138
8139-813D
814C
9000
9001
9002
9003
FF00
Integrated Solutions TRFS
Allen-Bradley
Datability
Retix
AppleTalk AARP (Kinetics)
Kinetics
Apollo Computer
Wellfleet Communications
Symbolics Private
Waterloo Microsystems
VG Laboratory Systems
Novell, Inc.
KTI
SNMP
Loopback
3Com(Bridge) XNS Sys Mgmt
3Com(Bridge) TCP-IP Sys
3Com(Bridge) loop detect
BBN VITAL-LanBridge cache
Anexo II
Página de manual de Libpcap
PCAP(3)
PCAP(3)
NAME
pcap - Packet Capture library
SYNOPSIS
#include <pcap.h>
pcap_t *pcap_open_live(char *device, int snaplen,
int promisc, int to_ms, char *ebuf)
pcap_t *pcap_open_offline(char *fname, char *ebuf)
pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname)
char errbuf[PCAP_ERRBUF_SIZE];
char *pcap_lookupdev(char *errbuf)
int pcap_lookupnet(char *device, bpf_u_int32 *netp,
bpf_u_int32 *maskp, char *errbuf)
int pcap_dispatch(pcap_t *p, int cnt,
pcap_handler callback, u_char *user)
int pcap_loop(pcap_t *p, int cnt,
pcap_handler callback, u_char *user)
void pcap_dump(u_char *user, struct pcap_pkthdr *h,
u_char *sp)
int pcap_compile(pcap_t *p, struct bpf_program *fp,
char *str, int optimize, bpf_u_int32 netmask)
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
Página 10 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
int pcap_datalink(pcap_t *p)
int pcap_snapshot(pcap_t *p)
int pcap_is_swapped(pcap_t *p)
int pcap_major_version(pcap_t *p)
int pcap_minor_version(pcap_t *p)
int pcap_stats(pcap_t *p, struct pcap_stat *ps)
FILE *pcap_file(pcap_t *p)
int pcap_fileno(pcap_t *p)
void pcap_perror(pcap_t *p, char *prefix)
char *pcap_geterr(pcap_t *p)
char *pcap_strerror(int error)
void pcap_close(pcap_t *p)
void pcap_dump_close(pcap_dumper_t *p)
DESCRIPTION
The Packet Capture library provides a high level interface
to packet capture systems. All packets on the network,
even those destined for other hosts, are accessible
through this mechanism.
ROUTINES
pcap_open_live() is used to obtain a packet capture
descriptor to look at packets on the network. device is a
18 October 1997
PCAP(3)
1
PCAP(3)
string that specifies the network device to open. snaplen
specifies the maximum number of bytes to capture. promisc
specifies if the interface is to be put into promiscuous
mode.
(Note that even if this parameter is false, the
interface could well be in promiscuous mode for some other
reason.)
to_ms specifies the read timeout in millisec
onds. ebuf is used to return error text and is only set
when pcap_open_live() fails and returns NULL.
pcap_open_offline() is called to open a ``savefile'' for
reading. fname specifies the name of the file to open.
The file has the same format as those used by tcpdump(1)
and tcpslice(1). The name "-" in a synonym for stdin.
ebuf is used to return error text and is only set when
pcap_open_offline() fails and returns NULL.
Página 11 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
pcap_dump_open() is called to open a ``savefile'' for
pcap_dump_open() is called to open a ``savefile'' for
writing. The name "-" in a synonym for stdout. NULL is
returned on failure. p is a pcap struct as returned by
pcap_open_offline() or pcap_open_live(). fname specifies
the name of the file to open.
If NULL is returned,
pcap_geterr() can be used to get the error text.
pcap_lookupdev() returns a pointer to a network device
suitable for use with pcap_open_live() and pcap_lookup
net().
If there is an error, NULL is returned and errbuf
is filled in with with an appropriate error message.
pcap_lookupnet() is used to determine the network number
and mask associated with the network device device. Both
netp and maskp are bpf_u_int32 pointers. A return of -1
indicates an error in which case errbuf is filled in with
with an appropriate error message.
pcap_dispatch() is used to collect and process packets.
cnt specifies the maximum number of packets to process
before returning. A cnt of -1 processes all the packets
received in one buffer. A cnt of 0 processes all packets
until an error occurs, EOF is reached, or the read times
until an error occurs, EOF is reached, or the read times
out (when doing live reads and a non-zero read timeout is
specified). callback specifies a routine to be called
with three arguments: a u_char pointer which is passed in
from pcap_dispatch(), a pointer to the pcap_pkthdr struct
(which precede the actual network headers and data), and a
u_char pointer to the packet data. The number of packets
read is returned. Zero is returned when EOF is reached in
a ``savefile.'' A return of -1 indicates an error in which
case pcap_perror() or pcap_geterr() may be used to display
the error text.
pcap_dump() outputs a packet to the ``savefile'' opened
with pcap_dump_open().
Note that its calling arguments
are suitable for use with pcap_dispatch().
18 October 1997
PCAP(3)
2
PCAP(3)
pcap_compile() is used to compile the string str into a
filter program.
program is a pointer to a bpf_program
struct and is filled in by pcap_compile(). optimize con
trols whether optimization on the resulting code is per
Página 12 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
formed.
netmask specifies the netmask of the local net.
pcap_setfilter() is used to specify a filter program.
fp
is a pointer to an array of bpf_program struct, usually
the result of a call to pcap_compile(). -1 is returned on
failure; 0 is returned on success.
pcap_loop() is similar to pcap_dispatch() except it keeps
reading packets until cnt packets are processed or an
error occurs. It does not return when live read timeouts
occur. Rather, specifying a non-zero read timeout to
pcap_open_live() and then calling pcap_dispatch() allows
the reception and processing of any packets that arrive
the reception and processing of any packets that arrive
when
the
timeout
occurs.
A negative cnt causes
pcap_loop() to loop forever (or at least until an error
occurs).
pcap_next() returns a u_char pointer to the next packet.
pcap_datalink()
DLT_EN10MB.
returns
the
link
layer
type,
e.g.
pcap_snapshot() returns the snapshot length specified when
pcap_open_live was called.
pcap_is_swapped() returns true if the current ``savefile''
uses a different byte order than the current system.
pcap_major_version() returns the major number of the
sion of the pcap used to write the savefile.
ver
pcap_minor_version() returns the major number of the ver
sion of the pcap used to write the savefile.
pcap_file() returns the name of the ``savefile.''
int pcap_stats() returns 0 and fills in a pcap_stat
struct. The values represent packet statistics from the
start of the run to the time of the call. If there is an
error or the under lying packet capture doesn't support
packet statistics, -1 is returned and the error text can
be obtained with pcap_perror() or pcap_geterr().
pcap_fileno()
``savefile.''
returns
the
file descriptor number of the
pcap_perror() prints the text of the
error on stderr, prefixed by prefix.
pcap_geterr()
returns
the
error
last
pcap
library
text pertaining to the
Página 13 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
18 October 1997
3
PCAP(3)
PCAP(3)
last pcap library error.
pcap_strerror() is
available.
provided
in
case
strerror(1)
isn't
pcap_close() closes the files associated with p and deal
locates resources.
pcap_dump_close() closes the ``savefile.''
SEE ALSO
tcpdump(1), tcpslice(1)
AUTHORS
Van Jacobson, Craig Leres and Steven McCanne, all of the
Lawrence Berkeley National Laboratory, University of Cali
fornia, Berkeley, CA.
The current version is available via anonymous ftp:
ftp://ftp.ee.lbl.gov/libpcap.tar.Z
BUGS
Please send bug reports to [email protected].
Anexo III
Tipos de datos usados por Libpcap
typedef struct pcap pcap_t;
/* Each packet in the dump file is prepended with this generic header.
* This gets around the problem of different headers for different
* packet interfaces. */
struct pcap_pkthdr {
struct timeval ts;
/* time stamp */
bpf_u_int32 caplen;
/* length of portion present */
bpf_u_int32 len;
/* length this packet (off wire) */
};
/* As returned by the pcap_stats() */
struct pcap_stat {
u_int ps_recv;
/* number of packets received */
u_int ps_drop;
/* number of packets dropped */
u_int ps_ifdrop; /* drops by interface XXX not yet supported */
Página 14 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
AYUDAS
Función pcap_loop (para obtener el instante de tiempo):
Para obtener el instante de tiempo en la rutina (callback) que se llama a
partir de PCAP_LOOP, debéis buscarlo en el segundo parámetro (pkthdr) de
la siguiente forma (mediante la función ctime):
pcap_loop(descr,numpackets,callback,args);
callback(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char*
packet)
{
printf("\n%s",ctime(&((*pkthdr).ts.tv_sec)));
}
Más información en:
http://publib16.boulder.ibm.com/pseries/en_US/libs/basetrf1/pcap_loop.htm
#a05520ksq
Función signal:
Para recoger el CTRL+C durante la ejecución de la parte b de la práctica
4, es necesario utilizar la librería <signal.h>, de forma que antes de
abrir el interfaz de red, preparéis el programa para recibir un CRTL+C,
por ejemplo con:
signal(SIGINT, escape)
Y definiendo la función escape como;
void escape (int sig)
/*aquí se llega después del control-c*/
{
/*Lógicamente no devuelve nada.*/
printf("\nHe recibido Ctrl-C\n");
pcap_close(descr);
fprintf(stdout,"\nFinalizado\n");
exit(1);
}
Listas enlazadas:
http://www.elrincondelc.com/cursoc/cursoc22.html
http://www.infor.uva.es/~benja/practica2.html
http://www.hci.uniovi.es/martinDocencia/DSTool/ListPage.htm
Página 15 de 16
Escuela Politécnica Superior de Elche
Ingeniería de Telecomunicación
Ingeniería de
Telecomunicación
Arquitectura de Redes, Sistemas y Servicios
Función inet_ntoa:
Para la primera parte de esta práctica, os puede ser de utilidad la
función inet_ntoa, la cual convierte un valor decimal de 32 bits en el
formato decimal punto (como cadena de caracteres) en el que normalmente
se expresan las direcciones IP.
La definición de la función y los tipos de datos que utiliza es la
siguiente:
#include <netinet/in.h>
#include <arpa/inet.h>
char *inet_ntoa(inaddr)
struct in_addr inaddr;
struct in_addr {
u_long s_addr;
};
Un ejemplo de su utilización:
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
bpf_u_int32 dir_IP, mascara; /* dirección ip y su mascara*/
struct in_addr direccion;
/* obtenemos la dirección de red con las funciones pcap_lookupdev
y pcap_lookupnet */
pcap_lookupdev (……)
ret = pcap_lookupnet(…,&dir_IP,&mascara,……);
/* ahora en las variables “dir_IP” y “mascara” tenemos un decimal
que expresa la dirección de red y su correspondiente máscara, si
imprimimos estas variables con prinf y formato %d, visualizaremos este
número, pero como queremos que aparezca con formato decimal punto,
usamos la función inet_ntoa: */
direccion.s_addr = dir_IP;
red = inet_ntoa(direccion);
/* Por tanto en la variable “red” ahora tendremos una cadena de
caracteres que representa la dirección ip de red. En el caso de la
máscara, los pasos a seguir son los mismos */
[……………]
}
Esto lo utilizaremos muy a menudo en la parte de sockets (últimas
prácticas de la asignatura).
Otra posibilidad es que creéis una función que pase un entero decimal a
binario y separe los cuatro grupos de 8 bits de una dirección IP.
Página 16 de 16
Descargar