Configuración de Red Overlay con VxLAN en Linux

VxLAN (Virtual Extensible LAN) es el protocolo estándar para extender redes Layer 2 sobre infraestructura Layer 3, permitiendo la comunicación entre hosts en distintas subredes como si estuvieran en el mismo segmento de red local. Esta guía cubre la configuración de VTEPs, los modos multicast y unicast, la integración con bridges Linux y la resolución de problemas comunes.

Requisitos Previos

  • Ubuntu 20.04/22.04 o Debian 11/12 (kernel 3.7+ para VxLAN básico, 3.14+ para multicast)
  • Acceso root en todos los hosts
  • Mínimo 2 hosts con conectividad IP entre ellos (L3)
  • Puerto UDP 4789 libre (puerto estándar de VxLAN)
# Verificar soporte VxLAN en el kernel
modprobe vxlan
lsmod | grep vxlan

# Verificar la versión del kernel
uname -r

Conceptos de VxLAN

Términos clave:

  • VTEP (VXLAN Tunnel Endpoint): el punto que encapsula/desencapsula el tráfico VxLAN
  • VNI (VXLAN Network Identifier): ID de 24 bits que identifica la red virtual (hasta 16M VNIs)
  • FDB (Forwarding Database): tabla que mapea MACs a VTEPs remotos
  • Underlay: la red IP existente por la que viaja el tráfico VxLAN encapsulado
  • Overlay: la red L2 virtual que los hosts perciben
Host A                           Host B
[VM1] --- [VTEP A] === L3 underlay === [VTEP B] --- [VM2]
           encapsular VxLAN              desencapsular

Configuración de VTEP Básico

Escenario: dos hosts (192.168.1.10 y 192.168.1.20) conectan VMs en la red virtual VxLAN (VNI 100, red 10.0.100.0/24):

# En el Host A (IP underlay: 192.168.1.10)

# Crear la interfaz VxLAN con VNI 100
ip link add vxlan100 type vxlan \
  id 100 \                        # VNI - identificador de la red virtual
  dstport 4789 \                  # Puerto UDP estándar VxLAN
  dev eth0 \                      # Interfaz underlay
  local 192.168.1.10              # IP local del VTEP

# Activar la interfaz VxLAN
ip link set vxlan100 up

# Asignar la IP de overlay al VTEP
ip addr add 10.0.100.1/24 dev vxlan100

# Verificar la interfaz creada
ip link show vxlan100
ip addr show vxlan100
# En el Host B (IP underlay: 192.168.1.20)

# Crear la interfaz VxLAN con el mismo VNI
ip link add vxlan100 type vxlan \
  id 100 \
  dstport 4789 \
  dev eth0 \
  local 192.168.1.20

ip link set vxlan100 up
ip addr add 10.0.100.2/24 dev vxlan100

Modo Multicast

El modo multicast permite el descubrimiento automático de VTEPs:

# Host A - VxLAN con multicast
# Requiere soporte multicast en la red underlay
ip link add vxlan100 type vxlan \
  id 100 \
  dstport 4789 \
  dev eth0 \
  local 192.168.1.10 \
  group 239.1.1.1        # Dirección multicast del grupo VxLAN

ip link set vxlan100 up
ip addr add 10.0.100.1/24 dev vxlan100

# Host B - mismo grupo multicast
ip link add vxlan100 type vxlan \
  id 100 \
  dstport 4789 \
  dev eth0 \
  local 192.168.1.20 \
  group 239.1.1.1

ip link set vxlan100 up
ip addr add 10.0.100.2/24 dev vxlan100

# Con multicast, los hosts se descubren automáticamente
# Verificar la tabla FDB (se puebla automáticamente)
bridge fdb show dev vxlan100

Modo Unicast con FDB Manual

En entornos donde el multicast no está disponible (la mayoría de clouds):

# Host A (192.168.1.10)
ip link add vxlan100 type vxlan \
  id 100 \
  dstport 4789 \
  dev eth0 \
  local 192.168.1.10 \
  nolearning               # Sin aprendizaje automático (modo unicast manual)

ip link set vxlan100 up
ip addr add 10.0.100.1/24 dev vxlan100

# Añadir manualmente la entrada FDB para el Host B
# ff:ff:ff:ff:ff:ff = broadcast, se envía al VTEP remoto
bridge fdb append ff:ff:ff:ff:ff:ff \
  dev vxlan100 \
  dst 192.168.1.20         # IP underlay del VTEP remoto (Host B)

# Verificar la FDB
bridge fdb show dev vxlan100
# Host B (192.168.1.20)
ip link add vxlan100 type vxlan \
  id 100 \
  dstport 4789 \
  dev eth0 \
  local 192.168.1.20 \
  nolearning

ip link set vxlan100 up
ip addr add 10.0.100.2/24 dev vxlan100

# Apuntar al Host A como VTEP remoto
bridge fdb append ff:ff:ff:ff:ff:ff \
  dev vxlan100 \
  dst 192.168.1.10

# Probar la conectividad overlay
ping 10.0.100.1 -c 4

Integración con Linux Bridge

Para conectar múltiples VMs o contenedores a la misma red VxLAN:

# Host A - conectar VMs al VxLAN mediante un bridge

# 1. Crear el bridge Linux
ip link add br-vxlan100 type bridge
ip link set br-vxlan100 up

# 2. Crear la interfaz VxLAN sin IP (el bridge tendrá la IP)
ip link add vxlan100 type vxlan \
  id 100 \
  dstport 4789 \
  dev eth0 \
  local 192.168.1.10

