VLANs 802.1Q en Linux: bridges en el anfitrión

Avatar de Apuntes Hacking

SE RECOMIENDA LEER ANTES EL POST: VLANs sin VLANs: cómo aislar clientes con redes internas

⚠️
NOTA
Algunos datos, como las direcciones MAC, han sido anonimizados automáticamente, por lo que pueden diferir entre los distintos ejemplos mostrados. En caso de que alguno de estos datos sea relevante para la explicación, se mantendrá sin modificaciones.

Introducción

En el post anterior aprendiste a aislar clientes usando «Redes Internas» de VirtualBox. Funciona perfectamente para separar VMs entre sí, pero había una limitación importante:

Tu ordenador (el anfitrión) no podía hablar directamente con las VMs.

No podías hacer SSH desde tu PC a la VM, ni acceder a un servidor web que estuviera corriendo dentro de la VM.

¿Por qué pasa eso? Porque la Red Interna de VirtualBox es como una habitación cerrada donde solo entran las VMs. Tu ordenador se queda fuera.

¿Cómo lo solucionamos? Usando VLANs de verdad (el estándar 802.1Q) combinado con bridges de Linux en tu ordenador anfitrión.

En este post te voy a enseñar a hacerlo paso a paso, asumiendo que:

  • Tienes Linux en tu ordenador (Ubuntu, Debian, Fedora, etc. – yo usaré Ubuntu para los ejemplos)
  • Ya sabes crear VMs en VirtualBox (lo vimos en el post 1)
  • Quieres que tu ordenador pueda hablar con las VMs sin perder el aislamiento entre clientes

Si usas Windows o macOS como anfitrión: Este método no funciona directamente porque necesitas las herramientas de red de Linux. Puedes usar una VM con Linux como «switch virtual» (lo veremos en el siguiente post) o cambiarte a Linux. Pásate a la resistencia 🐧


¿Qué vamos a construir?

Vamos a crear tres VLANs (Virtual LANs) en tu ordenador Linux:

VLAN IDNombrePara qué clienteRango de IPs
10RojoCliente Rojo10.0.10.0/24
20VerdeCliente Verde10.0.20.0/24
30AzulCliente Azul10.0.30.0/24

La gran diferencia con el post anterior: Tu ordenador (anfitrión) tendrá una IP dentro de cada VLAN. Eso significa que podrás:

  • Hacer SSH desde tu ordenador a cualquier VM (de la misma VLAN)
  • Acceder a servidores web que corran en las VMs desde tu navegador
  • Compartir archivos con las VMs fácilmente

Pero el aislamiento entre clientes se mantiene: las VMs rojas no ven a las verdes, y viceversa.

Conceptos nuevos que necesitas entender

Antes de empezar con los comandos, vamos a entender tres conceptos que son la clave de todo.

Concepto 1: ¿Qué es un bridge (puente) en Linux?

Un bridge es como un switch virtual dentro de tu ordenador. Conecta varias interfaces de red entre sí, como si estuvieran enchufadas al mismo switch físico.

Imagina un pequeño aparato con 4 puertos. Todo lo que entra por un puerto, sale por los demás. Eso es un bridge.

En Linux, creamos bridges con el comando brctl o ip link add type bridge.

Concepto 2: ¿Qué es una VLAN tag (etiqueta)?

Cuando tienes varias VLANs compartiendo el mismo cable físico (o la misma interfaz de red), necesitas una forma de saber «a qué VLAN pertenece este paquete».

Para eso se usan las etiquetas VLAN (VLAN tags). Es un número (del 1 al 4094) que se añade a cada paquete.

En Linux, creamos interfaces VLAN con el comando ip link add link ... type vlan id ...

Concepto 3: ¿Qué es un trunk?

Un trunk es un cable (o interfaz) por el que pasan múltiples VLANs con etiquetas. Al otro lado del trunk, necesitas algo que entienda esas etiquetas (como un bridge en Linux o un switch físico).

