VLAN en Linux

por | 21 octubre, 2008

A continuación se presenta cómo implementar VLANs basada en el Standard 802.1q en sistemas Linux. Con ello podremos hacer que un PC con Linux se conecte a un switch y reconozca las distintas VLANs permitiendo conectarlo a ellas de manera independiente y con cada uno de los direccionamientos IP presentes, hacer routing ente ellas, etc.

  1. ¿Qué es una VLAN y qué es un Trunk VLAN?

Una VLAN divide una red en zonas totalmente independientes. Decimos que divide la red en dominios de broascast inconexos, es decir, a todos los efectos es como si tuviéramos un switch distinto por cada VLAN creada. El concepto de VLAN se extiende a las distas capas del modelo OSI. Así el tipo de VLAN más habitual es el que opera a nivel 2, es decir, basado en puertos. En ese caso cada VLAN define un grupo de puertos los cuales operan como si fueran un switch independiente sin ninguna transmisión hacia los puertos de otras VLANs.

Pero tambien podemos crear VLANs basadas en direccionameinto IP e incluso en puertos TCP o UDP o en aplicaciones o protocolos de capas superiores, extendiendo el concepto de VLAN hacia niveles de abstracción y complejidad más elevados.

Cuando conectamos varios switches y en ellos se han definido VLANs, necesitaríamos un enlace por cada VLAN para extender o conectar dicha VLAN en cada switch. Para evitar esto existen protocolos que permiten extender las definiciones de VLAN sobre una sóla línea de conexión, esta línea se conexión que permite transportar VLANs se llama habitualmente línea trunk.

  1. Tipos de trunk

Actualmente existen dos protocolos principalmente usados para transportar tramas ethernet con identificadores de VLAN: ISL y 802.1q. ISL es un protocolo creado por Cisco y por tanto es propietario. Tiene cierta aceptación por ser impulsado por un creador de estándares de facto como es Cisco. Debido a ello ISL es soportado por algunos otros fabricantes por compatibilidada con Cisco.

802.1q es el estándar ampliamente usado por todos los fabricantes. 802.1q es un estándar definido para 100mbps y superior, no para 10mbps.

802.1q inserta un nuevo campo en la trama ethernet. Este campo tiene 4 bytes y contiene un identificador de VLAN. Este identificador (tag) indica a qué VLAN pertenece dicha trama. Cuando un switch recibe una trama “tagged”, sabe por que puerto o grupo de puertos difundirla.

  1. VLAN y Linux

Linux soporta 802.1q y puede a través de un interfaz ethernet conectarse a una un switch mediante una línea trunk y reconocer todas sus VLANs. En general en los kernels 2.4.x era necesario cargarle el parche pertinente a tal fin. A partir de la versión 2.4.14 está integrado en el núcleo. La opción CONFIG_VLAN_8021Q del kernel es la que indica la configuración. Tal parámetro puede ser consultado en el fichero .cofig situado normalmente bajo /usr/src/kernels/.

  1. Uso de vconfig

La utilidad vconfig es la que nos permite asociar cada VLAN dentro de nuestro interfaz. Esta sería lo primero para hacer al crear las VLANs:

# vconfig add eth1 2

Esta última instrucción nos asocia el interfaz eth1 a la VLAN con el identificador (tag) 2. Al ejecutar esta instrucción se habrá creado automáticamente el subinterfaz eth1.2:

 

# Ifconfig –a

eth0     Link encap:Ethernet HWaddr 00:15:17:58:78:1B
         inet addr:192.168.0.222 Bcast:192.168.0.255 Mask:255.255.255.0
         inet6 addr: fe80::215:17ff:fe58:781b/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
         RX packets:31107 errors:0 dropped:0 overruns:0 frame:0
         TX packets:22487 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:23244421 (22.1 MiB) TX bytes:4332185 (4.1 MiB)
         Base address:0x2000 Memory:88180000-881a0000

