Una VLAN (Virtual LAN) divide una red física en varios dominios de broadcast aislados. El estándar 802.1Q añade a cada trama Ethernet una etiqueta de 4 bytes con el identificador de VLAN (1 a 4094), de modo que un único cable o puerto de switch puede transportar varias redes separadas. Linux gestiona estas etiquetas con el módulo del kernel 8021q y crea una interfaz virtual por VLAN.
En este tutorial configurarás dos VLAN sobre una interfaz física en Ubuntu 24.04: primero de forma temporal con ip link para entender el mecanismo, después de forma persistente con Netplan. Por último, convertirás el servidor en router entre ambos segmentos y usarás UFW para permitir solo el tráfico que necesitas entre ellos.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS y acceso
sudodesde un usuario no root. - Una interfaz física conectada a un puerto de switch configurado como troncal (trunk) 802.1Q con las VLAN que vayas a usar, o un hipervisor con un bridge que deje pasar tramas etiquetadas. Si el puerto es de acceso (sin etiquetas), las tramas etiquetadas se descartarán.
- Acceso por consola (KVM, IPMI o consola del proveedor) por si un error de red te deja sin SSH.
Importanteen la mayoría de VPS la interfaz virtual no transporta VLAN arbitrarias, porque el hipervisor filtra las tramas etiquetadas. Esta configuración está pensada para servidores dedicados, laboratorios o hipervisores propios. Para aislar tráfico entre VPS usa las redes privadas que ofrezca tu proveedor.
En los ejemplos se usan estos valores. Sustitúyelos por los tuyos:
| Elemento | Valor de ejemplo |
|---|---|
| Interfaz física | eno1 |
| VLAN 100 (gestión) | 10.0.100.1/24 |
| VLAN 200 (aplicaciones) | 10.0.200.1/24 |
Paso 1: Identificar la interfaz y cargar el módulo 8021q
Lista las interfaces para localizar la física que va al puerto troncal:
ip -br link show
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eno1 UP 3c:ec:ef:12:34:56 <BROADCAST,MULTICAST,UP,LOWER_UP>
Ubuntu carga el módulo 8021q automáticamente al crear la primera interfaz VLAN, pero puedes cargarlo ahora y comprobarlo:
sudo modprobe 8021q
lsmod | grep 8021q
8021q 45056 0
garp 20480 1 8021q
mrp 20480 1 8021q
Paso 2: Crear una VLAN temporal con ip link
Antes de tocar la configuración persistente, crea la VLAN 100 a mano. Estos cambios desaparecen al reiniciar, así que son una forma segura de comprobar que el switch entrega el tráfico etiquetado:
sudo ip link add link eno1 name vlan100 type vlan id 100
sudo ip addr add 10.0.100.1/24 dev vlan100
sudo ip link set vlan100 up
Verifica que la interfaz existe y lleva la etiqueta correcta. El parámetro -d muestra los detalles del tipo de enlace:
ip -d link show vlan100
5: vlan100@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 3c:ec:ef:12:34:56 brd ff:ff:ff:ff:ff:ff promiscuity 0 allmulti 0 minmtu 0 maxmtu 65535
vlan protocol 802.1Q id 100 <REORDER_HDR> addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
Si hay otro equipo en la VLAN 100 (por ejemplo 10.0.100.10), haz ping para confirmar que el troncal funciona:
ping -c 3 10.0.100.10
Para ver las etiquetas en el cable, captura en la interfaz física mientras haces ping. La opción -e muestra la cabecera Ethernet, incluida la VLAN:
sudo tcpdump -e -n -i eno1 vlan 100 -c 4
10:15:02.114233 3c:ec:ef:12:34:56 > 52:54:00:aa:bb:cc, ethertype 802.1Q (0x8100), length 102: vlan 100, p 0, ethertype IPv4 (0x0800), 10.0.100.1 > 10.0.100.10: ICMP echo request, id 3, seq 1, length 64
Cuando hayas comprobado que funciona, borra la interfaz temporal para que no choque con la configuración de Netplan:
sudo ip link delete vlan100
Paso 3: Hacer las VLAN persistentes con Netplan
Ubuntu 24.04 gestiona la red con Netplan, que lee los ficheros YAML de /etc/netplan/ en orden alfabético y los combina. Mira primero qué fichero define ya tu interfaz física y con qué identificador:
ls /etc/netplan/
sudo cat /etc/netplan/50-cloud-init.yaml
El nombre que aparece bajo ethernets: (por ejemplo eno1, o eth0 si cloud-init usa match con la MAC) es el que debes usar en link:. No hace falta modificar ese fichero: añade las VLAN en uno nuevo que se cargue después:
sudo nano /etc/netplan/60-vlans.yaml
network:
version: 2
vlans:
vlan100:
id: 100
link: eno1
addresses:
- 10.0.100.1/24
vlan200:
id: 200
link: eno1
addresses:
- 10.0.200.1/24
No se define puerta de enlace en las VLAN: la ruta por defecto sigue en la interfaz principal. Si alguna VLAN necesitara su propia salida a Internet, harían falta tablas de rutas separadas, algo que queda fuera de esta guía.
Netplan exige que sus ficheros no sean legibles por otros usuarios:
sudo chmod 600 /etc/netplan/60-vlans.yaml
Aplica la configuración con netplan try. Si pierdes la conexión y no confirmas con Enter en 120 segundos, Netplan revierte los cambios:
sudo netplan try
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 119 seconds
Configuration accepted.
Verifica las direcciones y el fichero de estado del kernel:
ip -br addr show
cat /proc/net/vlan/config
lo UNKNOWN 127.0.0.1/8 ::1/128
eno1 UP 203.0.113.10/24 ...
vlan100@eno1 UP 10.0.100.1/24 ...
vlan200@eno1 UP 10.0.200.1/24 ...
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
vlan100 | 100 | eno1
vlan200 | 200 | eno1
Reinicia el servidor en algún momento para confirmar que las VLAN se levantan solas en el arranque.
Paso 4: Enrutar entre VLAN
Por defecto Linux no reenvía paquetes entre interfaces, así que los equipos de la VLAN 100 y la VLAN 200 no pueden hablar entre sí aunque el servidor esté en ambas. Para que el servidor actúe como router, activa el reenvío IPv4 de forma persistente:
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-vlan-routing.conf
sudo sysctl --system
Comprueba el valor:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Los equipos de cada VLAN deben usar la IP del servidor en su segmento como puerta de enlace (o al menos tener una ruta hacia la otra red por ella). Por ejemplo, en un equipo Linux de la VLAN 100:
sudo ip route add 10.0.200.0/24 via 10.0.100.1
En ese momento todo el tráfico entre VLAN está permitido. El siguiente paso lo restringe.
Paso 5: Filtrar el tráfico entre VLAN con UFW
Segmentar la red solo sirve si controlas qué cruza de un segmento a otro. UFW filtra el tráfico reenviado con reglas route. La política será: nada pasa entre VLAN salvo lo que permitas explícitamente.
Si UFW aún no está activo, permite SSH antes de activarlo para no perder el acceso:
sudo ufw allow OpenSSH
Establece la política por defecto del tráfico reenviado en denegar:
sudo ufw default deny routed
Permite solo lo necesario. En este ejemplo, la red de gestión (VLAN 100) puede entrar por SSH a los servidores de aplicaciones (VLAN 200), y los servidores de aplicaciones pueden consultar un MySQL que vive en la VLAN 100:
sudo ufw route allow in on vlan100 out on vlan200 from 10.0.100.0/24 to 10.0.200.0/24 port 22 proto tcp
sudo ufw route allow in on vlan200 out on vlan100 from 10.0.200.0/24 to 10.0.100.20 port 3306 proto tcp
Las reglas de UFW tienen estado: las respuestas de una conexión permitida vuelven sin necesidad de una regla en sentido contrario.
Activa UFW (o recarga si ya estaba activo) y revisa las reglas:
sudo ufw enable
sudo ufw status verbose
La salida debe mostrar deny (routed) en la línea Default: y las dos reglas con ALLOW FWD.
Verifica el filtrado desde los propios equipos. Desde un equipo de la VLAN 100, SSH a la VLAN 200 debe funcionar, y cualquier otro puerto debe agotar el tiempo de espera:
nc -zv -w 3 10.0.200.10 22
nc -zv -w 3 10.0.200.10 80
Connection to 10.0.200.10 22 port [tcp/ssh] succeeded!
nc: connect to 10.0.200.10 port 80 (tcp) timed out: Operation now in progress
Si quieres ver qué se bloquea, activa el log de UFW con sudo ufw logging on y revisa las entradas [UFW BLOCK] con sudo journalctl -k | grep UFW.
Solución de problemas
La VLAN está UP pero no hay respuesta de ningún equipo: el puerto del switch no está en modo troncal o no tiene esa VLAN permitida. Captura con sudo tcpdump -e -n -i eno1 vlan y comprueba si llegan tramas etiquetadas desde fuera; si solo ves las que salen, el problema está en el switch.
netplan try muestra Permissions for /etc/netplan/60-vlans.yaml are too open: ejecuta sudo chmod 600 sobre el fichero.
Netplan indica que la interfaz de link: no está definida: el valor de link: no coincide con el identificador de la interfaz en el otro fichero de Netplan. Usa el nombre que aparece bajo ethernets:, que no siempre es el nombre del kernel.
El tráfico entre VLAN no pasa aunque haya regla: comprueba que net.ipv4.ip_forward vale 1, que los equipos tienen ruta de vuelta por el servidor y que la regla usa los nombres de interfaz correctos (vlan100, no eno1.100).
Problemas con paquetes grandes: la VLAN hereda el MTU de la interfaz física. Si el switch o el otro extremo usan un MTU distinto, ajusta mtu: en la definición de la VLAN en Netplan y comprueba que sea igual en ambos extremos.
Conclusión
Has creado VLAN 802.1Q en Ubuntu 24.04, primero de forma temporal con ip link y después persistente con Netplan, y has convertido el servidor en un router entre segmentos que solo deja pasar el tráfico que has autorizado con UFW. Como siguientes pasos puedes:
- Añadir más segmentos (base de datos, backups, DMZ) repitiendo el bloque de Netplan y una regla
ufw routepor flujo necesario. - Ofrecer DHCP en cada VLAN con
dnsmasqo Kea para no configurar los equipos a mano. - Enviar los logs de UFW a un sistema centralizado para auditar los intentos de cruzar entre segmentos.