En nuestra configuración, el «trunk» será la interfaz de red virtual que VirtualBox usa para comunicarse con tu ordenador.

La arquitectura que vamos a montar

  • Cada bridge (br10, br20, br30) es un switch virtual independiente
  • Cada bridge solo maneja una VLAN (la 10, la 20 o la 30)
  • Las VMs se conectan directamente al bridge de su VLAN (sin tag, porque el bridge ya sabe a qué VLAN pertenecen)
  • Tu ordenador puede tener una IP en cada bridge (para comunicarse con esa VLAN)

Paso 0: Requisitos previos

Antes de empezar, asegúrate de tener:

0.1 Linux instalado en tu ordenador

Abre una terminal y ejecuta:

uname -a
Bash

Deberías ver algo como esto:

Linux matrix 6.14.0-37-generic #37~24.04.1-Ubuntu...
Bash

0.2 VirtualBox instalado

VBoxManage --version
Bash

Debe devolver un número de versión:

7.0.16_Ubuntur162802
Bash

0.3 Las VMs creadas (al menos 3, una por cliente)

Del post anterior, ya deberías tener:

  • Rojo_Servidor (o el nombre que le hayas puesto)
  • Verde_Servidor
  • Azul_Servidor

Si no las tienes, créalas rápidamente con cualquier ISO liviana. (Yo suelo usar Alpine para estas pruebas)

0.4 Los paquetes necesarios para bridges VLAN

En Ubuntu/Debian:

sudo apt update
sudo apt install -y bridge-utils vlan
Bash

En Fedora/RHEL:

sudo dnf install -y bridge-utils vconfig
Bash

Carga el módulo 8021q (necesario para VLANs):

sudo modprobe 8021q
echo "8021q" | sudo tee -a /etc/modules
Bash

Estamos listos para empezar…

Paso 1: Crear los bridges (los switches virtuales)

Vamos a crear tres bridges: uno para cada VLAN.

Abre una terminal en tu ordenador (el anfitrión Linux), no dentro de ninguna VM.

# Crear bridge para VLAN 10 (Cliente Rojo)
sudo ip link add name br10 type bridge

# Crear bridge para VLAN 20 (Cliente Verde)
sudo ip link add name br20 type bridge

# Crear bridge para VLAN 30 (Cliente Azul)
sudo ip link add name br30 type bridge
Bash

¿Qué hizo cada comando?

Creó un «switch virtual» llamado br10, br20 y br30. Por ahora están apagados.

Ahora activa los bridges:

# Activar los tres bridges
sudo ip link set br10 up
sudo ip link set br20 up
sudo ip link set br30 up
Bash

Comprueba que se crearon correctamente:

ip link show | grep br
Bash

Deberías ver algo como:

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    link/ether 3c:52:82:11:9a:4f brd ff:ff:ff:ff:ff:ff
    link/ether 08:00:27:3b:5c:91 brd ff:ff:ff:ff:ff:ff
4: br10: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether a2:4f:19:7c:3d:88 brd ff:ff:ff:ff:ff:ff
5: br20: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether b6:71:2a:9e:44:c3 brd ff:ff:ff:ff:ff:ff
6: br30: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether da:3e:65:0b:92:f1 brd ff:ff:ff:ff:ff:ff
Bash

Aqui nos interesa el 4:, 5: y 6: y que ponga <NO-CARRIER,BROADCAST,MULTICAST,UP>

Paso 2: Darle una IP a tu ordenador dentro de cada VLAN

Si quieres que tu ordenador pueda hablar con las VMs de una VLAN, tienes que darle una IP en esa VLAN.

Esto se hace asignando una IP al bridge (no a la interfaz física).

# Asignar IP al bridge de la VLAN 10 (red 10.0.10.0/24)
sudo ip addr add 10.0.10.1/24 dev br10

# Asignar IP al bridge de la VLAN 20
sudo ip addr add 10.0.20.1/24 dev br20

# Asignar IP al bridge de la VLAN 30
sudo ip addr add 10.0.30.1/24 dev br30
Bash

