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