Tabla MAC

El día de hoy explicaremos como es que un equipo de capa 2 crea su tabla de mac, como hace el reenvío de tráfico hacia los destinos, como podemos agregar entradas estáticas y como podemos realizar búsqueda de macs en la tabla de los equipos Cisco.

Vamos a iniciar y para ello usaremos la siguiente topología en donde 2 switches tienen conexión con 4 pcs y un servidor, para el ejercicio nos vamos a centrar en los equipos que pertenecen a la misma vlan PC1, PC4 y el Server.

PC1  necesita realizar un telnet al servidor, vamos a suponer que la ip del servidor ya esta en la tabla de arp de PC1 y que la tabla de mac de los swicthes no tiene ninguna entrada.

topo-macs

Paso 1: PC1 envía una solicitud de arp hacia el servidor, el SW1 agrega en su tabla mac los datos de PC1, el puerto, la mac y la vlan a la que pertenece.

mac-sw-1

Paso 2: Como SW1 no conoce los datos del servidor realiza un flooding mandando un broadcast a todos los puertos que pertenecen a la misma vlan y a los puertos trunk  pero no al puerto f0/1 que es por donde aprendió la mac de PC1, el paquete es mandado hacia la interface f0/0 y SW2 agrega los datos en su tabla mac.

mac-sw-2

Paso 3: Como SW2 tampoco conoce la mac del server también realiza un floodig, los paquetes son enviados a todos los puertos de la misma vlan y a todos los puertos trunk por lo que PC4 y el Server reciben la solicitud, PC4 no responderá ya que la solicitud no es para él, entonces el Server responde y SW2 agrega en su tabla mac los datos.

En este paso el tráfico va de regreso por lo que la dirección de destino es la mac de PC1, como SW2 ya sabe por cual puerto conoce la mac de PC1 solo envía el paquete a la interface fa0/0.

mac-sw-22

Paso 4: Cuando el paquete llega a SW1 la dirección mac de destino sigue siendo la de PC1, como SW1 ya sabe por cual puerto conoce la mac solo envía el trafico al puerto fa0/1 y la conexión es establecida.

mac-sw-22

Siguiendo los pasos anteriores se muestra que el switch construye su tabla de mac en base a tramas entrantes.

Importante: No olvidar que para que pueda haber comunicación entre diferentes vlans se requiere de un equipo de capa 3.

Búsqueda de macs en los Switches.

Vamos a utilizar la misma topología y ahora necesitamos rastrear por medio de la mac en que puerto esta conectado PC3, como dato tenemos lo siguiente:

mac de PC3 = 000b.900d.0d40

Entramos al SW1y comenzamos la búsqueda de la mac.

SW1#sh mac address-table add 000b.900d.0d40
Mac Address Table
——————————————-

Vlan    Mac  Address     Type          Ports
—-         ———–         ——–          —–
7     000b.900d.0d40  DYNAMIC  Fa0/0

Lo información anterior indica que SW1 aprende la mac por su puerto fast0/0 y que pertenece a la vlan 7, del diagrama sabemos el el puerto fa0/0 es la conexión al SW2, si no tuviéramos el diagrama, una forma de saber a que equipo nos conectamos es ejecutando el comando «show cdp neig det» y conectarnos vía telnet a la ip que nos arroje el comando, una vez conectados al nuevo equipo habrá que volver a ejecutar «sh mac address-table add».

SW2#sh mac address-table add 000b.900d.0d40
Mac Address Table
——————————————-

Vlan Mac Address Type Ports
—- ———– ——– —–
7 000b.900d.0d40 DYNAMIC Fa0/4
Total Mac Addresses for this criterion: 1

Finalmente el SW2 conoce la mac por el puerto 4 que es en donde esta conectada PC3.

TIP:  Si tuviéramos una red swicheada de gran tamaño y quisiéramos rastrear una o varias macs solo tendríamos que repetir los pasos anteriores en cada uno de los switches.

Para agregar una entrada estática a la tabla de mac de un switch ejecutamos:

SW1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
SW1(config)#mac address-table static aaaa.aaaa.aaaa vlan 7 interface fastEthernet 0/10

Obtener estatus de puertos trunk con shell y snmp

A continuación se muestra un script en shell que obtiene el estatus de los puertos trunk de un switch Cisco y los muestra en pantalla, si no puede obtener los valores mostrará el mensaje de error.

Los valores son almacenados en archivos ya que es mas rápido operar éstos que realizar varias consultas snmp al equipo.

