viernes, 29 de abril de 2011

Subnetting con mascara de subred variable (VLSM)

En esta entrada se describira la técnica actual de subnetting ( Creacion de subredes ) con mascara variable o longitud variable, el nombre técnico es VLSM por sus siglas en inglés Variable Length Subnet Masks o creación de subredes de longitud de máscara variable.

Antes de empezar deberemos repasar primero que es una mascara de subred.

Mascara de subred: la máscara de subred es un número de 32 bits con los cuales cada nodo de una red IP determina si los paquetes se dirigen a una red diferente a la propia. Y utiliza grupos de bits consecutivos de todo unos (1) para identificar la parte del Identificador de red y todo ceros (0) para identificar la parte del Identificador de host en una dirección IP. 
Dado que la máscara es una secuencia de unos seguida de ceros, ésta se suele representar con un número que indica cuántos unos tiene (ya se sabe que al principio) y a ese número se le suele llamar prefijo (estrictamente hablando, el prefijo incluiría la dirección de subred). Para que quede más claro, una máscara 255.255.255.0 tiene 32 bits de los cuales los primeros 24 son unos y los últimos 8 son ceros, por lo tanto el prefijo es /24. En éste documento el término máscara hará referencia tanto a la máscara de subred en decimal y como al prefijo recién descrito.

Esquemas de máscara fija

Primero hay que repasar la base de la creación de subredes, por lo menos para entender por qué el término máscara variable. Un esquema de direccionamiento es una forma de decir cómo se va a repartir la capacidad de numeración de hosts que tiene cierta red, básicamente consta de una dirección de red base, una máscara de red, una máscara de subred y la enumeración de las subredes. Usualmente la máscara de red (la de la red base) suele ser una dirección de clase, es decir, una que usa uno, dos o tres octetos (clase A, B y C respectivamente). Para ilustrar la idea, un esquema de direccionamiento consistiría en lo siguiente:

  • Dirección base y máscara: 192.168.11.0/24, ésta es la dirección que nos proporcionan y de la cual sólo podemos variar arbitrariamente la máscara (alargarla solamente) y los números en la parte de host (el último octeto).
  • Nueva máscara (subredes): /27, si agregamos 3 bits a la máscara original (24+3=27), tendremos la capacidad de dividir el potencial de hosts (255) en 8 subredes (2^3) y en cada subred podríamos tener hasta 32 host en potencia (2^5), pero no podemos usar el host #0 ni el host #31 ya que éstas direcciones especiales corresponden a la dirección de red y de broadcast para cada subred (parte de host toda en 0 y toda en 1 respectivamente).
  • Enumeración de las subredes: la primera subred (después de la cero) va a ser numerada como 192.168.11.32/27, la primera dirección asignable sería 192.168.11.33 (la cero no se puede usar) y la última sería 192.168.11.62 (hay que recordar que la 63 es la dirección de broadcast -parte de host toda en unos- para ésta subred y no se puede usar para un host ni un enrutador). Si quisieramos enumerar más subredes con la misma máscara, además de la primera (con ésta máscara tenemos 8 subredes en total, 27-24=3 bits de subred y 2^3=8), la numeración de las subredes aumentaría en saltos de a 32 (2^5) y así tendríamos las otras subredes hasta llegar al límite. Es decir, las siguientes subredes serían 192.168.11.64/27, 192.168.11.96/27, 192.168.11.128/27, 192.168.11.160/27, 192.168.11.192/27, 192.168.11.224/27 y para cada una tendríamos una dirección de broadcast y un rango de direcciones asignables a los hosts de cada subred. Note que cada dirección de subred es la anterior más 32, eso sería si usamos máscara fija.

En este esquema, todas las redes tienen la misma capacidad de numeración de hosts, es decir, todas las subredes pueden numerar hasta 30 hosts (2^5=32 menos la dir. de red y de broadcast que no se pueden asignar a ningún host) y esta capacidad está dada por la máscara /27 que agrega 3 bits para subred a la máscara original, alargandola y dejando 5 bits para numerar hosts. Ésta capacidad fija se nota en que la máscara de todas las subredes es la misma, lo único que varía en cada subred es la dirección y sus parámetros (dir. de red/broadcast y rango de direcciones asignables), eso la hace poco flexible y desperdicia capacidad de numeración de la red original.

