Configurar redes VLAN en Linux con iproute2 te permite dividir un único enlace físico en múltiples dominios de broadcast aislados sin hardware adicional. Esta guía cubre las interfaces etiquetadas 802.1Q, la configuración de puertos trunk y la segmentación de red usando únicamente el comando ip incluido en cualquier distribución Linux moderna. Al finalizar entenderás cómo crear y persistir sub-interfaces VLAN, conectar hosts Linux a través de un trunk y verificar el aislamiento entre segmentos.
Requisitos Previos
- Un host Linux con kernel 3.2 o posterior (cualquier distribución actual es válida)
- Acceso root o sudo
- El paquete
iproute2instalado (incluido por defecto en Debian, Ubuntu, RHEL, Fedora, Arch) - Una NIC física o virtual; para un trunk real necesitas un switch administrado compatible con 802.1Q configurado en modo trunk
- Familiaridad básica con direccionamiento IP y subnetting
Entendiendo las VLAN 802.1Q
Una VLAN (Red de Área Local Virtual) crea segmentos de red lógicos sobre un medio físico compartido. 802.1Q es el estándar IEEE que inserta una etiqueta de 4 bytes en las tramas Ethernet para transportar el ID de VLAN. Linux implementa esto en el módulo del kernel 8021q, que expone sub-interfaces VLAN (también llamadas interfaces virtuales) que aparecen ante la pila de red como dispositivos Ethernet ordinarios.
Terminología clave:
- ID de VLAN (VID): Un número de 12 bits (1–4094) que identifica una VLAN.
- Puerto etiquetado / puerto trunk: Un puerto de switch o NIC que transporta tramas con etiquetas 802.1Q para múltiples VLANs.
- Puerto no etiquetado / puerto access: Transporta tráfico para una VLAN; el switch elimina la etiqueta antes de reenviar al dispositivo final.
- Sub-interfaz: En Linux, una interfaz virtual como
eth0.10apilada sobre una interfaz padre (eth0) que filtra o inyecta tramas etiquetadas para la VLAN 10.
Cuando llega una trama en eth0 con la etiqueta VLAN 10, el kernel la enruta hacia eth0.10. El tráfico saliente enviado a través de eth0.10 se etiqueta con VLAN 10 antes de salir por el cable.
Cargando el Soporte 802.1Q
Antes de crear interfaces VLAN, asegúrate de que el módulo del kernel 8021q esté cargado:
# Cargar el módulo para la sesión actual
sudo modprobe 8021q
# Verificar que está cargado
lsmod | grep 8021q
Para cargarlo automáticamente en el arranque, agrégalo al archivo de módulos:
echo "8021q" | sudo tee /etc/modules-load.d/8021q.conf
La mayoría de las distribuciones lo cargan bajo demanda cuando creas la primera interfaz VLAN, pero ser explícito evita sorpresas.
Creando Sub-Interfaces VLAN con iproute2
El comando ip link add crea una sub-interfaz VLAN en un solo paso. La sintaxis es directa:
# Crear VLAN 10 sobre eth0
sudo ip link add link eth0 name eth0.10 type vlan id 10
# Activar la interfaz
sudo ip link set eth0.10 up
# Asignar una dirección IP
sudo ip addr add 192.168.10.1/24 dev eth0.10
Repite para VLANs adicionales. Aquí añadimos la VLAN 20 en la misma interfaz padre:
sudo ip link add link eth0 name eth0.20 type vlan id 20
sudo ip link set eth0.20 up
sudo ip addr add 192.168.20.1/24 dev eth0.20
Inspecciona el resultado con el flag -d (detalle) para confirmar el ID y protocolo VLAN:
ip -d link show eth0.10
# La salida incluye: vlan protocol 802.1Q id 10 <REORDER_HDR>
Puedes usar cualquier nombre de interfaz — eth0.10 es una convención común pero vlan10 o mgmt son igualmente válidos. Lo que importa es el ID de VLAN, no el nombre.
Configuración de Puerto Trunk
Un puerto trunk transporta tráfico etiquetado de múltiples VLANs entre dispositivos de red. Al conectar dos hosts Linux directamente o conectar un host Linux a un switch administrado, la interfaz física actúa como el trunk y cada sub-interfaz representa una VLAN.
Dos hosts Linux conectados directamente:
En el Host A:
sudo ip link add link eth1 name eth1.100 type vlan id 100
sudo ip link set eth1.100 up
sudo ip addr add 10.0.100.1/24 dev eth1.100
sudo ip link add link eth1 name eth1.200 type vlan id 200
sudo ip link set eth1.200 up
sudo ip addr add 10.0.200.1/24 dev eth1.200
En el Host B:
sudo ip link add link eth1 name eth1.100 type vlan id 100
sudo ip link set eth1.100 up
sudo ip addr add 10.0.100.2/24 dev eth1.100
sudo ip link add link eth1 name eth1.200 type vlan id 200
sudo ip link set eth1.200 up
sudo ip addr add 10.0.200.2/24 dev eth1.200
Desde el Host A, ping 10.0.100.2 alcanza el Host B en la VLAN 100. ping 10.0.200.2 lo alcanza en la VLAN 200 — mismo cable físico, dominios de broadcast aislados.
Conexión a un switch administrado:
En el switch, configura el puerto hacia el host Linux como trunk (o “tagged” en algunos fabricantes) y permite los IDs de VLAN 100 y 200. El lado Linux no requiere ningún cambio adicional — la interfaz padre ya pasa todas las tramas etiquetadas hacia la sub-interfaz correspondiente.
iproute2 vs. Otras Herramientas para la Gestión de VLAN
| Herramienta | Enfoque | Persistencia | Complejidad |
|---|---|---|---|
| iproute2 (ip) | Sub-interfaces del kernel | Manual o vía networkd/NM | Baja |
| NetworkManager (nmcli) | Perfiles de conexión VLAN | Integrada | Baja |
| systemd-networkd | Archivos .netdev + .network | Integrada | Baja–Media |
| Open vSwitch (OVS) | Switch virtual, soporte completo VLAN/tunnel | Base de datos OVS | Alta |
| bridge + vlan_filtering | 802.1Q en bridge Linux | Manual o networkd | Media |
Para un host único con pocas VLANs, iproute2 junto con systemd-networkd es la solución más simple y confiable. Para redes virtuales complejas (múltiples VMs, overlays VXLAN), Open vSwitch es la elección correcta.
Escenario Real: Aislar el Tráfico de Gestión y Producción
Administras un hipervisor con una única NIC de 10 GbE. La política de seguridad requiere que el tráfico de las VMs y el tráfico de gestión del host nunca compartan un dominio de broadcast. El puerto del switch upstream ya es un trunk con la VLAN 10 (gestión) y la VLAN 100 (VMs de producción).
# Red de gestión para el host
sudo ip link add link eno1 name eno1.10 type vlan id 10
sudo ip link set eno1.10 up
sudo ip addr add 192.168.10.5/24 dev eno1.10
sudo ip route add default via 192.168.10.1 dev eno1.10
# Bridge de producción para las VMs — adjunta la interfaz VLAN al bridge
sudo ip link add name br100 type bridge
sudo ip link set eno1.100 master br100
sudo ip link add link eno1 name eno1.100 type vlan id 100
sudo ip link set eno1.100 up
sudo ip link set br100 up
Las interfaces virtuales de las VMs (dispositivos tap) se añaden luego como puertos del bridge en br100. El tráfico de las VMs queda aislado dentro de la VLAN 100; el plano de gestión del host vive en la VLAN 10 y solo es accesible a través de su propia sub-interfaz.
Persistencia de la Configuración VLAN con systemd-networkd
Los comandos ip link anteriores son efímeros — desaparecen al reiniciar. Con systemd-networkd, la persistencia es declarativa y limpia.
Crea la definición del netdev VLAN en /etc/systemd/network/10-vlan10.netdev:
[NetDev]
Name=eth0.10
Kind=vlan
[VLAN]
Id=10
Crea el archivo de red en /etc/systemd/network/10-vlan10.network:
[Match]
Name=eth0.10
[Network]
Address=192.168.10.1/24
También asegúrate de que la interfaz padre se active y esté configurada para pasar tráfico VLAN en /etc/systemd/network/05-eth0.network:
[Match]
Name=eth0
[Network]
VLAN=eth0.10
VLAN=eth0.20
Aplica los cambios:
sudo systemctl enable --now systemd-networkd
sudo networkctl reload
Para usuarios de NetworkManager, el equivalente es:
sudo nmcli connection add type vlan con-name vlan10 dev eth0 id 10 ip4 192.168.10.1/24
sudo nmcli connection up vlan10
Errores Comunes y Casos Especiales
MTU y tramas jumbo: Añadir una etiqueta 802.1Q aumenta el tamaño de la trama en 4 bytes. Si la MTU de la interfaz padre es 1500 y un host remoto también usa 1500, podrías tener fragmentación en dispositivos intermedios que no permiten tramas de 1504 bytes. Reduce la MTU de la sub-interfaz a 1496 o activa tramas jumbo en la NIC y el switch.
sudo ip link set eth0.10 mtu 1496
El modo promiscuo no es necesario: La pila 802.1Q del kernel filtra por ID de VLAN a nivel de driver. No necesitas el modo promisc en la interfaz padre para la operación normal de VLANs.
La VLAN 1 es especial en muchos switches: Algunos switches administrados tratan la VLAN 1 como la VLAN nativa/no etiquetada y pueden eliminar o manejar incorrectamente su etiqueta. Prefiere VIDs del 2 al 4094 para VLANs explícitamente etiquetadas y evitar ambigüedades.
Doble etiquetado (QinQ): Linux admite etiquetas VLAN anidadas con type vlan protocol 802.1ad. Úsalo solo cuando tu red requiera explícitamente provider bridging (IEEE 802.1ad).
Máquinas virtuales y filtrado VLAN en bridge: Cuando las VMs comparten un bridge Linux, activa el filtrado VLAN en el propio bridge (bridge vlan filtering 1) en lugar de crear sub-interfaces por VM. Esto es más escalable y evita inundaciones de MAC entre puertos del bridge.
Interferencia de NetworkManager: En equipos de escritorio o servidores que ejecutan NetworkManager, este puede intentar gestionar tus interfaces VLAN creadas manualmente. Marca la interfaz padre como no administrada en /etc/NetworkManager/conf.d/ o usa nmcli para definir las VLANs correctamente, de modo que NM y networkd no entren en conflicto.
Solución de Problemas
Sin tráfico en la sub-interfaz VLAN:
- Confirma que la interfaz padre está activa:
ip link show eth0— el estado debe serUP. - Confirma que la sub-interfaz está activa:
ip link show eth0.10. - Verifica que el puerto del switch esté en modo trunk y que el ID de VLAN esté permitido.
- Captura con
tcpdump -i eth0 -e vlanpara ver si llegan tramas etiquetadas.
Filtrado incorrecto del ID de VLAN:
# Confirmar el ID de VLAN de una sub-interfaz
ip -d link show eth0.10 | grep "vlan id"
Una discrepancia entre el ID de VLAN en Linux y en el switch es el error más común.
Conflictos de rutas entre VLANs:
Si asignas subredes superpuestas entre VLANs, el kernel enrutará entre ellas a través de la tabla de enrutamiento del host, anulando el aislamiento. Usa subredes distintas y no superpuestas para cada VLAN.
La interfaz desaparece tras el reinicio:
Los comandos ip link en tiempo de ejecución no persisten. Usa systemd-networkd, NetworkManager o /etc/network/interfaces (legado Debian/Ubuntu) para definir interfaces VLAN persistentes.
Resumen
- La configuración de VLAN en Linux con 802.1Q utiliza el comando
ip link add ... type vlan idde iproute2 — no se requieren paquetes adicionales. - Las sub-interfaces como
eth0.10se apilan sobre una interfaz física padre y filtran o inyectan tramas etiquetadas para un ID de VLAN específico. - Un puerto trunk transporta múltiples VLANs sobre un único enlace físico; cada VLAN obtiene su propia sub-interfaz y dirección IP.
- Para configuración persistente usa archivos
.netdev/.networkdesystemd-networkdo perfiles de conexión denmcli. - Presta atención al overhead de MTU, las peculiaridades de la VLAN 1 en los switches y los conflictos con NetworkManager.
- Combina sub-interfaces VLAN con bridges Linux para conectar VMs a segmentos etiquetados sin un switch físico administrado.