G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!
Explorando TCP/IP con TCPdump y Tethereal
Por Vinayak Hegde
Traducción al español por Daniel Guerrero
el día 28 de Enero 2003, para La Gaceta de Linux

La introducción más corta a TCP/IP

TCP/IP se ha convertido en el protocolo estándar de facto para la comunicación entre computadoras. IP (Protocolo Internet) provee funcionalidad en la capa de red (direccionamiento y ruteo) mientras TCP (Protocolo de Control de Transmisión) provee conectividad (virtual) punto a punto. La familia TCP/IP incluye un puñado de otros protocolos útiles como ICMP (Protocolo de Control de Mensajes Internet), IGMP (Protocolo de Manejo de Grupos Internet) y UDP (Protocolo de Datagrama de Usuario). Una aplastante mayoría de las redes actuales usan TCP/IP. Casi cualquier otra aplicación de hoy incorpora alguna clase de funcionalidad de red por lo que se ha vuelto necesario para cualquier programador tener por lo menos un conocimiento funcional de TCP/IP.

La Comunicación entre computadoras usando TCP/IP toma lugar por medio del intercambio de paquetes. Un paquete es un PDU (Unidad de Datos del Protocolo) en la capa IP. El PDU en la capa TCP es llamado un segmento mientras que un PDU en la capa de ligado de datos (como es Ethernet) es llamado un marco. Sin embargo, el término paquete es usado genéricamente para describir la unidad de datos que es intercambiada entre las capas TCP/IP también entre dos computadoras.

Así es como un marco Ethernet se ve:

	+------------------------------------------------------------------+	
	|          |            |               |               |          |	
	| Cabecera | Cabecera   |   Cabecera    |     Datos     | Ethernet |	
	| Ethernet |    IP      |      TCP      |  Encapsulados	| Trailer  |	
	|          |            |               |               |  (FCS)   |	
	+------------------------------------------------------------------+	
		  <- 20 bytes -> <- 40 bytes ->					
					
	  	  <---------- longitud máxima = 1500 bytes ---------->
	
   FCS significa  Secuencia de Verificación de Marco (Frame Check Sequence).
	

TCPdump y Tethereal

TCPdump es una utilidad que permite a un usuario interceptar y capturar paquetes a través de una interfaz de red. Esta es una extremadamente pequeña e ingeniosa utilidad que puede ayudar al programador a arreglar los problemas de aplicaciones de red. Debido a que esta utilidad captura todos los paquetes recibidos por una interfaz de red, puede ser usada para propósitos ilegítimos también.

Normalmente sólo los paquetes que están direccionados a una interfaz de red son interceptados y pasados a capas superiores de la pila de capa del protocolo TPC/IP. Los otros paquetes que no están direccionados a la interface son ignorados. En modo Promiscuo, los paquetes que no pretende recibir la interfase son también interceptados y pasados a niveles superiores de la pila del protocolo. TCPdump trabaja poniendo la interfaz de red en modo promiscuo.

TCPdump utiliza la libpcap (librería de captura de paquetes) que está disponible gratuitamente. La librería libcap es versátil y trabaja con el filtro de paquetes BDS, la Interfaz de Proveedor Data-link SVR4 (DLPI) y la interfac SOCK_PACKET de Linux. Tethereal que es la versión de línea de comandos de la popular herramienta analizadora de tráfico de red ethereal también ocupa la librería de captura de paquetes pcap. Tethereal es una herramienta poderosa para analizar el tráfico de red y también provee más facilidades para decodificar paquetes comparado con TCPdump. Ethereal la herramienta GUI para analizar paquetes ha sido usada en una form jerárquica. La mejor característica de ethereal es que puede juntar los diferentes fragmentos de la comunicación entre dos computadoras y mostrar todo el texto ascii que fue intercambiado durante la conversación.

El formato de paquetes TCP e IP

Representación grráfica del RFC 791

    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 	    
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+	
   |Versión|  IHL  |Tipo  Servicio |        Longitud Total         |	
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+	
   |         Identificacion        |Band.|  Offset del Segmento    |	
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+	
   |Tiempo de Vida |   Protocolo   |   Checksum de la Cabecera     |	
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+	
   |                     Dirección Fuente                          |	
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+	
   |                     Dirección Destino                         |	
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+	
   |                   Opciones                    |    Padding    |	
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+	
									
			Formato de Cabecera IP				

Representación ASCII del RFC 793

    0                   1                   2                   3   	
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1	 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      
   |          Puerto Fuente        |         Puerto Destino        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Número de Secuencia                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       |           |U|A|P|R|S|F|                               |
   | Offset| Reservado |R|C|S|S|Y|I|            Ventana            |
   | Datos |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Puntero Urgente       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    opciones                   |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                            datos                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                          Formato de Cabecera de TCP