ip link set vxlan100 up

# 3. Añadir la interfaz VxLAN al bridge
ip link set vxlan100 master br-vxlan100

# 4. Asignar la IP al bridge (no a la interfaz VxLAN)
ip addr add 10.0.100.1/24 dev br-vxlan100

# 5. Añadir las interfaces de las VMs al mismo bridge
# (por ejemplo, veth pairs o interfaces de KVM)
ip link set vnet0 master br-vxlan100  # VM 1
ip link set vnet1 master br-vxlan100  # VM 2

# 6. Configurar las entradas FDB del VxLAN
bridge fdb append ff:ff:ff:ff:ff:ff dev vxlan100 dst 192.168.1.20

# Verificar el bridge
bridge link show

VxLAN con Open vSwitch

OVS ofrece una gestión más avanzada de VxLAN, especialmente para SDN:

# Crear un bridge OVS para VxLAN
ovs-vsctl add-br br-overlay

# Añadir el túnel VxLAN al bridge OVS
ovs-vsctl add-port br-overlay vxlan0 \
  -- set interface vxlan0 type=vxlan \
  options:remote_ip=192.168.1.20 \
  options:key=100 \
  options:dst_port=4789

# Asignar IP al bridge
ip addr add 10.0.100.1/24 dev br-overlay
ip link set br-overlay up

# En el Host B
ovs-vsctl add-br br-overlay
ovs-vsctl add-port br-overlay vxlan0 \
  -- set interface vxlan0 type=vxlan \
  options:remote_ip=192.168.1.10 \
  options:key=100

ip addr add 10.0.100.2/24 dev br-overlay
ip link set br-overlay up

# Verificar los túneles OVS
ovs-vsctl show
ovs-ofctl show br-overlay

Persistencia de la Configuración

Para hacer la configuración persistente entre reinicios en Ubuntu/Debian:

# Crear un script de configuración VxLAN
cat << 'EOF' > /etc/network/if-up.d/vxlan-setup
#!/bin/bash
# Configurar VxLAN al levantar la red

# Solo ejecutar si eth0 está activo
if [ "$IFACE" != "eth0" ]; then
    exit 0
fi

# Variables de configuración
VNI=100
LOCAL_IP="192.168.1.10"
REMOTE_IP="192.168.1.20"
OVERLAY_IP="10.0.100.1/24"

# Crear y configurar la interfaz VxLAN
ip link add vxlan${VNI} type vxlan \
    id ${VNI} \
    dstport 4789 \
    dev eth0 \
    local ${LOCAL_IP} \
    nolearning

ip link set vxlan${VNI} up
ip addr add ${OVERLAY_IP} dev vxlan${VNI}

# Añadir la entrada FDB para el peer remoto
bridge fdb append ff:ff:ff:ff:ff:ff \
    dev vxlan${VNI} \
    dst ${REMOTE_IP}
EOF
chmod +x /etc/network/if-up.d/vxlan-setup

En sistemas con systemd-networkd (más recomendable):

# /etc/systemd/network/vxlan100.netdev
cat << 'EOF' > /etc/systemd/network/vxlan100.netdev
[NetDev]
Name=vxlan100
Kind=vxlan

[VXLAN]
VNI=100
Local=192.168.1.10
Remote=192.168.1.20
DestinationPort=4789
EOF

# /etc/systemd/network/vxlan100.network
cat << 'EOF' > /etc/systemd/network/vxlan100.network
[Match]
Name=vxlan100

[Network]
Address=10.0.100.1/24
EOF

systemctl restart systemd-networkd

Solución de Problemas

# Verificar que la interfaz VxLAN está activa
ip link show vxlan100

# Ver las entradas en la tabla FDB
bridge fdb show dev vxlan100

# Capturar tráfico VxLAN en la interfaz underlay
tcpdump -i eth0 udp port 4789 -v

# Ver el tráfico de overlay en la interfaz VxLAN
tcpdump -i vxlan100 -v

# Verificar la configuración de la interfaz VxLAN
ip -d link show vxlan100

# Ver las estadísticas de la interfaz
ip -s link show vxlan100

# Verificar que el puerto UDP 4789 no está bloqueado
# En el origen:
nc -zu 192.168.1.20 4789

# Verificar las reglas de firewall
iptables -L -n | grep 4789

# Permitir el tráfico VxLAN en el firewall
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
iptables -A OUTPUT -p udp --sport 4789 -j ACCEPT

Problemas de MTU:

# El encabezado VxLAN añade 50 bytes de overhead
# MTU de la interfaz física: 1500
# MTU recomendado para la interfaz VxLAN: 1450

# Ajustar el MTU de la interfaz VxLAN
ip link set vxlan100 mtu 1450

# Verificar que las VMs usan el MTU correcto
ip link show vnet0
ip link set vnet0 mtu 1450

Conclusión

VxLAN es el protocolo overlay dominante en infraestructuras de centros de datos modernos, utilizado por Kubernetes, OpenStack, VMware NSX y la mayoría de las plataformas cloud para proporcionar aislamiento de red a escala. En Linux, la implementación nativa del kernel combinada con Linux Bridge u Open vSwitch ofrece una solución de alto rendimiento sin necesidad de hardware especializado. El dominio de VxLAN es fundamental para cualquier ingeniero de infraestructura que trabaje con entornos de virtualización o contenedores a gran escala.