Usando máscara fija, los requerimientos se pueden presentar de dos formas: pidiendo una cantidad de subredes o pidiendo una cantidad de hosts por subred. En el primer caso determinar la longitud de la máscara es fácil y directo, dado que sólo debo agregar los bits que se necesitan para cierta cantidad de subredes, por ejemplo, para 5 subredes necesito 3 bits, ya que con tres bits puedo numerar hasta 8 subredes (2^3). Por otro lado, si me piden una cantidad de hosts no es posible determinar directamente la longitud de la máscara, debo determinar la cantidad de bits de hosts necesaria y luego restarla a los bits de hosts que tengo en la red base y esa diferencia es el aumento en la máscara de subred, por ejemplo, si la máscara base es de 24 bits y me piden redes de por lo menos 20 hosts, para éste número necesito 5 bits (2^5=32-2=30) y estos 5 bits se los quito a los 8 de host que tenía para hosts en la máscara inicial, es decir 3 bits para subredes, por lo tanto la máscara que debería usar para redes de por lo menos 20 hosts sería 24+3=27 bits.

Esquemas de máscara variable


Con la máscara variable se resuelven los problemas mencionados, tanto la falta de flexibilidad como del despercicio de direcciones. Básicamente lo que se hace en VLSM es permitir que la información de direccionamiento se use sólo cuando es efectiva, es decir, cuando se asigna un rango de direcciones, a tal rango se le asigna una máscara de subred dependiente de la capacidad de hosts que debe numerar y el resto se deja en reserva para otras subredes o para uso futuro, con la posibilidad de que el tamaño de las subredes futuras puede ser diferente al de las ya asignadas.

Para ilustrar vamos a usar el mismo ejemplo anterior: la dirección base es 192.168.11.0/24, tenemos el último octeto para asignar subredes y hosts y vamos a usar VLSM para hacerlo.

La primera diferencia grande es que en el anterior esquema si, por ejemplo, nos decían que necesitaban redes de 5, 10 y 30 hosts, la única posibilidad era hacer redes de a 30 hosts y esperar que el esquema soportara eso, en otras palabras, las redes de 5 hosts tenían una capacidad ociosa de 25 hosts y las de 10 tenían 20 hosts que probablemente no se usarían nunca.
En VLSM, podemos elegir máscaras según las necesidades individuales de cada subred, es decir para 5 hosts necesito 3 bits, por lo tanto sólo dejo tres bits para hosts y el resto para numerar la subred (24 de la máscara original más 5 de la subred = 29), para la red de 10 hosts necesito 4 bits, osea que puedo usar para la subred una máscara de 28 bits y para la de 30 hosts necesito 5 bits (2^5=32, puedo usar el resto para la subred) uso una máscara de 27 bits. Ya establecidas las máscaras según la capacidad, puedo asignar las direcciones concretas, preferiblemente tomando las subredes más grandes de los números más bajos.

En nuestro caso empezaré con la red más grande que es de 30 hosts y por lo tanto necesita una máscara de 27 bits. Si no tengo direcciones asignadas todavía, asumo un esquema de dirección fijo y numero ésta primera red como si fuera la número uno (sin usar la cero). Esto es una preferencia personal, lo verdaderamente importante es que ninguna dirección de host/subred combinada con su máscara esté dentro del rango de numeración de otra subred. Los enrutadores Cisco detectan este tipo de conflicto y no dejan asignar direcciones de ésta manera. Otra forma menos compleja de comenzar sería empezar con la subred cero y eso es perfectamente válido si se usa VLSM, en éste caso la dirección de la primera subred sería 192.168.11.0/27 (la única diferencia con la red base es la máscara más larga) y ocuparía el rango de .1 hasta .30 en hosts válidos y .31 sería la dir. de broadcast.

En mi estilo (dejando una red del tamaño de la más grande sin asignar al principio del rango), la dirección específica de la primera subred sería 192.168.11.32/27, igual que el ejercicio con máscara fija, pero en éste caso, el resto de la capacidad de la red original sigue disponible con máscaras de otros tamaños como veremos. Con ésta subred asignada, quedan en uso los números de .33 hasta .63 (dir. de broadcast) y por lo tanto la siguiente dirección de subred debe estar justo después de ese rango (o antes ya que no usamos la cero).

