Redes Definidas por Software con Open vSwitch

Open vSwitch (OVS) es el switch virtual de código abierto más utilizado para implementar redes definidas por software (SDN) en Linux, potenciando infraestructuras como OpenStack, Kubernetes y entornos de virtualización. Esta guía cubre la creación de bridges, configuración de VLANs, reglas OpenFlow, port mirroring, túneles GRE/VxLAN y aceleración DPDK.

Requisitos Previos

  • Ubuntu 20.04/22.04 o Debian 11/12
  • Acceso root
  • Kernel Linux 4.15+ (para soporte completo de OVS)
  • Para DPDK: hardware compatible y hugepages configurados

Instalación de Open vSwitch

# Instalar Open vSwitch en Ubuntu/Debian
apt update
apt install -y openvswitch-switch openvswitch-common

# En CentOS/Rocky Linux
dnf install -y openvswitch
systemctl enable openvswitch
systemctl start openvswitch

# Verificar la instalación
ovs-vsctl show
ovs-vsctl --version

# Verificar que el servicio está activo
systemctl status openvswitch-switch

Gestión de Bridges

Un bridge OVS es el equivalente a un switch virtual:

# Crear un bridge OVS básico
ovs-vsctl add-br br0

# Verificar el bridge creado
ovs-vsctl show

# Añadir una interfaz física al bridge (la interfaz pierde su IP)
ovs-vsctl add-port br0 eth1

# Asignar una IP al bridge (el bridge actúa como la interfaz de red)
ip addr add 192.168.1.1/24 dev br0
ip link set br0 up

# Listar todos los bridges y sus puertos
ovs-vsctl list-br
ovs-vsctl list-ports br0

# Eliminar un puerto del bridge
ovs-vsctl del-port br0 eth1

# Eliminar un bridge completo
ovs-vsctl del-br br0

Configurar un bridge con fail mode para OpenFlow:

# Crear bridge en modo "secure" (espera un controlador OpenFlow)
ovs-vsctl add-br br-sdn
ovs-vsctl set-fail-mode br-sdn secure

# Modo "standalone" (comportamiento de switch normal si no hay controlador)
ovs-vsctl set-fail-mode br-sdn standalone

# Conectar el bridge a un controlador OpenFlow externo
ovs-vsctl set-controller br-sdn tcp:192.168.1.100:6633

# Verificar la configuración del bridge
ovs-vsctl get-controller br-sdn

Configuración de VLANs

# Crear un bridge y añadir puertos con VLANs

# Puerto de acceso (un solo VLAN - hosts de usuarios)
# El tráfico entra sin tag y sale con el tag del VLAN
ovs-vsctl add-port br0 eth2 tag=100

# Puerto troncal (múltiples VLANs - conexión entre switches)
ovs-vsctl add-port br0 eth3 trunks=100,200,300

# Puerto de acceso para una VM (en entornos de virtualización)
ovs-vsctl add-port br0 vnet0 tag=200

# Configurar VLANs en un bridge interno
ovs-vsctl add-br br-vlan100 br0 100
ip addr add 10.100.0.1/24 dev br-vlan100
ip link set br-vlan100 up

ovs-vsctl add-br br-vlan200 br0 200
ip addr add 10.200.0.1/24 dev br-vlan200
ip link set br-vlan200 up

# Verificar las VLANs configuradas
ovs-vsctl list port eth2

Escenario completo con múltiples VLANs:

# Escenario: switch con tres VLANs de producción

# Crear el bridge principal
ovs-vsctl add-br br-produccion

# Uplink troncal (conecta con el switch físico)
ovs-vsctl add-port br-produccion eth0 trunks=10,20,30

# Puertos de acceso por VLAN
# VLAN 10: servidores web
ovs-vsctl add-port br-produccion vnet1 tag=10
ovs-vsctl add-port br-produccion vnet2 tag=10

# VLAN 20: bases de datos
ovs-vsctl add-port br-produccion vnet3 tag=20

# VLAN 30: administración
ovs-vsctl add-port br-produccion vnet4 tag=30

# Verificar la configuración completa
ovs-vsctl show

Reglas OpenFlow

Las reglas OpenFlow controlan cómo el switch procesa los paquetes:

# Ver las reglas de flujo actuales
ovs-ofctl dump-flows br0

# Añadir una regla básica: redirigir todo el tráfico del puerto 1 al puerto 2
ovs-ofctl add-flow br0 "in_port=1,actions=output:2"

# Regla con match específico: redirigir tráfico HTTP hacia un servicio
ovs-ofctl add-flow br0 \
  "priority=100,ip,nw_dst=192.168.1.10,tp_dst=80,actions=output:3"

# Descartar tráfico de una IP específica
ovs-ofctl add-flow br0 \
  "priority=200,ip,nw_src=10.0.0.99,actions=drop"

# Regla para implementar QoS: marcar tráfico con DSCP
ovs-ofctl add-flow br0 \
  "priority=100,ip,nw_src=10.0.0.0/24,actions=mod_nw_tos:184,output:1"

# Reescritura de cabeceras (NAT simple)
ovs-ofctl add-flow br0 \
  "priority=100,ip,nw_dst=203.0.113.10,actions=mod_nw_dst:192.168.1.100,output:2"

