|
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
|
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 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.
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
|
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 |
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 |
15:57:58.181078 207.219.33.101.http > 203.94.236.47.33003: P 1:1399(1398) ack 736 win 31856 |
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 |
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 |
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 |
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.
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).