Las siguientes direcciones a asignar serían las de la subred de 10 hosts. Recordando lo ya dicho sobre esta red, para numerar hasta 10 necesito por lo menos 4 bits, ya que 2^4=16, restando las direcciones de red y de broadcast tengo 14 direcciones válidas de host. Si voy a usar 4 bits para la parte de host me quedan 28 para la parte de subred (32-4=28), esta subred usaría una máscara /28 por su capacidad. Entonces la numeraríamos después de la ya asignada, .32. La siguiente dirección usable sería .64, dado que la primera subred asignada ocupa hasta la dirección .63, por lo tanto la siguiente subred sería 192.168.11.64/28, con esa máscara, sabemos que las direcciones asignables van desde la .65 hasta la .79, como vemos, en éste caso la máscara nos obliga a sumar sólo 15 direcciones más, si nos pasaramos de eso, la máscara haría que la red fuera diferente, ya que la dirección .80 con máscara /28 tiene sus últimos 5 bits en cero, que son los bits que quedan para hosts, por lo tanto es una dirección de red y es diferente a la dirección de red de cualquier host entre .65 hasta .79. Como vemos, seguimos con el resto del rango libre para asignar como queramos, y como hemos numerado las redes con números consecutivos, sabemos perfectamente qué rangos no se pueden usar para otras subredes.

Nos queda la última subred de 5 hosts. Para numerar 5 hosts elegimos una máscara de 29 bits, dado que sólo tenemos que dejar 3 bits para hosts y podemos usar los primeros cinco para subred (24+5=29). Sabemos que la siguiente subred debería estar fuera de los números ya asignados y la última subred terminaba en .79, por lo tanto la siguiente sería .80. La máscara nos dice qué direcciones quedan reservadas, 2^3 hosts potenciales, por lo tanto las direcciones asignables son .81 hasta .86 con dirección de broadcast .87, todas las con máscara /29 y aún nos quedan direcciones para asignar (un rango escondido al principio desde .0 hasta .31 y desde la .88 que sería la siguiente subred hasta el máximo del rango .255).

Analicemos en binario lo que acabamos de hacer. Tenemos tres subredes, la subred 192.168.11.32/27, la 192.168.11.64/28 y la 192.168.11.80/29. Los últimos octetos serían de la siguiente manera en binario:

Último octeto:    00100000 (.32/27)
Máscara              11100000

Último octeto:    01000000 (.64/28)
Máscara              11110000

Último octeto:    01010000 (.80/29)
Máscara:             11111000


Como se observa, las combinaciones de direcciones de red y máscaras elegidas nunca son iguales, es decir, aunque las últimas dos direcciones de subred coinciden en sus primeros dos bits, la máscara las distingue unívocamente. Otra cosa notable, es que las direcciones de red siguen teniendo, en sus bits de hosts, sólo ceros. Ésto último es muy importante, dado que si se asigna una red grande después de una pequeña, puede ser necesario dejar un espacio sin asignar para cumplir el requisito de tener los bits de host en cero. Por ejemplo, si se deseara asignar una subred de 25 hosts después de la última, necesitaríamos una máscara de /27 (2^5-2=30 hosts) y la siguiente dirección de red después de la .88/29 con ésta máscara (/27) sería .96/27 que tiene sus últimos 5 bits en cero. Notese que entre .88 y 96 queda un espacio disponible, pero que sólo se puede usar para redes de tamaño pequeño, por ejemplo una red de 6 hosts (2^3-2) o dos redes de 2 hosts (2^2-2).

En el esquema de ejemplo, si quisieramos asignar una nueva subred, primero estableceríamos cuántos hosts debe numerar, seleccionamos la máscara adecuada para la cantidad de hosts y buscamos un rango de direcciones que no esté asignado, bien sea antes de la primera gran subred (192.168.11.32/27) o después de la última pequeña subred (192.168.11.80/29).


Finalmente, comparando las direcciones de las dos subredes asignadas 192.168.11.64/28 y 192.168.11.80/29 en binario, observamos que coinciden en sus dos primeros bits. Si éstas dos direcciones estuvieran asignadas a diferentes interfaces de un mismo enrutador, el enrutador podría enviar la dirección y máscara común a éstas dos subredes, llamada ruta agregada o summary route, caso en el cual en vez de enviar información sobre dos subredes en la actualización de enrutamiento, enviaría sólo una. A ésto se le conoce como sumarización o CIDR por sus siglas en inglés Classless Inter-Domain Routing.

Este tema no es fácil y lo único que ayuda es practicarlo. Mi recomendación es que usen el siguiente método o algoritmo:

  • Hagan los cálculos siempre en binario.
  • Asignen las subredes más grandes al principio del rango disponible y las subredes más pequeñas el final.
  • Asignen las subredes consecutivamente tanto como sea posible.
  • Si es posible, usen las redes consecutivas en un mismo enrutador -este es un tema delicado que tiene que ver con sumarización.
  • Siempre asegúrense que la combinación dirección de subred asignada/máscara dé como resultado rangos separados de direcciones asignables.