# Inundar a todos los puertos (comportamiento de broadcast)
ovs-ofctl add-flow br0 "actions=flood"

# Eliminar una regla específica
ovs-ofctl del-flows br0 "in_port=1"

# Eliminar todas las reglas
ovs-ofctl del-flows br0

Reglas para monitoreo y estadísticas:

# Ver estadísticas de flujo
ovs-ofctl dump-flows br0 --stats

# Ver estadísticas de los puertos
ovs-ofctl dump-ports br0

# Ver estadísticas en tiempo real
watch -n 1 ovs-ofctl dump-ports br0

Port Mirroring

El port mirroring copia el tráfico de un puerto a otro para análisis:

# Crear un mirror: copiar todo el tráfico del puerto eth0 a un puerto de análisis
ovs-vsctl -- set bridge br0 mirrors=@m \
  -- --id=@eth0 get port eth0 \
  -- --id=@monitor get port eth-monitor \
  -- --id=@m create mirror name=analisis-trafico \
     select-src-port=@eth0 \
     select-dst-port=@eth0 \
     output-port=@monitor

# Verificar el mirror configurado
ovs-vsctl list mirror

# Alternativa más simple: mirror de todos los puertos
ovs-vsctl -- set bridge br0 mirrors=@m \
  -- --id=@m create mirror name=mirror-global \
     select-all=true \
     output-port=@monitor

# Iniciar una captura en el puerto de monitoreo
tcpdump -i eth-monitor -w /tmp/captura.pcap

# Eliminar el mirror
ovs-vsctl clear bridge br0 mirrors

Túneles GRE y VxLAN

# Crear un túnel GRE entre dos hosts OVS
# En el Host A (192.168.1.10):
ovs-vsctl add-br br-overlay
ovs-vsctl add-port br-overlay gre0 \
  -- set interface gre0 type=gre \
  options:remote_ip=192.168.1.20

# En el Host B (192.168.1.20):
ovs-vsctl add-br br-overlay
ovs-vsctl add-port br-overlay gre0 \
  -- set interface gre0 type=gre \
  options:remote_ip=192.168.1.10

# Crear un túnel VxLAN (Layer 2 sobre Layer 3)
# En el Host A:
ovs-vsctl add-port br-overlay vxlan0 \
  -- set interface vxlan0 type=vxlan \
  options:remote_ip=192.168.1.20 \
  options:key=1000 \
  options:dst_port=4789

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

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

# Probar la conectividad a través del túnel
# Añadir una IP al bridge en ambos hosts
ip addr add 10.0.0.1/24 dev br-overlay   # En Host A
ip addr add 10.0.0.2/24 dev br-overlay   # En Host B
ping 10.0.0.2 -c 4

Aceleración con DPDK

# Configurar hugepages para DPDK
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf

# Montar hugepages
mkdir -p /dev/hugepages
mount -t hugetlbfs hugetlbfs /dev/hugepages

# Hacer el montaje persistente
echo "hugetlbfs /dev/hugepages hugetlbfs defaults 0 0" >> /etc/fstab

# Instalar OVS con soporte DPDK
apt install -y openvswitch-switch-dpdk

# Inicializar OVS con DPDK
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x1

systemctl restart openvswitch-switch

# Crear un bridge DPDK
ovs-vsctl add-br br-dpdk -- set bridge br-dpdk datapath_type=netdev

# Añadir un puerto DPDK (reemplaza eth0 con el PCI address del NIC)
ovs-vsctl add-port br-dpdk dpdk0 \
  -- set Interface dpdk0 type=dpdk \
  options:dpdk-devargs=0000:04:00.0

Solución de Problemas

# Ver el estado completo de OVS
ovs-vsctl show

# Ver información detallada de una interfaz
ovs-vsctl list interface eth0

# Ver logs de Open vSwitch
journalctl -u openvswitch-switch -f

# Verificar que el módulo del kernel está cargado
lsmod | grep openvswitch

# Ver las estadísticas del datapath
ovs-dpctl show
ovs-dpctl dump-flows

# Capturar paquetes en un bridge OVS directamente
ovs-tcpdump -i br0 icmp

# Trazar un paquete a través del pipeline de OVS
ovs-appctl ofproto/trace br0 "in_port=1,dl_src=00:11:22:33:44:55,ip,nw_src=192.168.1.1"

El bridge no reenvía tráfico:

# Verificar que hay reglas de flujo configuradas
ovs-ofctl dump-flows br0

# Verificar el STP (si está causando bloqueos de puerto)
ovs-vsctl get bridge br0 stp_enable

# Deshabilitar STP si no es necesario
ovs-vsctl set bridge br0 stp_enable=false

Conclusión

Open vSwitch es la base de la mayoría de las plataformas SDN y de virtualización de red en producción, ofreciendo una flexibilidad que ningún switch de hardware puede igualar. Desde la gestión de VLANs simples hasta la creación de redes overlay complejas con VxLAN y el control programático con OpenFlow, OVS proporciona todas las herramientas necesarias para construir infraestructuras de red modernas y software-defined. Su integración nativa con Linux y Kubernetes lo convierte en una pieza fundamental del stack de cualquier proveedor de infraestructura.