¿Qué significa esto?

Tu ordenador ahora tiene tres «tarjetas de red virtuales», puedes comprobarlo con el comando ifconfig:

apuntes@hacking:~$ ifconfig
br10: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.0.10.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether a2:4f:19:7c:3d:88  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 17 overruns 0  carrier 0  collisions 0

br20: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.0.20.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether b6:71:2a:9e:44:c3  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 16 overruns 0  carrier 0  collisions 0

br30: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.0.30.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether da:3e:65:0b:92:f1  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 16 overruns 0  carrier 0  collisions 0
Bash

Paso 3: Crear el trunk y las interfaces VLAN

Primero vamos a crear un trunk (un cable virtual por el que pasan todas las VLANs con etiquetas) y luego las interfaces VLAN con tag.

3.1 Identificar o crear una interfaz que hará de trunk

Necesitamos una interfaz que actúe como «cable trunk». Puede ser:

  • Opción A (recomendada): Una interfaz dummy (virtual, dentro de Linux)
  • Opción B: Una interfaz física que no estés usando (como eth0 si no la usas para internet)
  • Opción C: La interfaz que VirtualBox crea automáticamente (como vboxnet0)

Para no depender de hardware físico, usaremos una interfaz dummy:

# Cargar el módulo dummy si no está
sudo modprobe dummy

# Crear una interfaz dummy llamada trunk0
sudo ip link add trunk0 type dummy

# Activarla
sudo ip link set trunk0 up
Bash

Esta interfaz trunk0 será nuestro «cable virtual» por el que pasarán todas las VLANs con etiquetas.

Si usas el comando ifconfig puedes ver la interfaz creada:

apuntes@hacking:~$ ifconfig
trunk0: flags=195<UP,BROADCAST,RUNNING,NOARP>  mtu 1500
        inet6 fe80::a00:27ff:feab:4cde  prefixlen 64  scopeid 0x20<link>
        ether 0a:00:27:ab:4c:de  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3  bytes 210 (210.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Bash

3.2 Crear las interfaces VLAN (con tag 802.1Q)

Ahora creamos una interfaz VLAN por cada VLAN, asociada al trunk:

# VLAN 10 (Cliente Rojo) - tag 10
sudo ip link add link trunk0 name vlan10 type vlan id 10

# VLAN 20 (Cliente Verde) - tag 20
sudo ip link add link trunk0 name vlan20 type vlan id 20

# VLAN 30 (Cliente Azul) - tag 30
sudo ip link add link trunk0 name vlan30 type vlan id 30
Bash

¿Qué hizo esto?

Creamos tres interfaces virtuales (vlan10, vlan20, vlan30) que «viajan» por el mismo cable (trunk0), pero cada una lleva una etiqueta (tag) diferente: 10, 20 y 30.

3.3 Activar las interfaces VLAN

sudo ip link set vlan10 up
sudo ip link set vlan20 up
sudo ip link set vlan30 up
Bash

3.4 Conectar las interfaces VLAN a los bridges

Ahora conectamos cada interfaz VLAN a su bridge correspondiente:

# vlan10 (tag 10) al bridge br10
sudo ip link set vlan10 master br10

# vlan20 (tag 20) al bridge br20
sudo ip link set vlan20 master br20

# vlan30 (tag 30) al bridge br30
sudo ip link set vlan30 master br30
Bash

Esquema final de lo que has construido:

Paso 4: Conectar las VMs a los bridges

# Cliente Rojo
VBoxManage modifyvm "Rojo_Servidor" --nic1 bridged --bridgeadapter1 br10

# Cliente Verde
VBoxManage modifyvm "Verde_Servidor" --nic1 bridged --bridgeadapter1 br20

# Cliente Azul
VBoxManage modifyvm "Azul_Servidor" --nic1 bridged --bridgeadapter1 br30
Bash

Explicación de este comando:

  • modifyvm "NombreVM" → modifica la VM
  • --nic1 → configura el primer adaptador de red
  • bridged → modo puente (la VM se conecta directamente a la red)
  • --bridgeadapter1 br10 → puentea con el bridge llamado br10

Paso 5: Verificar que las VLAN tags existen

Para comprobar que las interfaces VLAN están correctamente configuradas con su tag 802.1Q, ejecuta:

ip -d link show vlan10
Bash

Deberías ver algo como:

apuntes@hacking:~$ ip -d link show vlan10
8: vlan10@trunk0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue master br10 state UP mode DEFAULT group default qlen 1000
    link/ether da:7c:91:2f:4b:68 brd ff:ff:ff:ff:ff:ff promiscuity 1  allmulti 1 minmtu 0 maxmtu 65535 
    vlan protocol 802.1Q id 10 <REORDER_HDR> 
    bridge_slave state forwarding priority 32 cost 100 hairpin off guard off root_block off fastleave off learning on flood on port_id 0x
Bash

Ese vlan protocol 802.1Q id 10 es la prueba de que la interfaz VLAN tiene la etiqueta 802.1Q con ID 10. Repite para vlan20 y vlan30.

Paso 6: Encender las VMs y asignar IPs

Este paso ya se explicó en el anterior post y puede que ya lo tengas hecho, dejo los comandos a modo de resumen:

6.1 Dentro de cada VM, asignar IP manual

Dentro de la VM Rojo_Servidor:

sudo ip addr add 10.0.10.10/24 dev eth0
sudo ip link set eth0 up
Bash

Dentro de Verde_Servidor:

sudo ip addr add 10.0.20.10/24 dev eth0
sudo ip link set eth0 up
Bash

Dentro de Azul_Servidor:

sudo ip addr add 10.0.30.10/24 dev eth0
sudo ip link set eth0 up
Bash

6.2 Probar que la VM ve a su bridge (el anfitrión)

Desde Rojo_Servidor, haz ping a la IP del bridge br10 (que es tu ordenador en esa VLAN):

ping 10.0.10.1
Bash

✅ Debe funcionar. Eso significa que tu ordenador y la VM roja pueden hablar.

Paso 7: Probar el aislamiento entre VLANs

Prueba 1: Desde VM roja a VM verde (DEBE fallar)

Desde Rojo_Servidor (10.0.10.10):

ping 10.0.20.10
Bash

❌ Sin respuesta. El aislamiento funciona.

Prueba 2: Desde tu ordenador (anfitrión) a VM roja (DEBE funcionar)

En tu terminal de Linux (no dentro de la VM):

ping 10.0.10.10
Bash

✅ Debe funcionar.

Te animo a que tu mismo pruebes a hacerlo desde el resto de las máqinas.

Paso 8: Hacer la configuración permanente (para que no desaparezca al reiniciar)

Todos los comandos que hemos ejecutado (ip link add, ip addr add, etc.) desaparecen cuando reinicias tu ordenador.

Para hacerlos permanentes, vamos a usar netplan (en Ubuntu 18.04+).

8.1 Crear un archivo de configuración netplan

sudo nano /etc/netplan/02-vlans.yaml
Bash

Pega este contenido:

network:
  version: 2
  renderer: networkd
  bridges:
    br10:
      interfaces: [vlan10]
      addresses: ["10.0.10.1/24"]
    br20:
      interfaces: [vlan20]
      addresses: ["10.0.20.1/24"]
    br30:
      interfaces: [vlan30]
      addresses: ["10.0.30.1/24"]
  vlans:
    vlan10:
      id: 10
      link: trunk0
    vlan20:
      id: 20
      link: trunk0
    vlan30:
      id: 30
      link: trunk0
  dummies:
    trunk0:
      addresses: []
Bash

8.2 Aplicar la configuración

sudo netplan apply
Bash

8.3 Para las VMs, los comandos VBoxManage sí son permanentes

Los cambios con VBoxManage modifyvm se guardan en la configuración de la VM. No se pierden al reiniciar


Etiquetas:

Avatar de Apuntes Hacking

Deja una respuesta

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