eth1     Link encap:Ethernet HWaddr 00:15:17:58:78:1C
         inet addr:192.168.220.123 Bcast:192.168.220.255 Mask:255.255.255.0
         inet6 addr: fe80::215:17ff:fe58:781c/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
         RX packets:1119 errors:0 dropped:0 overruns:0 frame:0
         TX packets:235 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:100072 (97.7 KiB) TX bytes:21281 (20.7 KiB)
         Base address:0x1100 Memory:88020000-88040000

eth1.2   Link encap:Ethernet HWaddr 00:15:17:58:78:1C
         BROADCAST MULTICAST MTU:1500 Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

[root@localhost /]#

 

El interfaz eth1 no se ve alterado por este comando, es decir, se seguirán aceptando tramas ethernet sin tag tal como hacía antes. Pero ahora el nuevo subinterfaz está conectado a la VLAN 2 y ya podemos configurarle una direccion IP como cualquier interfaz.

Para añadir VLAN con vconfig:

 

# vconfig add [interface-name] [vlan-id]

 

En general las opciones de vconfig son:

 

vconfig add             [interface-name] [vlan_id]
       rem              [vlan-name]
       set_flag         [interface-name] [flag-num]       [0 | 1]
       set_egress_map   [vlan-name]      [skb_priority]   [vlan_qos]
       set_ingress_map  [vlan-name]      [skb_priority]   [vlan_qos]
       set_name_type    [name-type]

 

* interface-name: nombre del interface ethernet.
* vlan_id: es el identificadodr de la VLAN (de 0 a4095).
* skb_priority: prioridad del socket buffer (sk_buff).
* vlan_qos: es la prioridad (3 bit priority) en la cabecera VLAN.
* name-type: VLAN_PLUS_VID (vlan0005), VLAN_PLUS_VID_NO_PAD (vlan5),
DEV_PLUS_VID (eth0.0005), DEV_PLUS_VID_NO_PAD (eth0.5)
* bind-type: PER_DEVICE # permite vlan 5 en eth0 y eth1 ser única.
PER_KERNEL # fuerza vlan 5 ser única para todos los interfaces.

* FLAGS: 1 REORDER_HDR Cuando se active esto el interface VLAN moverá la cabecera Ethernet alrededor para hacer que parezca exactamente como un dispositivo real de red. Esto puede ayudar a programas como DHCPd el cual lee el paquete de Ethernet “crudamente” y hace suposiciones acerca de la ubicación de bytes. Si no es necesario, no activar esta opción, porque habrá al menos una pequeña degradación del rendimiento. Por defecto está desactivado.

Asignaremos una IP como por ejemplo:

# ifconfig eth1.2 add 192.178.0.1

 

  1. Configuración en el arranque


En distribuciones basadas en Red Hat los cambios introducidos por vconfig no serán permanentes cuando se vuelva a arrancar el sistema (en Debian sí). Es necesario ejecutar un script en el arranque que ejecute vconfig y asigne IP a los subinterfaces creados.

Vconfig en realidad crea ficheros en /proc/net/vlan/ en tiempo de proceso.

Otra ubicación donde podemos crear manualmente los scripts en sistemas basadon en Red Hat es:

/etc/sysconfig/network-scripts

Allí podemos crear un archivo con el nombre ifcfg-eth1.2 cuyo contenido sea por ejemplo:

 

# Please read /usr/share/doc/initscripts-*/sysconfig.txt
# for the documentation of these parameters.
TYPE=Ethernet
DEVICE=eth1.2
HWADDR=00:15:17:58:78:1c
BOOTPROTO=none
NETMASK=255.255.224.0
IPADDR=192.168.107.123
ONBOOT=yes
USERCTL=no
IPV6INIT=no
PEERDNS=yes

(En ese mismo directorio podemos ver los archivos predefinidos para lo, eth0, eth1, etc. Y los scripts de inicialización. Como es de suponer el srippt de inicialización de la red situado en /etc/inet.d/network utiliza las configuraciones situadas en /etc/sysconfig/network-scripts)

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *