Practica 4: Enrutamiento IP, arp, udp y tcp - Obijuan/URJC-Gsyc-2018-Arquitectura-Internet GitHub Wiki
- 1. Escenario A: Configuración enrutamiento IP
- 2. Escenario B: Comunicación de aplicaciones usando el protocolo UDP
- 3. Escenario C: Comunicación de aplicaciones usando el protocolo TCP
- 4. Anexo: Funcionamiento de nc
En la primera parte de esta práctica se afianzan los siguientes conceptos y capacidades:
- Trabajar con escenarios de red preconfigurados
- Estudiar las direcciones IP y las tablas de encaminamiento existentes en máquinas preconfiguradas
- Realizar cambios a tablas de encaminamiento para cumplir las condiciones pedidas
- Elegir direcciones IP y máscaras de subred apropiadas
- Estudiar la salida del comando
traceroute
para deducir las rutas entre máquinas
En la segunda parte de la práctica se cubre el funcionamiento básico de los protocolos de nivel de transporte UDP y TCP.
Nota: Al cargar capturas en Wireshark es necesario ordenar los paquetes por su marca de tiempo, pulsando en la pestaña Time, de esta forma podremos analizar lo que ha ocurrido ordenadamente siguiendo el eje temporal.
- Guión de la práctica en PDF: P4-guion.pdf (opcional) (es lo mismo de esta wiki)
Ficheros que debes descargar para realizar la práctica:
- Captura 1: p4-udp.cap
-
Escenarios de red:
- Escenario A: lab-p4-a.zip
- Escenario B: lab-p4-b.zip
Descarga el fichero lab-p4-a.zip, que contiene un escenario de red y descomprímelo. Lanza ahora NetGUI. En el menú, elige File → Open y selecciona la carpeta lab-p4-a. Verás aparecer la siguiente red:
Arranca todas las máquinas de una en una, esperando que una máquina haya terminado su arranque antes de arrancar la siguiente.
- Observa las direcciones IP que aparecen configuradas en el escenario de red. Comprobarás que todas las máquinas excepto r3 tienen ya configurada su dirección IP. Comprueba qué rutas tienen configuradas
-
Comprueba que en pc1 no funciona un
ping
a la dirección 30.0.0.2. ¿Por qué? Realiza los cambios necesarios en la configuración de pc1 para que dicho ping funcione. Realiza los cambios de forma que pc1 mantenga su nueva configuración aunque se apague y vuelva a encenderse -
La máquina r3 no tiene configuradas sus interfaces de red. Configura direcciones IP adecuadas para sus interfaces eth0, eth1 y eth2, de forma que dicha configuración se mantenga después de apagar y volver a encender r3
-
Realiza los cambios necesarios para que pc2 y pc3 puedan intercambiar datagramas IP y lo hagan por las siguientes rutas:
- Desde pc2 a pc3: pc2 ➜ r3 ➜ pc3
- Desde pc3 a pc2: pc3 ➜ r4 ➜ r2 ➜ pc2
- Intenta realizar los mínimos cambios posibles. Comprueba que las rutas seguidas son las pedidas ejecutando
traceroute
desde pc2 a pc3 y viceversa
-
Realiza los cambios necesarios para que pc4 pueda intercambiar datagramas IP con pc1, pc2 y pc3, independientemente de la ruta por la que lo haga. Intenta realizar los mínimos cambios posibles.
-
Localiza qué máquinas de entre pc1, pc2, pc3 y pc4 no pueden intercambiar datagramas entre sí. Realiza los cambios necesarios para que puedan. Intenta realizar los mínimos cambios posibles.
-
Apaga r1 y r4. Realiza los cambios necesarios para que pc1, pc2, pc3 y pc4 puedan seguir intercambiando datagramas IP entre sí. Intenta realizar los mínimos cambios posibles.
Antes de comenzar a realizar los siguientes ejercicios, espera al menos 10 minutos después de haber ejecutado el
último ping del apartado anterior
Importante: asegúrate también que los PCs pc1, pc4 y el router r2 tienen sus tablas de enrutamiento respectivas configuradas de forma que r2 es el router que encamina el tráfico de ida y vuelta entre pc1 y pc4.
-
Consulta el estado de las cachés de ARP en los pcs y en los routers. Explica su contenido
-
Arranca en r2 y en pc4 un
tcpdump
para capturar tráfico en su interfaz eth0, guardando la captura en un fichero -
Ejecuta en pc1 un ping a pc4 que envíe sólo 1 paquete ICMP Echo Request (
ping -c 1 <máquinaDestino>
) -
Interrumpe las capturas en r2 y pc4 (Ctrl+C)
-
Comprueba el estado de las cachés de ARP en pc1, pc4, y r2. Explica su contenido.
-
Arranca en un terminal de la máquina real la aplicación wireshark para cargar el fichero de captura que has obtenido. Observa y anota el valor de los siguientes campos en los mensajes de la captura:
- Mensaje de solicitud de ARP que envía pc1 a r2
- Dirección Ethernet destino
- Dirección Ethernet origen
- Tipo en la cabecera Ethernet
- Contenido del mensaje de solicitud de ARP: localiza el campo que contiene la dirección IP de la máquina sobre la que se está preguntando su dirección Ethernet
- Mensaje de solicitud de ARP que envía r2 a pc4
- Dirección Ethernet destino
- Dirección Ethernet origen
- Tipo en la cabecera Ethernet
- Contenido del mensaje de solicitud de ARP: localiza el campo que contiene la dirección IP de la máquina sobre la que se está preguntando su dirección Ethernet
- Mensaje de respuesta de ARP que envía pc4 a r2
- Dirección Ethernet destino
- Dirección Ethernet origen
- Tipo en la cabecera Ethernet
- Contenido del mensaje de respuesta de ARP: localiza el campo que contiene la dirección Ethernet solicitada
- Mensaje de respuesta de ARP que envía r2 a pc1.
- Dirección Ethernet destino
- Dirección Ethernet origen
- Tipo en la cabecera Ethernet
- Contenido del mensaje de respuesta de ARP: localiza el campo que contiene la dirección Ethernet solicitada
- Datagrama IP que envía pc1 a pc4
- Dirección Ethernet destino
- Dirección Ethernet origen
- Tipo en la cabecera Ethernet
- Dirección IP origen
- Dirección IP destino
- Campo TTL
- Datagrama IP que envía pc4 a pc1
- Dirección Ethernet destino
- Dirección Ethernet origen
- Tipo en la cabecera Ethernet
- Dirección IP origen
- Dirección IP destino
- Campo TTL
En la captura p4-udp.cap se muestra una comunicación UDP. Contesta a las siguientes preguntas:
-
¿Cuáles son las direcciones IP y puertos involucrados en la comunicación?
-
¿Qué información puedes extraer de la captura sobre la red en la que se ha realizado la captura?
-
¿Cuál es el número de paquetes UDP y número de bytes de datos intercambiados?
Descarga el fichero lab-p4-b.zip, que contiene un escenario de red. Descomprímelo
Lanza ahora NetGUI. En el menú, elige File → Open y selecciona la carpeta lab-p4-b en la que está el escenario. Verás aparecer la siguiente red:
Arranca todas las máquinas de una en una, esperando que una máquina haya terminado su arranque antes de arrancar la siguiente
En este apartado utilizarás la orden nc
para observar el funcionamiento de UDP en diversas situaciones. Ve ahora al anexo de esta práctica en el que se explica cómo utilizar nc para arrancar clientes y servidores UDP, y vuelve aquí después para continuar
-
Inicia una captura en el router r1. (Esta captura puedes realizarla sin necesidad de guardar el contenido en un fichero. La utilizaremos para ver los paquetes que se generan. Para ello ejecuta en r1:
tcpdump -i eth0
-
Usando
nc
lanza una aplicación servidor UDP en la máquina 12.0.0.10 y puerto 11111:nc -u -l -p 11111
-
Usando
nc
lanza una aplicación cliente UDP en la máquina 11.0.0.10 para que se comunique con el servidor. (no envíes datos ni desde el cliente al servidor ni desde el servidor al cliente), desde el puerto local 33333:nc -u -p 33333 12.0.0.10 11111
-
Interrumpe la captura
Explica qué paquetes deberían haberse capturado. Observa la captura y comprueba tu suposición.
-
Inicia una nueva captura en el router r1 para que guarde los paquetes capturados en un fichero
-
Escribe en el terminal donde tienes lanzado el cliente 20 líneas de texto, pulsando una letra cualquiera del teclado (con el tamaño por defecto del terminal de NetGUI, cada línea permite escribir 80 caracteres, así que estarás generando una línea de 80x20=1600 carácteres, cada uno de ellos ocupando 1 byte)
-
A continuación pulsa la tecla ENTER
Antes de observar en la captura lo que ha ocurrido responde a estas preguntas:
3.1. ¿cuántos datagramas UDP crees que se han enviado, y por qué?
3.2. ¿cuántos datagramas IP crees que se han enviado, y por qué?
3.3. ¿cuántos bytes de datos irán en cada datagrama UDP?
Interrumpe ahora la captura y comprueba si tus suposiciones son correctas. Explica razonadamente el número de datagramas UDP, el número de datagramas IP, y el número de bytes de datos que va en cada uno de los datagramas UDP
-
Inicia una captura en el router r1. Esta vez no es necesario guardar el contenido en un fichero
-
Interrumpe la ejecución del cliente pulsando Ctrl+C
-
Interrumpe la ejecución del servidor pulsando Ctrl+C
Explica cuántos paquetes deberían haberse capturado y por qué como consecuencia de terminar el cliente con Ctrl+C. Interrumpe la captura y comprueba tu suposición.
En este apartado utilizarás la orden nc
para observar el funcionamiento de TCP en diversas situaciones. Ve ahora al anexo de esta práctica en el que se explica cómo utilizar nc
para arrancar clientes y servidores TCP, y vuelve aquí después para continuar. Utilizaremos el mismo escenario NetGUI del apartado anterior
-
Inicia una captura en el router r1 y guarda su contenido en un fichero
-
Usando
nc
, lanza una aplicación servidor en la máquina 12.0.0.10 que atienda peticiones de conexión destinadas al puerto TCP 11111:nc -l -p 11111
-
Lanza una aplicación cliente con
nc
en la máquina 11.0.0.10 para que se establezca una conexión TCP con la aplicación servidor, usando como puerto local TCP el 33333:nc -p 33333 12.0.0.10 11111
. Explica cuántos paquetes deberían haberse capturado y por qué.
Interrumpe la captura y comprueba si tus respuestas se corresponden con lo observado en la captura.
-
Inicia una captura en el router r1 y guarda el contenido en un fichero
-
Interrumpe la ejecución del cliente pulsando Ctrl+C en el cliente 2. Explica cuántos paquetes deberían haberse capturado y por qué
Interrumpe la captura y comprueba si tus respuestas se corresponden con lo observado en la captura.
Vamos a visualizar los bufferes in/out (recepción/emisión) en TCP. Inicia una captura en el terminal de r1 guardando el contenido en un fichero
-
Lanza una aplicación servidor utilizando
nc
en la máquina 12.0.0.10 que acepte conexiones en el puerto TCP 11111 (arráncala en segundo plano):nc -l -p 11111 &
-
Lanza una aplicación cliente con nc en la máquina 11.0.0.10 para que se conecte al servidor, desde el puerto local TCP 33333:
nc -p 33333 12.0.0.10 11111
-
Observa el estado que muestra
netstat -tna
en el servidor y sus buffers -
Trae a primer plano la ejecución de nc ejecutando en el terminal:
fg
-
Pausa con Ctrl+Z la ejecución de
nc
en el servidor, para que la aplicación del servidor siga arrancada pero no se ejecute, por tanto, si TCP en el lado servidor recibe datos, estos no se se van a leer en nc quedarán almacenados en la cola de entrada de la implementación de TCP -
Para ver cómo los datos se quedan almacenados en el servidor, envía una cadena de caracteres desde el cliente y pulsa INTRO
-
Ejecuta
netstat -tna
en el servidor para ver cómo esos datos se quedan en el buffer de recepción y no los lee la aplicación -
Interrumpe la captura y fíjate cómo hay un asentimiento que indica que todos los datos han sido recibidos. Dado que la aplicación servidor está suspendida, los datos se encuentran almacenados en el buffer de recepción de la implementación de TCP, en el kernel del sistema operativo, pero no los ha leído aún la aplicación servidora arrancada con nc
-
Trae a primer plano la ejecución del servidor, para ello usa
fg
. Verás como los datos que habías enviado desde el cliente se muestran en la pantalla. El servidor los ha leído del buffer de recepción y el buffer está vacío.
Una vez realizada la prueba puedes interrumpir la ejecución del cliente y el servidor
Provoca las siguientes situaciones de error:
-
Existe la máquina 12.0.0.10 pero no hay una aplicación escuchando en el puerto 11111. Prueba a lanzar el cliente y comprueba qué ocurre
-
Existe la red 12.0.0.0 y hay ruta para llegar hasta ella, pero no existe la máquina 12.0.0.10. (Para realizar este apartado apaga la máquina 12.0.0.10). Prueba a lanzar el cliente y comprueba qué ocurre
Las aplicaciones que se utilizarán en esta práctica para generar tráfico TCP y UDP siguen el modelo de comunicaciones cliente/servidor. En este modelo, cuando dos aplicaciones se comunican una de ellas funcionará como servidor y la otra funcionará como cliente
Siempre es necesario lanzar primero la aplicación que funciona como servidor, que quedará a la espera de recibir tráfico procedente de la aplicación cliente, que se deberá lanzar después
En esta práctica utilizaremos la aplicación nc
para arrancar aplicaciones que utilizan TCP o UDP. nc
puede arrancarse como cliente o como servidor, utilizando TCP o UDP como protocolo de transporte. Una aplicación nc
lanzada como cliente se comunicará con otra lanzada como servidor y viceversa. Una aplicación lanzada con nc
como cliente lee de la entrada estándar (por omisión el teclado) los caracteres introducidos y al pulsar la tecla INTRO la línea de texto es enviada usando TCP o UDP a la aplicación servidor. Al recibir la línea de texto, la aplicación servidor lanzada con nc
mostrará en la pantalla los datos recibidos de la aplicación cliente lanzada con nc
Para arrancar una aplicación que funciona como servidor utilizando el protocolo UDP ejecutaremos la siguiente orden:
nc -u -l -p <Pto-Loc>
Donde:
-
<Pto-Loc>
es el número de puerto local UDP en el que la aplicación servidor esperará recibir los datagramas UDP de una aplicación cliente
Por ejemplo, si queremos arrancar una aplicación servidor UDP en el puerto 7777 de la máquina pc1 utilizaremos la siguiente orden:
pc1:~# nc -u -l -p 7777
Para arrancar una aplicación que funciona como cliente utilizando el protocolo UDP ejecutaremos la siguiente orden:
nc -u -p <Pto-Loc> <IP-dest> <Pto-dest>
Donde:
-
<Pto-Loc>
: es el número de puerto local UDP en el que la aplicación cliente esperará recibir los datagramas UDP que vengan del servidor -
<IP-dest>
: es la dirección IP de la máquina donde se está ejecutando la aplicación servidor UDP -
<Pto-dest>
: es el número de puerto UDP en el que escucha la aplicación servidor UDP
Por ejemplo, si queremos arrancar una aplicación cliente UDP que espere recibir datagramas UDP en el puerto 6666 y que envíe datagramas UDP a la dirección IP 200.0.0.1 y puerto 7777 (donde se encuentra esperando recibir datagramas UDP la aplicación servidor) utilizaremos la siguiente orden:
pc2:~# nc -u -p 6666 200.0.0.1 7777
Una vez lanzadas las aplicaciones servidor UDP y cliente UDP, el cliente puede enviarle líneas de texto al servidor. Después de que el cliente haya enviado al menos una línea de texto al servidor, todo lo que escribamos a través de la entrada estándar de un extremo será enviado al otro extremo como datagramas UDP: si escribimos en el terminal de la aplicación cliente, esto será enviado a la aplicación servidor, y viceversa
Para interrumpir la ejecución de estas aplicaciones se debe utilizar Ctrl+C
Para arrancar una aplicación que funciona como servidor utilizando el protocolo TCP ejecutaremos la siguiente orden:
nc -l -p <Pto-Loc>
Donde:
-
<Pto-Loc>
es el número de puerto local TCP en el que la aplicación servidor esperará recibir mensajes TCP de una aplicación cliente
Por ejemplo, si queremos arrancar una aplicación servidor TCP en el puerto 7777 de la máquina pc1 utilizaremos la siguiente orden:
pc1:~# nc -l -p 7777
Para arrancar una aplicación que funciona como cliente utilizando el protocolo TCP ejecutaremos la siguiente orden:
nc -p <Pto-Loc> <IP-dest> <Pto-dest>
Donde:
-
<Pto-Loc>
es el número de puerto local TCP en el que la aplicación cliente esperará recibir los mensajes de la aplicación servidor TCP -
<IP-dest>
es la dirección IP de la máquina donde se está ejecutando la aplicación servidor TCP -
<Pto-dest>
es el número de puerto TCP en el que escucha la aplicación servidor TCP
Por ejemplo, si queremos arrancar una aplicación cliente TCP que utilice el puerto origen 6666 para establecer una conexión TCP con un servidor TCP que escuche en el puerto destino 7777 de la máquina 200.0.0.1, utilizaremos la siguiente orden:
pc2:~# nc -p 6666 200.0.0.1 7777
Una vez iniciada la aplicación servidor TCP, ésta se queda esperando recibir mensajes de una aplicación cliente TCP
Una vez iniciada la aplicación cliente TCP, ésta intercambiará unos mensajes de control (apertura de conexión) con la aplicación servidor, por lo que es imprescindible que dicha aplicación servidor haya sido lanzada antes
Si la comunicación entre ambas aplicaciones es posible, a partir de este momento todo lo que escribamos a través de la entrada estándar de una aplicación será enviada a la otra: si escribimos en el terminal de la aplicación cliente,esto será enviado a la aplicación servidor, y viceversa
Para interrumpir la ejecución de estas aplicaciones se debe utilizar Ctrl+C.