Ejemplos de captura de paquetes usando TCPdump y Tethereal

Puedes experimentar con TCPdump en cualquier interfaz a través de la cual podemos conducir transacciones de red. Para listar las diferentes interfaces conectadas a tu computadora, puedes teclear el comando

#ifconfig -a				

Esto listará todas las interfaces de red conectadas a tu sistema, incluyendo la interfaz loopback (de regreso de datos). Si estás conectado a la red usando una línea de teléfono, puedes usar la interfaz ppp0 para experimentar y depurar tus aplicaciones usando TCPdump.

Ejemplo #1
Este es un trozo (del archivo tcpdumpppp) del paquete capturado usando una línea de teléfono (PPP). La bandera -vvv hace que tcpdump sea muy muy verboso. Las otras banderas para controlar la verbosidad son -v y _vv.

#tcpdump -vvv > tcpdumpppp		
tcpdump: listening on ppp0		

La captura de paquetes es detenida presionando CTRL-C.

15:57:58.181078 207.219.33.101.http > 203.94.236.47.33003: P 1:1399(1398) ack 736 win 31856  (DF) [tos 0x10]  (ttl 38, id 28827, len 1450)

Alguna de la información puede ser intepretada de la descarga del paquete de arriba.

Ejemplo #2
Este vaciado de paquete fue capturado de una NIC (interface denotada por eth0).

#tcpdump -a -i eth0		


06:21:11.414863 > pca03.nt.co.in.ssh > pcc03.mum.nt.co.in.4944: P 252143283:252143331(48) ack 2638534821 win 62780 (DF) [tos 0x10] 

			  E^P ^@ X ....  @^@  @^F .. N .... ....
			 .... .... ^@^V ^S P ^O^G  f.. .. D ....
			  P^X .. < .. t ^@^@  k +  Y^Q .... .. (
			  ^..  )^G  c 3 ^\ v  t.. ..^G ^J.. .. t
			  9.. .. -  F.. ....  6..  /.. ....  9..
			  [.. ....  G.. .. d
Aquí estamos diciendo a TCPdump que resuelva los IP a nombres de dominio si es posible (-a) y explícitamente le solicitamos que capture paquetes en la interfaz eth0. Si no damos la opción (-i) TCPdump buscará por si mismo las interfaces y empezará a capturar los paquetes que le lleguen. Alguna de la información que puede ser tomada del paquete de arriba es:

Ejemplo #3

El siguiente trozo nos muestra una captura de paquete de un paquete SYN (solicitud de conexión). La captura del paquete fue hecha en una Ethernet.

15:57:56.074928 203.94.236.47.33003 > 216.239.33.101.http: S [tcp sum ok] 937694521:937694521(0) win 5840  (DF) (ttl 64, id 54537, len 60)

La siguiente información puede ser interpretada de la captura de arriba:

Ejemplo #4
La siguiente captura de paquete fue tomada usando tehereal.

#tethereal -i lo		


26  19.624878 localhost.localdomain -> localhost.localdomain TCP 33283 > http [FIN, ACK] Seq=877643253 Ack=882239950 Win=37296 Len=0

Como se puede observar de la salida de arriba, la salida de tethereal no es muy diferente de la de TCPdump. Lo de arriba es un paquete FIN, ACK (para cerrar la conexión). Tethereal cuando es usado con su front-end ethereal puede ser muy útil para detectar anomalías en la red también.

Palabras finales

Mientras que TCPdump es extremadamente una buena herramienta, se enfoca principalmente en el protocolo TCP/IP. Hace su trabajo bien. Ethereal es mucho más versátil y puede entender una variedad de protocolo. También la interfaz de usuario de ethereal es mucho mejor diseñada así que aún un novato puede entender cuáles paquetes están siendo capturados y qué información contienen. La buena interfaz hace que el proceso de aprendizaje sea aún más disfrutable.

Recursos

 

[BIO] Mi vida cambió desde que descubrí Linux. De repente las computadoras se volvieron interesantes mientras intentaba muchas cosas en mi Linux debido a la facil disponibilidad de código fuente. Mis intereses son predominantemente en los campos de redes, sistemas embebidos y lenguajes de programación. Actualmente trabajo para Aparna Web services donde hacemos Linux accesible para las academias/corporaciones configurando estaciones remotas de inicio (Clientes ligeros).


Copyright © 2003, Vinayak Hegde. Licencia de Copiado http://www.linuxgazette.com/copying.html
Publicado en la edición 86 de Linux Gazette, Enero del 2003