LABORATORIO DE REDES PRÁCTICA 2 MONITORIZACIÓN DEL TRÁFICO DE RED MEDIANTE LA HERRAMIENTA tcpdump 1. INTRODUCCIÓN Una de las actividades más comunes en la administración de una red es la del análisis del tráfico que fluye por ella, ya sea para analizar el rendimiento de la red o para analizar la seguridad de las comunicaciones. No sólo puede interesar analizar el tráfico de la LAN en la que se encuentra un ordenador, sino que también puede interesar analizar el tráfico entrante y saliente de Internet a través de los servicios que se tengan instalados (proxies, firewalls, etc.). Este análisis de tráfico puede ser útil para la detección de problemas y, sobre todo, para detectar tráfico no esperado, presencia de puertas traseras, escaneos de puertos y cualquier otra intrusión. Existen varias herramientas muy útiles dependiendo del Sistema Operativo o del tipo de red. Una de estas herramientas es tcpdump que actúa como un sniffer de red, basada en la librería de captura de paquetes (libpcap) y que funciona en plataformas GNU/Linux-UNIX. La librería libpcap incluye un lenguaje de filtros común que convierte a tcpdump en un software muy potente y útil. El comando tcpdump es una herramienta de comunicaciones elaborada en la Universidad de California (Lawrence Berkeley National Laboratory, LBNL) para la monitorización de redes. Permite monitorizar, tanto una interfaz Ethernet, como una comunicación punto a punto (ej. puerto serie). En realidad, tcpdump es un programa de red que pone la tarjeta de red de un ordenador en modo promiscuo; es decir, recibe todos los paquetes/tramas que pasan por esa interfaz, independientemente de que la dirección MAC destino sea la de la tarjeta (normalmente la tarjeta sólo captura aquellas tramas que contienen su dirección destino). Eso significa que tcpdump captura todas las tramas que pasan por la interfaz a la que está conectada. La utilidad tcpdump usa un software llamado BPF (BSD Packet Filter) que es el que permite poner la tarjeta en modo promiscuo, de forma que cada vez que se transmite, o se recibe una trama por el driver de la tarjeta de red, BPF recibe una copia de esa trama. De esta forma BPF puede procesar y filtrar los paquetes de red que el usuario considera más interesantes. El comando tcpdump permite filtrar por protocolos (ej. ip, tcp, udp, arp, ether, fddi,...); por interfaces (ej. eth0, lo,...); por puerto TCP/UDP o dirección IP; por dirección (origen, destino, ambas,...); etc. Este sniffer para sistemas Unix además de servir para monitorizar todo el tráfico de la red, puede ser muy útil para detectar posibles problemas de seguridad como ataques ping. Sin 1 embargo, tcpdump presenta algunas vulnerabilidades en cuanto a la seguridad del sistema. Un usuario remoto puede hacer que la utilidad entre en un bucle infinito. Puede enviar un paquete especialmente preparado del tipo ISAKMP al puerto 500 en UDP para hacer que el código entre irremediablemente en un bucle infinito. Esto provocará que la utilidad no pueda registrar cualquier paquete adicional. La vulnerabilidad reside en la función del isakmp_sub_print() en el archivo print_isakmp.c de la librería Pcap. Quizás tcpump no sea la herramienta perfecta desde el punto de vista de la interpretación sencilla de los datos mostrados (aunque existen otras herramientas gráficas que usan tcpdump), pero sí que es de las mejores en cuanto a su potencia y a la cantidad de información que aporta para la monitorización de la red. 2. EJERCICIO 1 Para comprender el funcionamiento del comando tcpdump puede usarse el comando man de UNIX (#man tcpdump). Dedicar 10 minutos a leer en el man las posibilidades de esta útil herramienta de comunicaciones. Los siguientes son los parámetros más interesantes que pueden indicarse en la ejecución de tcpdump: -a Convierte las direcciones de Red y Broadcast en Nombres. -c Acaba tras capturar un número determinado de paquetes. -i Escucha una interfaz determinada. Si no se especifica, tcpdump busca en la lista de interfaces del sistema la que tenga un número menor. -x Imprime el contenido de los paquetes en hexadecimal. -w Registra los paquetes capturados en un archivo. -r Lee los paquetes desde un archivo que fue creado con la opción –w. Segmentos TCP: El formato general de salida de segmentos TCP mostrados por tcpdump es el siguiente: fecha src > dst: flags [data-sqno ack window urgent options] donde, fecha: indica la hora en que se produjo el evento en formato hora:minutos:segundos.microsegundos (o milisegundos dependiendo de la resolución del reloj del sistema). src y dst: son las direcciones IP y puertos TCP/UDP de las conexiones fuente y destino. Si no se especifica el parámetro –n se intenta resolver el nombre por DNS. flags: son una combinación de los posibles parámetros de un segmento/datagrama TCP/UDP: Puede usarser un “.” para indicar que no hay flags, o bien una combinación de: S(SYN), F(FIN), P(PUSH), R(RST), W (tamaño de la ventana de congestión), E (ECN echo) y “.” (no flags). data-sqno: describe el número de secuencia de la porción de datos mostrada en el segmento de TCP. El formato es primero:ultimo(n), que significa que 2 desde primero a ultimo (sin incluir ultimo) hay un total de n bytes de datos. ack: es el número de secuencia del próximo byte que espera recibir el otro extremo TCP/UDP. window: es el tamaño de la ventana que notifica el receptor al emisor. urgent: indica que hay datos urgentes en ese segmento/datagrama. options: son las opciones TCP que suelen estar entre corchetes del tipo < >; por ejemplo, el tamaño máximo del segmento (ej. <mss 1024>) A continuación se muestra el listado de una de las salidas obtenidas por tcpdump: rtsg.1023 > csam.login: csam.login > rtsg.1023: <mss 1024> rtsg.1023 > csam.login: rtsg.1023 > csam.login: csam.login > rtsg.1023: rtsg.1023 > csam.login: csam.login > rtsg.1023: csam.login > rtsg.1023: csam.login > rtsg.1023: S 768512:768512(0) win 4096 <mss 1024> S 947648:947648(0) ack 768513 win 4096 . P . P P P P ack 1 win 4096 1:2(1) ack 1 win 4096 ack 2 win 4096 2:21(19) ack 1 win 4096 1:2(1) ack 21 win 4077 2:3(1) ack 21 win 4077 urg 1 3:4(1) ack 21 win 4077 urg 1 Este ejemplo simula una conexión originada por el ordenador rtsg con destino a csam, con el servicio rlogin. El significado de las líneas anteriores es el siguiente: • Inicio de conexión de rtsg -> csam SYN ISN 768512 ventana de 4096 bytes. • SYN de csam -> rtsg ISN 947648 ventana de 4096, ACK del SYN anterior. • ACK del SYN enviado por csam. No hay flags. • Envío de 1 byte de datos de rtsg -> csam.. Flag PUSH activado., (los números de secuencia son relativos al ISN a menos que se especifique la opción -S, en cuyo caso pone los números de secuencia que se imprimen de manera absoluta). • ACK del byte de datos anterior por parte de csam. • 19 bytes de datos de rtsg a csam. • csam envía 1 byte de datos a rtsg, y envía el ACK de los 19 bytes transmitidos por rtsg. La ventana de recepción ha bajado en 19 bytes. Flag PUSH. • csam envía un byte de datos urgente. Flag PUSH. • Similar a la línea anterior. A continuación se muestra el resultado de una ejecución de tcpdump desde el puesto10 del laboratorio, donde puesto24 es usado como el receptor del tráfico. Redes% tcpdump –i eth0 17:58:58.470000 158.49.98.10.32768 > 158.49.98.24.telnet:P 1191656817:1191656849(32) ack 2435973568 win 61320 (DF) 3 donde se indica que a las 17:58:58.470000 se genera un segmento con origen 158.49.98.10 (puesto10) y destino 158.49.98.24 (puesto24) (existen opciones para trabajar con nombres en lugar de @IP). Los puertos TCP usados son el 32768 en el puesto10 origen y el puerto telnet (21) en el puesto24 destino. P indica que el parámetro PUSH del segmento TCP estaba activado. Se observa que puesto10 ha enviado 32 bytes de datos con números de secuencia comprendidos entre el 1191656817 y el 1191656849. Como la conexión estaba ya iniciada cuando comenzó su monitorización, los números de secuencia son absolutos. Si tcpdump monitoriza una conexión desde el inicio, los números de secuencia son relativos al número de secuencia inicial. El puesto24 reconoce (ack) haber recibido de puesto10 el dato 2435973567 y espera que el próximo que envíe sea el 2435973568. Finalmente, puesto10 anuncia una ventana de 61320 bytes y solicita que no se fragmenten (DF) los datagramas IP. A continuación se muestra otra nueva captura obtenida en las mismas condiciones anteriores: 10:04:11.672020 > puesto10.unex.es.32768 > puesto24.unex.es.telnet: . 1:1(0) ack 1 win 5840 <nop,nop,timestamp 116267 43363780> (DF) En este caso “.” indica que no hay ningún flag activado. Puede comprobarse que en realidad no se han enviado datos ya que coinciden los números de secuencia inicial y final (1:1). Si desea visualizarse el contenido de los segmentos en hexadecimal, puede ejecutarse el comando con los siguientes parámetros: tcpdump –x –s100 –i eth0 tcpdump capturará los primeros 100 bytes (incluidas cabeceras IP y TCP/UDP y excluidas las cabeceras Ethernet) del paquete. De esta forma, también podrán observarse los valores de la cabecera IP (ej. IHL, ttl, versión, etc...). Fragmentos de datagramas IP: Los datagramas fragmentados se muestran con una expresión al lado de los mismos entre paréntesis: (frag id:size@offset+) (frag id:size@offset) id es el identificador de fragmento. size tamaño del fragmento. offset posición del fragmento en el datagrama original. Si existe el + al final de offset significa que aún quedan más fragmentos. En caso de ausencia del signo + se interpreta como que es el último fragmento de la secuencia. Los datos del protocolo del nivel superior, sólo se imprimen en el primer fragmento. 4 SegmentosUDP: Un segmento UDP se muestra de la siguiente forma: origen.srcport > destino.dsrport: udp len origen: Nombre o dirección origen. srcport: Puerto origen. destino: Nombre o dirección destino. dstport: Puerto destino len: Longitud de los datos de usuario. A continuación se presenta un ejemplo de captura de un segmento UDP: 12:35:21.457350 10.10.109.10.1025 > 192.168.1.2.1345: udp 121 [ttl 1] En algunos casos puede interpretar protocolos que vayan encapsulados en los paquetes UDP, como NFS o DNS. El grado de detalle en la interpretación de estos protocolos dependerá del grado de detalle que desee obtenerse con el parámetro -v. 3. EJERCICIO 2 El objetivo de este ejercicio es observar los distintos campos del protocolo IP. Para ello se capturará con tcpdump una conexión telnet o ftp (dar el login y password y a continuación desconectarse). Por ejemplo, una conexión telnet (o ftp) ejecutada en el ordenador puesto20 para conectarse al ordenador puesto21. La captura con el comando tcpdump debe ser de forma que se obtenga el contenido de los datagramas IP (parámetro –x de tcpdump). Iniciando el sistema con Trinux, desde puesto20 se hace una conexión telnet a puesto21, mientras en una segunda sesión de puesto20 (Alt+F2) se ejecuta tcpdump. Siguen las líneas a ejecutar desde puesto20: #telnet 158.49.98.21 #tcpdump –xa Un datagrama obtenido por tcpdump podría ser el siguiente (Ctrl-S congela el scroll de pantalla para observar los valores con detenimiento y Ctrl-Q lo descongela): 15:08:02.849789 eth0 < 158.49.98.21.telnet > 158.49.98.21.32769: P 1:13(12) ack 1 win 5792 <nop,nop,timestamp 43382898 135384> (DF) [tos 0x10] 4510 0040 c08d 4000 4006 798e 9e31 6215 9e31 6214 0017 8001 21f6 38fc d3ee 19df 8018 16a0 537f 0000 0101 080a 0295 f872 0002 10d8 fffd 18ff fd20 fffd 23ff fd27 A continuación se muestra una tabla con el valor en hexadecimal, en binario y el significado de cada uno de los campos de la cabecera IP del datagrama anterior: 5 Campo de cabecera IP IP version (4 bits) Header length (4 bits) TOS (8bits) Hex 4 5 10 Total length (16 bits) 0040 Identification (16 bits) c08d Flags (3 bits) 4000 Fragment Offset(13 bits) 4000 TTL (8 bits) 40 Protocol type (8 bits) Checksum (16 bits) 06 798e Source @IP (32 bits) 9e31 6215 Destination @ IP (32 bits) 9e31 6214 Binario Significado 0100 Versión 4 IP. 0101 El tamaño de la cabecera es 5*4=20 bytes. 00010000 Se solicita un servicio con prioridad 0 (normal), seguridad 1 (alta), retardo 0 (bajo) y rendimiento 0 (normal). 00000000 La longitud total del datagrama es 64 bytes. 01000000 11000000 La secuencia de identificación del datagrama es 10001101 c08d. 010 El bit de más fragmentos (MF) está desactivado y el de no fragmentar (DF) activado. 00000000 El desplazamiento es de 0 bytes. 00000 01000000 El tiempo de vida es de 64 puntos de enrutamiento. 00000110 El tipo de protocolo es 6 (TCP). 01111001 La suma de comprobación del CRC es igual a 10001110 798e. 10011110 La dirección IP origen es 158.49.98.21. 001100010 110001000 010101 10011110 La dirección IP destino es 158.49.98.20 001100010 110001000 010100 A continuación se propone resolver el siguiente ejercicio. Establecer una conexión ftp (o telnet) entre dos máquinas del laboratorio (ftp –v @IP). En el caso de usar cuentas personales se recomienda emplear contraseñas falsas o supuestas, ya que, como veremos más adelante, la contraseña puede ser capturada. Identificar la cabecera IP del primer datagrama IP (tomar los 20 primeros octetos). Para esto hay que escribir los campos en hexadecimal y a continuación interpretarlos (traducir los campos que tengan un significado numérico como las @ IP, ttl, etc...). Campo de cabecera IP Hex Binario Significado IP version (4 bits) Header length (4 bits) TOS (8bits) Total length (16 bits) Identification (16 bits) Flags (3 bits) (*) Fragment Offset(13 bits) (*) 6 TTL (8 bits) Protocol type (8 bits) Checksum (16 bits) Source @IP (32 bits) Destination @ IP (32 bits) (*) Interpretar la parte binaria • Para ver el mapeo de caracteres ASCII en hexadecimal puede usarse el anexo al final de este documento. • Los tipos de protocolos pueden encontrarse en el fichero /etc/protocols • Observar la correlación entre un datagrama origen y otro destino (las @IP deben estar intercambiadas). • Observar la correlación entre dos datagramas con origen consecutivos: el identificador usa números consecutivos para datagramas consecutivos. Pero atención, pues los números son consecutivos entre todos los datagramas IP enviados. Si sólo se capturan datagramas que encapsulan datos de una aplicación (ej. ftp), podrá comprobarse que hay números que no son consecutivos (faltaría capturar los datagramas de otras aplicaciones como pueden ser DNS). A continuación de la cabecera IP se encuentra encapsulada una estructura de datos perteneciente a otro protocolo: el campo tipo identifica este protocolo (ej. TCP, UDP. ICMP, IGMP,...). En el caso de la aplicación telnet o ftp se usa el protocolo TCP (identificador 6). Este protocolo contiene una cabecera de 20 octetos. A continuación de la cabecera TCP vienen los datos. Como en el campo IP total length se almacena la longitud del datagrama IP, basta con restar la cabecera IP y la cabecera TCP para saber el tamaño del campo de datos que transporta el datagrama IP. 4. EJERCICIO 3 Identificación del diálogo de aplicación telnet o ftp. Podemos comprobar que telnet o ftp inician un diálogo en el que debe solicitarse el nombre de usuario y su contraseña. Aunque las aplicaciones telnet y ftp desactivan el echo de pantalla para que la contraseña no pueda ser observada, ésta se transmite sin codificar por la red. Esto significa que entre los datos que se han capturado anteriormente se encuentra también la contraseña. Si se observa el diálogo telnet o ftp, cuando el emisor solicita el comando 220 puesto20 FTP (cuya secuencia en hexadecimal es 3232 _______ 726f ....) está solicitando el nombre de usuario que encontraremos en la contestación del otro. FTP solicita con el comando 331 Password required ... (en HEX es la secuencia 3333 ...) el destino contestará con la contraseña. 3120 5061 7373 Identificar el diálogo FTP y capturar el username (login o nombre de usuario) y password (contraseña) de la conexión. Por razones obvias se aconseja introducir contraseñas falsas en las pruebas en que se usen cuentas de usuario personales. 7 Para realizar este ejercicio se realiza desde puesto20 un telnet a puesto21 (#telnet 158.49.98.21) y se hace login en la cuenta usuario. Mientras tanto, en puesto21 se ha puesto su tarjeta de red en modo promiscuo con el comando #tcpdump – xa eth0. Se muestran a continuación los datagramas capturados por tcpdump en el puesto21, donde pueden observarse cada uno de los caracteres de la contraseña tecleada por el usuario que desde el puesto20 accede a la cuenta usuario del puesto21. Nota: se muestran los dos primeros caracteres de la contraseña subrayados y en negrita. 15:08:12.924998 eth0 < 158.49.98.21.telnet > 158.49.98.20.32769: P 119:129(10) ack 50 win 5792 <nop,nop,timestamp 43383905 136392> (DF) [tos 0x10] 4510 003e c09b 4000 4006 7982 9e31 6215 9e31 6214 0017 8001 21f6 3972 d3ee 1a10 8018 16a0 9a75 0000 0101 080a 0295 fc61 0002 14c8 5061 7373 776f 7264 3a20 E^P ^@ > .... @^@ @^F y.. .. 1 b^U .. 1 b^T ^@^W ..^A !.. 9 r .... ^Z^P ..^X ^V.. .. u ^@^@ ^A^A ^H^J ^B.. .. a ^@^B ^T.. P a s s w o r d : 15:08:12.925006 eth0 > 158.49.98.20.32769 > 158.49.98.21.telnet: . 50:50(0) ack 129 win 5840 <nop,nop,timestamp 136392 43383905> (DF) 4500 0034 091e 4000 4006 311a 9e31 6214 9e31 6215 8001 0017 d3ee 1a10 21f6 397c 8010 16d0 8216 0000 0101 080a 0002 14c8 0295 fc61 E^@ ^@ 4 ^I^^ @^@ @^F 1^Z .. 1 b^T .. 1 b^U ..^A ^@^W .... ^Z^P !.. 9 | ..^P ^V.. ..^V ^@^@ ^A^A ^H^J ^@^B ^T.. ^B.. .. a 15:08:13.742581 eth0 > 158.49.98.20.32769 > 158.49.98.21.telnet: P 50:51(1) ack 129 win 5840 <nop,nop,timestamp 136474 43383905> (DF) 4500 0035 091f 4000 4006 3118 9e31 6214 9e31 6215 8001 0017 d3ee 1a10 21f6 397c 8018 16d0 11bb 0000 0101 080a 0002 151a 0295 fc61 70 E^@ ^@ 5 ^I^_ @^@ @^F 1^X .. 1 b^T .. 1 b^U ..^A ^@^W .... ^Z^P !.. 9 | ..^X ^V.. ^Q.. ^@^@ ^A^A ^H^J ^@^B ^U^Z ^B.. .. a p 15:08:13.778810 eth0 < 158.49.98.21.telnet > 158.49.98.20.32769: . 129:129(0) ack 51 win 5792 <nop,nop,timestamp 43383991 136474> (DF) [tos 0x10] 4510 0034 c09c 4000 4006 798b 9e31 6215 9e31 6214 0017 8001 21f6 397c d3ee 1a11 8010 16a0 819d 0000 0101 080a 0295 fcb7 0002 151a E^P ^@ 4 .... @^@ @^F y.. .. 1 b^U .. 1 b^T ^@^W ..^A !.. 9 | .... ^Z^Q ..^P ^V.. .... ^@^@ ^A^A ^H^J ^B.. .... ^@^B ^U^Z 15:08:14.091720 eth0 > 158.49.98.20.32769 > 158.49.98.21.telnet: P 51:52(1) ack 129 win 5840 <nop,nop,timestamp 136509 43383991> (DF) 4500 0035 0920 4000 4006 3117 9e31 6214 9e31 6215 8001 0017 d3ee 1a11 21f6 397c 8018 16d0 0c41 0000 0101 080a 0002 153d 0295 fcb7 75 E^@ ^@ 5 ^I @^@ @^F 1^W .. 1 b^T .. 1 b^U ..^A ^@^W .... ^Z^Q !.. 9 | ..^X ^V.. ^L A ^@^@ ^A^A ^H^J ^@^B ^U = ^B.. .... u 8 15:08:14.091961 eth0 < 158.49.98.21.telnet > 158.49.98.20.32769: . 129:129(0) ack 52 win 5792 <nop,nop,timestamp 43384022 136509> (DF) [tos 0x10] 4510 0034 c09d 4000 4006 798a 9e31 6215 9e31 6214 0017 8001 21f6 397c d3ee 1a12 8010 16a0 815a 0000 0101 080a 0295 fcd6 0002 153d E^P ^@ 4 .... @^@ @^F y.. .. 1 b^U .. 1 b^T ^@^W ..^A !.. 9 | .... ^Z^R ..^P ^V.. .. Z ^@^@ ^A^A ^H^J ^B.. .... ^@^B ^U = Como ejercicio se propone visualizar la contraseña de tu compañero mientras accede a la cuenta Redes de tu sistema Linux Red Hat. 5. PROTOCOLO ICMP El protocolo ICMP (Internet Control Message Protocol) informa de la aparición de errores en la manipulación de los datagramas. Siempre que un router detecte un error o excepción en un datagrama utiliza el protocolo ICMP para informar al host origen de esa circunstancia. ICMP no realiza ninguna acción para corregir el error que se haya producido, solamente se encarga de comunicarlo al host origen para que éste realice las acciones oportunas para corregir el error. Inicialmente, ICMP fue diseñado como un protocolo para los routers, sin embargo los hosts también lo pueden utilizar. Aunque este protocolo fue diseñado para detectar las incidencias que se producen en el transporte de un datagrama hacia el host destino, no todas ellas pueden ser detectadas. Entre estas causas se encuentra la pérdida de un datagrama que lleva un mensaje ICMP. En este punto podríamos pensar que para solucionar este problema, esta pérdida podría ser notificada con otro mensaje ICMP. Más que solucionar el problema, lo estaríamos agravando cuando la razón de esa pérdida sea una congestión en la red. Por eso, no se permite notificar mediante mensajes ICMP la pérdida de datagramas que lleven un mensaje ICMP. De hecho, la pérdida de un datagrama que transporta un mensaje ICMP no se notifica. Otra norma general que impone este protocolo es que las notificaciones de error se realicen solamente al host origen. La siguiente figura muestra cómo los mensajes ICMP van encapsulados en datagramas IP: Aunque ICMP va encapsulado en un datagrama IP, eso no quiere decir que ICMP sea un protocolo de nivel superior. Debe considerarse como parte de IP, como si fuese una herramienta auxiliar de la que dispone IP para poder detectar errores en el transporte de los datagramas a sus diversos destinos. 9 Cada tipo de mensaje ICMP tiene su propio formato, aunque todos ellos comienzan con tres campos comunes. El resto de campos puede variar en función del tipo de mensaje. Los campos comunes son el campo Tipo, el campo Código y el campo Checksum. El campo Tipo identifica el tipo de mensaje ICMP. En la siguiente tabla se muestran algunos de los tipos de mensajes que contempla este protocolo. El campo Código se usa para aportar más información acerca del tipo de mensaje ICMP. Este campo no siempre es necesario. El último campo contendrá el Checksum del mensaje ICMP. La descripción de cada uno de los tipos de mensajes ICMP de la tabla anterior es la siguiente: • Petición de eco y Contestación de eco: Son dos mensajes que se usan conjuntamente para determinar el alcance de un host o un router. Normalmente son utilizados por los hosts, de forma que éstos puedan extraer información acerca del estado del host remoto, el retardo que introduce la red en la entrega de los mensajes y el porcentaje de mensajes perdidos. • Destino inalcanzable: Se trata de un mensaje que es generado por un router cuando no puede encaminar un datagrama. Existen diferentes causas que provocan la emisión de este mensaje y que están codificadas en el campo Código del mensaje ICMP. El mensaje es dirigido al host que ha enviado el datagrama y en su interior se especifican los primeros 64 bits del datagrama que lo ha causado (el que no se puede entregar al destino). • Paquete de restricción: Es un mensaje que utilizan los routers para frenar el ritmo de inyección de mensajes en la red de un determinado host. Esta situación se produce cuando un router se ve sobrecargado con la recepción de datagramas (una posible situación de congestión) teniendo que descartar algunos por falta de buffers. Cuando se produce esta situación, el router envía un mensaje de este tipo al host origen del datagrama descartado, solicitándole que baje el ritmo de envío de datagramas ya que en ese momento hay una situación temporal de congestión. • Tiempo de vida agotado: Cuando un router encamina un datagrama, una de sus tareas es decrementar en una unidad el campo Tiempo de vida (TTL) de la cabecera del mismo. Si tras la operación el campo vale "0", el router debe descartar el datagrama y enviar un mensaje ICMP de este tipo hacia el host origen. El objetivo de esta sección es identificar el formato de un mensaje ICMP. Recordar que este protocolo se encarga de notificar mensajes de error así como mensajes de control. Los mensajes ICMP van encapsulados en datagramas IP (el campo tipo de IP vale 1, como puede comprobarse en el fichero /etc/protocols). La cabecera ICMP ocupa 4 octetos (comunes a todos los mensajes ICMP) más una serie de octetos que depende del tipo de mensaje. Los dos primeros octetos llamado tipo y código identifican el mensaje ICMP, los dos siguientes octetos son un checksum de 16 bits. Para observar este hecho vamos a capturar un mensaje ICMP con el comando tcpdump. La aplicación ping envía mensajes ICMP ECHO REQUEST (tipo 8) a un host específico. Este host responde con un mensaje ICMP ECHO_RESPONSE (tipo 0). El host que efectúa la 10 petición escribe por su salida estándar el mensaje host is alive si ha habido una respuesta o no answer from host si en 20 segundos el host remoto no ha respondido. También es posible que ping imprima por su salida estándar estadísticas de los paquetes que ha enviado (retardo que han sufrido, cuántos se han perdido, etc.) ejecutando ping –s @IP. Después de los cuatro primeros octetos típicos de ICMP, los mensajes ICMP ECHO_REQUEST usan 2 octetos que identifican el PID del proceso ping de la máquina que efectúa la petición de ping (esto lo hace para identificar varios ping de un mismo origen) seguido de otros dos octetos con un número de secuencia de los paquetes enviados. A partir del número de secuencia recibido en el echo, ping puede identificar cuántos se han perdido, o se han desordenado o son duplicados. También puede calcular el RTT (Round Trip Time). 6. EJERCICIO 4 Ejecutar el comando ping a una dirección IP y capturar con el comando tcpdump el contenido de 2 ó 3 paquetes. Identificar en el campo de cabecera IP el tipo de protocolo (ICMP), y en el payload de IP vendrá la cabecera ICMP donde puede identificarse el tipo y código del paquete ICMP, identificar el PID del ping y el número de secuencia de los paquetes enviados. 15:15:37.480025 eth0 > (DF) 4500 9e31 1553 8cfa 24fb a0d7 E^@ .. 1 ^U S .... $.. .... 15:15:37.480326 eth0 < (DF) 4500 9e31 1553 8cfa 24fb a0d7 E^@ .. 1 ^U S .... $.. .... 15:15:38.480022 eth0 > (DF) 4500 9e31 1253 158.49.98.20 > 158.49.98.62: icmp: echo request 0054 623e 0700 ffbf ffbf 0f40 0000 4000 4001 39f4 9e31 6214 0800 52b8 3d01 0200 9929 c740 50d9 0708 0100 0000 98fb ffbf 6cfa ffbf cdd6 0240 b499 0f40 b499 0f40 b499 0f40 0e00 0000 ^@ T ^@^@ @^@ @^A 9.. b > ^H^@ R.. =^A ^B^@ ^G^@ P.. ^G^H ^A^@ ^@^@ .... l.. .... .... ^B @ .... .... ^O @ .... ^O @ ^O @ .. 1 .. ) .... .... ^N^@ b^T .. @ .... ^O @ ^@^@ 158.49.98.62 > 158.49.98.20: icmp: echo reply 0054 6214 0700 ffbf ffbf 0f40 6edf 4000 ff01 0c14 9e31 623e 0000 5ab8 3d01 0200 9929 c740 50d9 0708 0100 0000 98fb ffbf 6cfa ffbf cdd6 0240 b499 0f40 b499 0f40 b499 0f40 0e00 0000 ^@ T n.. @^@ ..^A ^L^T b^T ^@^@ Z.. =^A ^B^@ ^G^@ P.. ^G^H ^A^@ ^@^@ .... l.. .... .... ^B @ .... .... ^O @ .... ^O @ ^O @ .. 1 .. ) .... .... ^N^@ b > .. @ .... ^O @ ^@^@ 158.49.98.20 > 158.49.98.62: icmp: echo request 0054 0000 4000 4001 39f4 9e31 6214 623e 0800 53b8 3d01 0300 9a29 c740 0700 50d9 0708 0100 0000 98fb ffbf 11 8cfa ffbf 6cfa ffbf cdd6 0240 b499 0f40 24fb ffbf b499 0f40 b499 0f40 0e00 0000 a0d7 0f40 E^@ .. 1 ^R S .... $.. .... ^@ T ^@^@ @^@ @^A 9.. b > ^H^@ S.. =^A ^C^@ ^G^@ P.. ^G^H ^A^@ ^@^@ .... l.. .... .... ^B @ .... .... ^O @ .... ^O @ ^O @ .. 1 .. ) .... .... ^N^@ b^T .. @ .... ^O @ ^@^@ En los datagramas obtenidos se puede observar que el tipo de protocolo es ICMP, ya que el valor de este campo es 01 (en negrita). El tipo es 00 en los paquetes echo reply y 08 en los paquetes echo request (subrayado). El campo código es igual en los tres paquetes y vale 00 (negrita, cursiva y subrayado). El PID del ping es 3d01(negrita y subrayado). Por último, los números de secuencia de los paquetes son respectivamente 0200 y 0300. Como ejercicio se propone rellenar las tablas siguientes a partir de los datos obtenidos al realizar un ping al ordenador de tu compañero. Campos de cabecera IP Hex. Significado Hex. Significado IP version (4 bits) Header length (4 bits) TOS (8bits) Total length (16 bits) Identification (16 bits) Flags (3 bits) Frag. Offset(13 bits) TTL (8 bits) Protocol type (8 bits) Checksum (16 bits) Source @IP (32 bits) Destin. @ IP (32 bits) Campos de cabecera ICMP Tipo Código Cheksum PID del ping emisor Número de secuencia 12 ANEXO: Código ASCII: Hexadecimal/Character 00 08 10 18 20 28 30 38 40 48 50 58 60 68 70 78 NUL BS DLE CAN SP ( 0 8 @ H P X ` h p x 01 09 11 19 21 29 31 39 41 49 51 59 61 69 71 79 SOH HT DC1 EM ! ) 1 9 A I Q Y a i q y 02 STX 0A NL 12 DC2 1A SUB 22 “ 2A * 32 2 3A : 42 B 4A J 52 R 5A Z 62 b 6A j 72 r 7A z 03 0B 13 1B 23 2B 33 3B 43 4B 53 5B 63 6B 73 7B ETX VT DC3 ESC # + 3 ; C K S [ c k s { 04 0C 14 1C 24 2C 34 3C 44 4C 54 5C 64 6C 74 7C EOT NP DC4 FS $ , 4 < D L T \ d l t 05 ENQ 0D CR 15 NAK 1D GS 25 % 2D 35 5 3D = 45 E 4D M 55 U 5D ] 65 e 6D m 75 u 7D } 06 0E 16 1E 26 2E 36 3E 46 4E 56 5E 66 6E 76 7E ACK SO SYN RS & . 6 > F N V ^ f n v ~ 13