Ethernet: Varias máquinas en red - Obijuan/URJC-Gsyc-2018-Arquitectura-Internet GitHub Wiki
Contenido
- Introducción
- Red local de cuatro máquinas
- Analizando tramas Ethernet con tcpdump
- Capturando tramas en un fichero
- Analizando la captura con Wireshark
- Ejercicios para practicar
- Resumen de comandos
- Autores
- Créditos
- Licencia
- Enlaces
Introducción
Partimos de un escenario de una red con 4 máquinas. Configuramos sus interfaces de red para que se puedan comunicar, a nivel de Ethernet. Una de las máquinas la usaremos para capturar el tráfico de la red, con tcpdump, y guardarlo en un fichero que luego analizaremos con la herramienta wireshark
Red local de cuatro máquinas
Este es el escenario con el que vamos a trabajar (red-local4.zip) : Una red local formada por cuatro máquinas. Cuando las máquinas están en la misma red local, se dice que son máquinas vecinas, ya que se pueden enviar mensajes directamente entre ellas (comparten el mismo medio físico)
Para enviar mensajes entre ellas necesitamos conocer su direcciones ehternet, o bien enviar mensajes de broadcast (con la dirección destino FF:FF:FF:FF:FF:FF, que les llega a todos)
Para entender el funcionamiento de esta red local haremos lo siguientes con las máquinas
- PC1 será la encargada de enviar mensajes a la red, usando el programa eth-send.py
- PC2 estará esperando a recibir las tramas para él, con el programa eth-receive.py
- PC3 igual que PC2: Esperando a recibir las tramas dirigidas a él, con elprograma eth-receive.py
- PC4 lo usaremos para escuchar la red, y ver todas las tramas que circulan por ella. Ejecutará el programa eth-sniffer.py
Preparando la red
Los primero que hacemos es arrancar las máquinas para que se nos abran los 4 terminales. En cada máquina activaremos la ethernet con el comando:
ifconfig eth0 up
y nos situaremos en el directorio /hosthome para ejecutar los comandos
cd /hosthome
Así es como estaría la máquina PC4 una vez ejecutados esos comandos
Enviando mensajes
Lanzamos los programas para recibir las tramas como se ha descrito al comienzo del apartado: PC4 escucha todo lo que hay en la red, PC2 y PC3 sólo lo que les llega a ellos
Desde PC1 enviamos los siguientes 5 mensajes, uno a continuación del otro:
pc1:/hosthome# ./eth-send
Este comando envía por defecto el mensaje "Testing--->" a la máquina AA:BB:CC:DD:EE:FF (que no está en est red local). Se ejecuta 2 veces, para enviar dos mensajes iguales.
Ni PC2 ni PC3 reciben nada. Sin embargo, sí lo vemos en PC4, ya que está escuchando todo lo que hay en la red.
Luego enviamos un mensaje para PC2:
pc1:/hosthome# ./eth-send.py DE:d9:b9:Ea:B8:01 "Hola PC2"
Y efectivamente lo recibe PC2. Pero NO PC3. Desde PC4 también lo vemos, aunque el mensaje no es para él.
Enviamos otros mensaje a PC3
pc1:/hosthome# ./eth-send.py CE:17:29:69:4F:25 "Hola PC3"
Ahora lo recibe PC3, pero NO PC2. Desde PC4 también lo vemos
Y finalmente se envía un mensaje de broadcast, a todas las máquinas:
pc1:/hosthome# ./eth-send.py FF:FF:FF:FF:FF:FF "Hola a todos"
Y todos reciben el mensaje
En esta captura se pueden ver los terminales una vez enviados los 5 mensajes:
Y en esta animación se muestra el proceso de cómo ha sucedido:
Analizando tramas ethernet con tcpdump
Vamos a estudiar de forma práctica las tramas ethernet. Para ello vamos a enviar un mensaje de prueba desde PC1 a PC2 y lo visualizaremos desde PC4 usando la herramienta tcpdump
Es similar a lo que hemos hecho con eth-snifer, pero tcpdmp es mucho más potente y nos permite hacer más cosas
En PC4 lanzamos tcpdump para capturar todo lo que hay en la red y mostrarlo en la consola. Lo ejecutamos pasando el parámetro -i y el nombre de la interfaz (eth0 en este ejemplo):
tcpdump -i eth0
El PC4 se queda esperando a que lleguen tramas:
pc4:~# tcpdump -i eth0
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
Desde PC1 enviamos el mensaje "Hola" a PC2:
pc1:/hosthome# ./eth-send.py 3a:f6:9b:4b:fa:46 "Hola"
En PC2 se recibe correctamente:
pc2:/hosthome# ./eth-receive.py
Paquetes recibidos en esta maquina
Direccion Ethernet local: 3A:F6:9B:4B:FA:46
Esperando tramas por el interfaz eth0....
-----------------------------------------------------
Desde bytes data
6E:4B:68:85:F6:40 46 Hola................
y en la consola de PC4 veremos la trama que ha llegado. Vamos a analizarla
pc4:/hosthome# tcpdump -i eth0
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
13:16:38.586273 6e:4b:68:85:f6:40 (oui Unknown) > 3a:f6:9b:4b:fa:46 (oui Unknown), ethertype Unknown (0x7a05), length 60:
0x0000: 486f 6c61 0000 0000 0000 0000 0000 0000 Hola............
0x0010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0020: 0000 0000 0000 0000 0000 0000 0000 ..............
TCPdump nos informa de que ha recibido una trama de 60 bytes (el CRC no cuenta, lo ha consumido el hardware), que justamente es la trama mínima
Se muestra primera la dirección origen: 6e:4b:68:85:f6:40 (6 bytes) y luego la destino (3a:f6:9b:4b:fa:46) y después los 2 bytes del protocolo (0x7a05). Por último se muestra el campo de datos, en hexadecimal en la izquierda y en ASCII a la derecha. El campo de datos tiene los 4 bytes de la cadena Hola y el resto es el relleno
Capturando tramas en un fichero
La herramienta tcpdump nos permite almacenar la información de las tramas capturadas en un fichero, que luego podemos analizar usando wireshark. Vamos a repetir el experimento anterior, pero ahora grabando en un la trama en el fichero ethernet-1.cap
En PC4 ejecutamos el siguiente comando:
pc4:/hosthome# tcpdump -i eth0 -w ethernet-1.cap -s 0
En PC1 volvemos a enviar la trama. Pulsamos control-c en PC para que la captura termine
pc4:/hosthome# tcpdump -i eth0 -w ethernet-1.cap -s 0
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
1 packets captured
1 packets received by filter
0 packets dropped by kernel
Nos indica que ha recibido un paquete. Ahora, desde nuestra máquina Linux vemos que ha aparecido el fichero ethernet-1.cap: Contiene la captura
Analizando la captura con Wireshark
Wireshark es una herramienta que nos permite analizar las tramas almacenadas en un fichero, de una forma muy fácil
Desde el ordenador hacemos doble click en el archivo ethernet-1.cap, y se nos abre wireshark
Hay tres paneles horizontales. En el panel superior vemos las tramas capturadas. Se coloca una línea por cada trama. En nuestro ejemplo, sólo hay una trama (ya que sólo hemos capturado una trama)
En la izquierda vemos el número de trama. La nuestra es la primera: 1. Y es la que se usa como referencia de tiempos, por lo que pone time: 0. A continuación vemos los campos que ya conocemos: dirección destino, dirección origen y tipo de protocolo. En la derecha nos indica el tipo de trama que es: Ethernet. También nos indica su longitud total: 60 bytes. Es la longitud total, incluyendo la cabecera y los datos, pero excluyendo el CRC, que se queda en el nivel físico
El panel inferior contiene la trama cruda al completo. Ahí podemos ver los 60 bytes que componen la trama completa. El primero es 3A y el último 00. Es TODO lo que se ha transmitido por el cable
En la izquierda vemos los valores hexadecimales, y en la derecha los mismos pero en ASCII
El panel central nos da información de los diferentes niveles de la trama. Si pinchamos en el primero, lo que obtenemos es información física: la trama cruda completa. Nos informa de que es una trama de 60 bytes, y en el panel inferior nos resalta todos los bytes que la componen
Si pinchamos en el siguiente nivel, nos informa que se trata de una trama Ethernet y nos da la información de la direción origen, **destino y el protocolo. En el panel inferior se resaltan los 14 bytes de la cabecera Ethernet
Y en el último nivel tenemos los datos: un total de 46. Cuando trabajemos con tramas más complejas, dentro de este campo de datos, a su vez, estará la información de los otros protocolos de nivel superior
Resumen de comandos
Comando | Descripción |
---|---|
tcpdump -i eth0 | Mostrar en la consola el tráfico que hay en la red cuya interfaz es eth0 |
tcpdump -i eth0 -s 0 -w fichero.cap | Capturar todo el trafico que se ve por la interfaz Eth0 y guardalo en el fichero fichero.cap |
Ejercicios para practicar
(TODO)
- Dos tramas: PC1 -> PC2 y PC2 -> PC1
- 4 tramas: Pc1 -> Pc2 * 2, PC3 broadcast, PC2 -> PC3 TODO
Autores
- Felipe Ortega
- Juan González-Gómez (Obijuan)
Creditos
- Creado a partir del contenido generado por profesores del departamento GSYC para la asignatura de Arquitectura de Internet: Jose Centeno González, Pedro de las Heras