Nos faltan dos procesos básicos para cubrir el tema técnico de la primera parte de CCNA, ya les he insistido que deben prestarle mucha atención dado que es la base de todo lo «avanzado». Los procesos de los cuales hablo son resolución de direcciones y enrutamiento. En ésta entrada les voy a describir el proceso de resolución de direcciones en IPv4 e IPv6 y vamos a aprovechar para mirar cómo se ve ese tráfico en una red real. Disfrútenlo.
Introducción: resolución de direcciones
A estas alturas hemos mencionado varios principios de las comunicaciones de datos: funcionamiento de la tecnología ethernet, elección del primer salto, funcionamiento de un switch y direccionamiento de capa 3 con el protocolo IP. Hemos dicho también, que la elección del primer salto implica usar la dirección MAC del router para enviar tráfico fuera de nuestra propia red. Sin embargo, nos falta algo: cómo aprendemos las direcciones MAC. Ese proceso se llama resolución de direcciones y en IPv4 hay un protocolo encargado de eso, se llama ARP o Address Resolution Protocol por sus siglas en inglés. Para IPv6 es diferente y más interesante, IPv6 utiliza ICMP, un protocolo de diagnóstico de la red, para hacer resolución de direcciones y lo hace de una manera más eficiente. En amnos casos el proceso implica llenar una tabla que hace corresponder una dirección de capa 2 (MAC para ethernet), con la correspondiente dirección de capa 3 (generalmente IP).
ARP: hallar la MAC teniendo la IP
ARP es un proceso bastante simple, lo que me pareció curioso la primera vez que ví el tema fue: cómo es que tengo la IP pero no la MAC? La respuesta es muy simple: información que proviene de capas superiores. Un ejemplo clásico y fácil es cuando abrimos un navegador y escribimos la dirección IP de algún servidor (sin usar nombre de dominio), en éste caso, nuestro enter en la barra de direcciones se convierte en un mensaje GET de HTML que a su vez es encapsulado en un segmento (así se le llaman a las unidades de datos de capa 4: segmento o datagrama) TCP cuyo puerto destino es el 80 y éste a su vez encapsulado en un paquete IP cuya dirección destino es la del server y hasta ahí nos llega la dicha! En éste camino por la encapsulación de la información (hacia el medio de transporte), hasta ésta etapa todo fue proporcionado directamente por el host (el usuario digitó la IP destino y el puerto destino lo proporciona el navegador porque siempre lo usa para sus peticiones -es un puerto bien conocido). Pero qué pasa con las direcciones MAC? La compu no sabe las MAC de la red, de hecho, si la red fuera muy grande sería muy complicado recolectarlas, por ende se necesita un mecanismo para encontrarlas cada vez que se necesitan, ese mecanismo es la resolución de direcciones.
En alguna publicación anterior mencioné que existen tres tipos de comunicación: Unicast, Multicast y Broadcast, siendo Unicast el caso típico de una comunicación (uno a uno). Los tres tipos de comunicación usan direcciones especiales para saber qué tipo de comunicación se está realizando y para obligar a un host o nodo de la red a procesar la información del paquete a pesar de no ser su propia dirección (en el caso de multicast y broadcast). Estas direcciones son tanto de capa 2 como de capa 3, es decir, una dirección de broadcast en IP es 255.255.255.255 y una MAC de broadcast sería FF:FF:FF:FF:FF:FF, igual ocurre con las direcciones de Multicast: hay de capa 3 y de capa 2.
ARP, que sólo se usa en un contexto IPv4, envía un broadcast, es decir, un paquete cuya IP destino es 255.255.255.255, éste es un nro especial que hace que todos los nodos conectados al mismo segmento lean el paquete. Al alcance de éste paquete se le conoce como dominio de broadcast precisamente por eso, para resumirlo, el dominio de broadcast incluye todo dispositivo que se conecte a una interfaz de un router. La razón es muy simple: el router actúa como un host más del segmento, es decir, también lee el broadcast y probablemente responderá muchos de los mensajes que se envíen de esa manera pero no reenviará ese paquete a otras redes, es decir, allí muere la propagación del broadcast, llega a todos pero dentro de un segmento particular y cada interfaz de un router es un segmento diferente.
Como éste mensaje le llega a todos los dispositivos en el segmento, un nodo, host o dispositivo (cualquier nombre aplica) puede preguntar algo como quién tiene la IP 172.16.0.1? y quien responda le va a dar su dirección MAC. En otras palabras, ARP sabe la IP, manda un broadcast y recibe la MAC de uno entre todos los receptores, aquel que tiene esa IP configurada. El caso más común es el de la puerta de enlace o gateway, tal dirección está configurada en el host y cuando él detecta un paquete cuya IP destino está fuera de la red lo enviará en capa 2 al gateway, pero primero debe saber su MAC. En otras palabras, cualquier transmisión hacia afuera de la red es susceptible de requerir el envío de un mensaje ARP previo. Sin embargo, si eso fuera necesario todo el tiempo también sería muy ineficiente, por ende, las MAC se guardan durante cierto tiempo en la tabla arp. Ésta tabla ya la hemos mencionado brevemente en otra publicación. En resumen, cuando una compu va a enviar tráfico a cierta IP, cuando llega el momento de construir una trama buscará la IP en la tabla arp y si la tiene usará la MAC correspondiente y si no la tiene enviará una solicitud ARP.
ICMP: el protocolo de errores y notificaciones IP
Antes de hablar del proceso de resolución de direcciones en IPv6 hay que hablar un poco de qué es ICMP o Internet Control Messaging Protocol. Suena sofisticado pero en realidad es muy simple: es un mecanismo de notificaciones adjunto a IP, es decir, en vez de usarse paquetes IP para notificar situaciones de error o problemas en la red se usa ICMP. Éste protocolo es el que usan aplicaciones como ping o traceroute entre otras, pero todos los dispositivos usan ICMP en algún momento. Un ejemplo es cuando llega un paquete a un host cuyo puerto destino no está abierto, el host retorna un mensaje de error llamado port unreachable destinado al host que envió el paquete inicial para que sepa que el puerto o el servicio como tal no está en funcionamiento en éste nodo. Otro ejemplo es cuando un router recibe un paquete destinado a una ip que no tiene en la tabla de enrutamiento y éste tampoco tiene una ruta por defecto, en éste caso el router responde con un paquete llamado network unreachable destinado a quien envía el paquete errático indicando que no hay cómo llegar a la red destino. ICMP es un protocolo con un diseño muy ambicioso: tiene mensajes de error y notificación, que no sólo permitían indicar condiciones de error sino influír en la forma en que enviaban tráfico los host mismos. IPv4 no pudo aprovechar mucho estas funcionalidades debido a problemas de seguridad, pero IPv6 tiene la esperanza de retomar todas estas capacidades diseñadas en ICMP.
Obviamente, para IPv6 el protocolo no es el mismo, es ICMPv6 🙂 Pero no es sólo un cambio de nombre, aparte de que ahora se encapsula en un paquete IPv6 en vez de IPv4, se le dan muchas más responsabilidades, se incrementan sus campos y se reestructura la forma en que funciona, en fin, se convierte en un protocolo muy interesante y hace a la red IPv6 mucho más dinámica y eficiente. Tal vez en un futuro hablemos muy en detalle sobre ICMPv6 pero por lo pronto sólo era necesario entender para qué se usa.
Así se ve la tabla arp en una compu portátil Win10:
Se ve rara, cómo que 3 interfaces?! Bueno, luego comprenderán que cuando una compu usa software de virtualización las redes se empiezan a volver locas. En éste caso, la única red real es la última, las otras dos son de VMWare. Lo que deben observar, es que a cada dirección IP le corresonde una MAC, las direcciones IPs que comienzan con un octeto mayor o igual a 224 son direcciones especiales (por eso no parecen ser del mismo segmento). En el caso de mi laptop, sólo tengo la IP del gateway y la de broadcast, si estuviera recibiendo archivos de alguna otra compu probablemente estaría allí junto con su MAC. Recuerden, cada entrada dinámica de ésta tabla se guarda sólo durante cierto tiempo, creo que por defecto son 5 minutos (300s).
ARP en IPv6: ICMPv6
Cuando una compu usa también IPv6 la tabla de arp no sirve, dado que ésta sólo guarda direcciones de 32 bits, entonces se usa una tabla de vecinos. Ésta tabla se llena con información de ICMPv6 en vez de arp, en otras palabras, arp no existe en IPv6. ICMPv6 tiene varios mensajes muy especiales, un par para descubrimiento de vecinos (neighbors) y otro par para descubrimiento de puertas de enlaces (routers), éstos sirven para hacer resolución de direcciones. Los mensajes se llaman NS, NA y RS, RA, es decir, Neighbor Solicitation, N. advertisment y Router Solicitation, R. Advertisment. El principio es el mismo de ARP sólo que mucho más eficiente, en el caso de IPv6 no se usa broadcast, en vez de ello, se utiliza una dirección MAC especial derivada de la IPv6 que se tiene para crear una dirección multicast que probablemente sólo responda el host requerido. En otras palabras, si conozco la IPv6 de la cual necesito la MAC, puedo crear una MAC intermedia de multicast, que probablemente sólo el host objetivo me va a responder, en todo caso, no es una dirección que tengan que procesar todos los nodos de la red. Éstos son detalles que en realidad no incumben para el examen de éste nivel, sólo recuerden que en IPv6 se usan los mensajes NS, NA de ICMPv6 para hacer resolución de direcciones. Finalmente, a todo ésto de descubrir routers y vecinos se le conoce como Neighbor Discovery, incluyendo la posibilidad de que un router envíe un mensaje de redirección a los hosts.
NOTA: No es necesario que lo sepan para la certificación 200-301, pero para conocer los vecinos IPv6 se usa netsh y en el contexto de interface ipv6 se usa el comando show neighbors (Ver). No es buena idea meterse con IPv6 sin saber porque terminan con la idea de que es muy complejo cuando no lo es 😉
Captura de tráfico: Wireshark
A mí me encanta la idea de la captura de tráfico porque me permite «ver» todo lo que hasta ahora es demasiado abstracto. Wireshark es una aplicación libre que permite capturar el tráfico de la red, me muestra los flujos en un resumen en el cual cada línea representa un paquete con la información del flujo (direcciones, protocolo, puertos, etc), información que dependerá un poco del tipo de paquete.
Wireshark hace un truco sucio para poder capturar tráfico y es poner las interfaces en modo promiscuo, es decir, una interfaz de red sólo permite pasar tráfico para sí misma usando como filtro la dirección MAC, en el caso de una interfaz en modo promiscuo se permite pasar cualquier tráfico, no sólo el propio. Por ésta razón y para poder ver el listado completo de interfaces, es necesario correr el programa como administrador. Si lo van a instalar, también deben aceptar la instalación de un driver llamado WinPCAP, que es quien en realidad permite a Wireshark capturar el tráfico.
Si todo salió bien (luego hago una entrada de instalación y análisis de tráfico), ésta sería la pantalla inicial:
Allí observamos todas las posibles interfaces de las cuales podemos capturar y analizar el tráfico. La línea enfrente de cada una es un minigráfico del tráfico, como vemos sólo tres de todas las interfaces tienen tráfico y como ya les comenté anteriormente, las de VMWare son virtuales, es decir, la interfaz de red de mi compu es Wi-Fi2. Se selecciona y se oprime el botón de la aleta azul en la esquina superior izquierda.
La siguiente pantalla se debería parecer a ésto:
Como una compu genera automáticamente mucho tráfico, yo sugiero que durante las capturas se tenga preparado qué tráfico se va a generar y durante cuánto tiempo, de tal manera que cuando inicie la captura sepa cuándo pararla y evitar saturarme de información y que la captura misma sea demasiado grande. En éste caso sólo capturé un minuto y paré la captura oprimiendo el botón en seguida de la aleta (ya está gris pero mientras hay captura está en rojo).
Lo que pueden observar en el gráfico anterior, es que le di click a la línea nro 2, en el segundo panel aparecen los encabezados del paquete y bajo éste los mismos valores pero en hexadecimal. De los encabezados, también di click en el símbolo > al lado del encabezado IP para poder observar los valores. Tómense un tiempo para ver lo que dice, compararlo con la línea a la cual le dí click y recordar todo lo que vimos en la entrada anterior sobre el encabezado IPv4.
Finalmente, voy a hacer otra captura de una solicitud ARP. Éstos son los pasos que voy a seguir:
- Eliminar las entradas de la tabla arp: ésto obliga a que cualquier comunicación genere una petición arp.
- Iniciar la captura en Wireshark
- Hacer un ping a una IP dentro de mi propia red: Antes de que se envíen los paquetes de ping, se debe ver una «conversación» arp
- Terminar la captura cuando el ping haya finalizado
Con esos pasos voy a tratar de minimizar el tráfico innecesario, pero al final seguro no se puede, así que usaremos un filtro. El filtro establece criterios basados en los encabezados para mostrar una porción del tráfico capturado, por ejemplo, mostrar sólo lo que sea arp.
Miren con calma las imágenes en su secuencia (la ip de mi laptop es 192.168.1.88 y su MAC aparece como KingjonD_1f:09:81): miro la tabla arp, la borro (hay que ejecutar cmd con privilegios), escribo un ping a una IP conocida (no le doy enter, inicio la captura), le doy enter al ping (cuando termina paro la captura), miro el resultado (observo varios NS/NA de IPv6!) y aplico un filtro para ver sólo el ping. He borrado las partes iniciales de todas las direcciones IPv6 ya que eran públicas y por ende rastreables 😉
Observen en particular, que arp no tiene encabezado IP, por eso las direcciones que aparecen en wireshark son MAC, cuyo OUI está reemplazado por un mnemónico del fabricante del hardware, en la imagen del paquete arp se pueden ver los campos que contiene el encabezado: hardware type, protocol type, tamaño de dirección, MAC e IP de la fuente y MAC (inicialmente están en 0) e IP del nodo objetivo (target). Dos paquetes después del primer arp se ve la respuesta.
Conclusiones y próximas publicaciones
Aunque puede no parecer importante, el efecto de arp en el tráfico e incluso en la utilización de CPU de los hosts en una red es importante y va a determinar varias cosas en el diseño de red más adelante. Es un proceso básico, por ende va a ocurrir siempre que tengamos IP/Ethernet en una red, así sea sobre tecnologías más avanzadas como MPLS.
IPv6 hace un trabajo interesante en la optimización de la resolución de nombres, empezando por meterlo dentro de un proceso más grande llamado Neighbor Discovery y usando ICMP en vez de un protocolo adicional como lo hace IPv4.
Finalmente, las capturas de tráfico nos serán de mucha utilidad, por lo pronto para comprender cómo funciona la red y sus protocolos pero más adelante será un importante aliado para hacer diagnósticos bien fundamentados. Ya vieron cómo se hace, jueguen, investiguen en el tráfico de la red y aprendan como funciona, si tienen preguntas: comenten! Recuerden que también en facebook tengo una página para interactuar con los lectores.
Espero que ésta lectura haya sido agradable y productiva, si así fue por favor comenten y compartan. Síganme en las redes y compartan el contenido que va a seguir alineado con los contenidos de CCNA en su última versión (la 7a). En las próximas publicaciones escribiré sobre cómo construir y configurar la red básica que hemos estado observando en cada publicación.