#VARIABLES GLOBALES
ip_equipo=$1
communi="TU_COMUNIDAD"
RUTA="/RUTA/DEL/SCRIPT"
function obtieneTrunkDown
{
ipe=$1

##OBTENEMOS VALORES DE LAS INTERFACES
 /opt/OV/bin/snmpwalk -c $communi $ipe 1.3.6.1.4.1.9.9.46.1.6.1.1.14 | awk 'BEGIN { FS=":" } {print $1, $3}'| tr -s " " ":" > $RUTA/interfaces.$ipe
 /opt/OV/bin/snmpwalk -c $communi $ipe 1.3.6.1.2.1.2.2.1.2 | awk 'BEGIN { FS=":" } {print $1, $3}' | tr -s " " ":" > $RUTA/idesc.$ipe
 /opt/OV/bin/snmpwalk -c $communi $ipe 1.3.6.1.2.1.2.2.1.8 | awk 'BEGIN { FS=":" } {print $1, $3}' | tr -s " " ":" > $RUTA/istatus.$ipe

#DETERMINAMOS TRUNKS
 awk 'BEGIN { FS=":" }{if ($2==1) print $1}' $RUTA/interfaces.$ipe | cut -d"." -f9 > $RUTA/indicesTrunk.$ipe && rm $RUTA/interfaces.$ipe

#OBTENEMOS DESCRIPCION Y ESTATUS DE LOS TRUNKS
 for indices in `cat $RUTA/indicesTrunk.$ipe`
 do
 grep "ifDescr.$indices:" $RUTA/idesc.$ipe | awk 'BEGIN { FS=":" } {print $2}' >> $RUTA/descfinal.$ipe
 grep "ifOperStatus.$indices:" $RUTA/istatus.$ipe | awk 'BEGIN { FS=":" } {print $2}' >> $RUTA/operfinal.$ipe
 done
 rm $RUTA/idesc.$ipe $RUTA/istatus.$ipe

paste $RUTA/descfinal.$ipe $RUTA/operfinal.$ipe > $RUTA/stattrunk.$ipe
 rm $RUTA/descfinal.$ipe $RUTA/operfinal.$ipe $RUTA/indicesTrunk.$ipe

if test -s $RUTA/stattrunk.$ipe
 then
 awk 'BEGIN { print " Interfaces Status "
 print "============== =========="}
 { printf "% -20s %s\n", $1, $2 }' $RUTA/stattrunk.$ipe
 else
 echo "Error al obtener valores"
 fi
 rm $RUTA/stattrunk.$ipe
 }
 #////////MAIN///////////
 if test ! -z $1
 then
 obtieneTrunkDown $ip_equipo
 else
 echo
 echo "ERROR no se tecleo la ip del equipo"
 echo "Utiliza sh <script> <IP>"
 echo
 fi
 

Para ejecutar el script tenemos

#>sh muestraTrunk 10.183.104.155 2>/dev/null
Interfaces                      Status
============== ==========
FastEthernet0/1              up
FastEthernet0/2              up
FastEthernet0/3              up
FastEthernet0/20            up
FastEthernet0/21            up
FastEthernet0/22            up
FastEthernet0/23            up
FastEthernet0/24            up

#>sh muestraTrunk 10.183.104.15 2>/dev/null
Error al obtener valores

#>sh muestraTrunk 2>/dev/null

ERROR no se tecleo la ip del equipo
Utiliza sh <script> <IP>

El script se programo sobre un equipo HP-UX

😛

Tipos de puertos Access – Trunk

Cuando tenemos una red con equipos de capa 2 es necesario conocer los tipos de puertos que pueden existir, hoy hablaremos de los puertos access y trunk y mencionaremos las diferencias entre cada uno de ellos, ademas de como podemos realizar la configuración en equipos cisco.

Access: La principal utilidad que se les da a este tipo de puertos es para conectar equipos finales, los puertos de acceso solo  transportan tráfico de una sola vlan y aunque los puertos de acceso también se pueden utilizar para conectar switches no es recomendable ya que una implementación de este tipo no es escalable.

Puertos de acceso

Puertos de acceso

Tomando como referencia la topología anterior, cuando una pc manda un paquete, dicho paquete no lleva ningún identificador ni sabe a que vlan pertenece y sera el switch quien le asigne el identificador de la vlan a la que este asociado el puerto.

A continuación se muestra la configuración que se debe aplicar en los puertos para ponerlos como acceso.

SW1#conf ter
Enter configuration commands, one per line. End with CNTL/Z.
SW1(config)#int fa0/0
SW1(config-if)#description SW1-N1
SW1(config-if)#switchport mode access
SW1(config-if)#switchport access vlan 2

SW1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
SW1(config)#int fa0/1
SW1(config-if)#description SW1-N2
SW1(config-if)#switchport mode access
SW1(config-if)#switchport access vlan 2

Ojo, es importante que antes de asignar un puerto a una vlan, la vlan ya debe estar creada, en algunos equipos se puede utilizar el comando «vlan database» o también bastara con entrar a modo configuración y definir el numero de vlan + el nombre.

SW1#vlan database
SW1(vlan)#vlan 2 name TEST

SW1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
SW1(config)#vlan 2 name TEST

Para verificar la configuración ejecutamos:

SW1#sh int fa0/0 switchport
Name: Fa0/0
Switchport: Enabled
Administrative Mode: static access

Trunk: La principal utilidad que se le da a este tipo de puertos es para realizar la conexión entre switches, un puerto trunk puede transportar trafico de múltiples vlans, por lo que, podemos tener múltiples vlans en los switches y solo un enlace para transportar todo el tráfico.

Puerto Trunk

Puerto Trunk

Si se conectaran un par de switches con multiples vlans y se utilizaran puertos de acceso para la  conexión necesitamos N puertos para transportar N vlans diferentes lo cual no es escalable, para ello existen los puertos trunk.

Se requieren N puertos para transportar N vlans

Puertos de acceso

A continuación se muestran los comandos para crear un puerto trunk entre 2 switches.

SW2#conf t
Enter configuration commands, one per line. End with CNTL/Z
SW2(config)#int fa1/0
SW2(config-if)#description SW2 -> SW1
SW2(config-if)#switchport mode trunk
SW2(config-if)#speed 100
SW2(config-if)#duplex full

SW1#conf t
Enter configuration commands, one per line. End with CNTL/Z
SW1(config)#int fa1/0
SW1(config-if)#description SW1 -> SW2
SW1(config-if)#switchport mode trunk
SW1(config-if)#speed 100
SW1(config-if)#duplex full

Para verificar lo configurado ejecutamos:

SW1#sh int fa1/0 switchport
Name: Fa1/0
Switchport: Enabled
Administrative Mode: trunk

Que lo disfruten 🙂