Proxmox — Redes definidas por software (SDN)¶
El problema¶
Un bridge de Linux en Proxmox vive en /etc/network/interfaces, que es un fichero local de cada nodo. Añadir un segmento nuevo a un cluster de cinco máquinas significa editar cinco ficheros a mano y que los cinco queden idénticos. El día que uno se escribe con la VLAN 130 en vez de la 30, la VM funciona perfectamente… hasta que migra a ese nodo y se queda sin red, normalmente un viernes.
El SDN mueve esa definición al sistema de ficheros del cluster: la declaras una vez, Proxmox la replica y genera la configuración de red en todos los nodos. No sustituye al switch físico ni hace la red más rápida; lo que hace es que un segmento sea un objeto del cluster en lugar de un acuerdo tácito entre cinco ficheros de texto.
Comprueba tu versión antes de seguir
El SDN nació como funcionalidad experimental y maduró a lo largo de varias versiones mayores: cambiaron el paquete que lo provee, los tipos de zona disponibles y la existencia de DHCP integrado. Mira qué tienes con pveversion -v | grep -E 'pve-manager|libpve-network' antes de copiar nada de aquí. Si el menú Datacenter → SDN no aparece o falta libpve-network-perl, tu versión es anterior a la integración y conviene actualizar en lugar de forzarlo a mano. Esta página describe el comportamiento estable y ampliamente documentado; los detalles de tu versión concreta, en la documentación oficial enlazada al final.
📋 Tabla de Contenidos¶
- Qué aporta el SDN frente a un bridge de Linux
- Tipos de zona
- VNets y subredes
- El ciclo de aplicar la configuración
- IPAM
- Ejemplo: zona VLAN
- Ejemplo: zona VXLAN entre nodos
- MTU en redes overlay
- Cortafuegos y SDN
- EVPN y enrutado entre VNets
- Diagnóstico de conectividad entre nodos
- Troubleshooting
- Buenas prácticas
- Referencias
Qué aporta el SDN frente a un bridge de Linux¶
| Bridge clásico | SDN | |
|---|---|---|
| Dónde vive la definición | /etc/network/interfaces, por nodo |
/etc/pve/sdn/, replicado en el cluster |
| Alta de un segmento nuevo | Editar cada nodo | Declararlo una vez y aplicar |
| Coherencia entre nodos | Responsabilidad tuya | Garantizada por la configuración generada |
| Segmento que cruza nodos | Depende del switch (VLAN en el trunk) | Posible sin tocar el switch (VXLAN) |
| Direccionamiento | Externo a Proxmox | Subredes e IPAM dentro del cluster |
| Vuelta atrás | Restaurar el fichero y reiniciar la red | Volver a la configuración anterior y aplicar |
Lo que no aporta: rendimiento. Un bridge plano sobre una VLAN del switch será siempre el camino más corto. El SDN añade capas —encapsulado en VXLAN, un demonio de enrutado en EVPN— y cada capa es algo más que puede fallar; úsalo cuando el problema sea de gestión o de topología, no para ir más rápido. La jerarquía es corta: una zona define el transporte, contiene VNets (los bridges a los que enganchas las VMs) y cada VNet puede llevar subredes, cuyo direccionamiento gestiona el IPAM. Solo EVPN añade una pieza más, el controlador.
Tipos de zona¶
La zona define cómo se transporta el tráfico. Es la decisión importante: cambiarla después implica rehacer las VNets.
| Zona | Qué hace | Cuándo usarla | Lo que te va a costar |
|---|---|---|---|
| Simple | Bridge aislado y local a cada nodo, con enrutado y NAT desde el propio host | Laboratorios, redes internas de un único nodo, entornos de prueba | No hay capa 2 entre nodos: dos VMs en nodos distintos no se ven |
| VLAN | Etiqueta 802.1Q sobre un bridge VLAN-aware | Ya tienes VLANs en el switch y quieres gestionarlas desde Proxmox | El trunk del switch debe llevar cada VLAN; sin eso no hay magia |
| QinQ | Doble etiqueta 802.1ad: una de servicio y la del cliente | Multi-tenant en el que cada inquilino trae su propio plan de VLANs | Soporte real en switch y NIC, y 4 bytes más de cabecera |
| VXLAN | Túnel de capa 2 sobre UDP entre los nodos | Un segmento que cruce nodos sin tocar la red física | MTU (ver más abajo) y tráfico de difusión replicado a cada peer |
| EVPN | VXLAN con BGP como plano de control, más enrutado L3 entre VNets | Varias subredes que deben enrutarse entre sí y salir al exterior | FRR, un ASN, nodos de salida y depuración con vtysh |
Regla de decisión rápida: si el switch ya sabe hacerlo, VLAN. Si necesitas un segmento que la red física no conoce, VXLAN. Si además necesitas que varias de esas redes se enruten entre sí con una puerta de enlace que sobreviva a las migraciones, EVPN. Simple para el portátil y el laboratorio. QinQ solo si de verdad tienes el problema que resuelve.
VNets y subredes¶
Una VNet es el bridge al que enganchas la VM. Pertenece a una zona y hereda su transporte; en zonas simple no es más que un bridge:
- En zonas VLAN y QinQ, la VNet lleva la etiqueta (
tag). - En zonas VXLAN y EVPN, la VNet lleva el VNI, el identificador del segmento dentro del túnel.
Una subred es un CIDR asociado a una VNet, opcionalmente con puerta de enlace, SNAT y rangos para DHCP. Aquí conviene ser honesto sobre qué hace realmente:
Una subred no crea la puerta de enlace por arte de magia
En zonas simple y EVPN, Proxmox sí levanta la puerta de enlace declarada en la subred (en EVPN, además, como anycast en todos los nodos). En zonas VLAN, QinQ y VXLAN el enrutado sigue viviendo fuera: en tu router o cortafuegos. Ahí la subred sirve para IPAM y documentación, no para dar salida. Declarar 10.100.0.1 como gateway en una zona VLAN no hace que nadie responda a esa IP.
Toda la configuración es texto plano bajo /etc/pve/sdn/ —zones.cfg, vnets.cfg, subnets.cfg, controllers.cfg, ipams.cfg y dns.cfg— replicado por el cluster. Al ser ficheros de /etc/pve, entran en el backup de configuración y se pueden versionar con Ansible igual que cualquier otra cosa.
El ciclo de aplicar la configuración¶
Este es el punto en el que se pierde más tiempo, así que va primero: el SDN tiene dos estados. Lo que editas es la configuración pendiente; lo que está funcionando es la configuración aplicada. Nada de lo que toques surte efecto hasta que pulsas Apply.
flowchart LR
A["Editas zona / VNet / subred"] --> B["/etc/pve/sdn/*.cfg<br/><i>pendiente</i>"]
B -->|Apply| C["/etc/pve/sdn/.running-config"]
C --> D["/etc/network/interfaces.d/sdn<br/>en cada nodo"]
D --> E[Interfaces recargadas]
Aplicar hace tres cosas en cada nodo: escribe /etc/network/interfaces.d/sdn, recarga la red y deja constancia en el registro de tareas. Desde la interfaz es Datacenter → SDN → Apply; desde la línea de comandos, y comprobando el resultado:
pvesh get /cluster/sdn # la configuración tal y como está funcionando
pvesh set /cluster/sdn # aplicarla en todo el cluster
cat /etc/network/interfaces.d/sdn
ip -br link | grep -E 'vnet|vxlan|vrf'
Si el fichero generado está vacío o no existe
Significa que la configuración nunca se aplicó en ese nodo, no que la zona esté mal. Causas habituales: el cluster estaba sin quórum en ese momento (/etc/pve en solo lectura), el nodo estaba apagado durante el apply, o falta ifupdown2, que es lo que permite recargar la red sin reiniciar. Recupera el quórum, comprueba pvecm status y vuelve a aplicar.
IPAM¶
El IPAM lleva la cuenta de qué IP está asignada a qué. Proxmox trae uno interno y sabe hablar con dos externos:
| Backend | Dónde vive | Cuándo elegirlo |
|---|---|---|
| PVE | Dentro del cluster, sin dependencias | Por defecto, y suficiente si Proxmox es el único que reparte direcciones |
| phpIPAM | Servidor externo, vía API | Ya lo usas como fuente de verdad para toda la red, no solo la virtual |
| NetBox | Servidor externo, vía API | Igual, con inventario y documentación de red integrados |
Con un backend externo, Proxmox consulta y reserva en él en lugar de decidir por su cuenta: el objetivo es que no haya dos sitios repartiendo las mismas IPs. Requiere un token de API con permisos de escritura y conectividad desde los nodos; si la API no responde, las operaciones que necesiten una dirección fallan.
En zonas simple puede además ofrecer DHCP a las VMs a partir de los rangos de la subred, apoyándose en dnsmasq. Es la forma cómoda de tener un laboratorio autocontenido. Comprueba en la documentación de tu versión qué tipos de zona lo soportan, porque es de las partes que más han cambiado.
Ejemplo: zona VLAN¶
El escenario más común y el más aburrido, que es un elogio. Requisito previo: el bridge físico debe ser VLAN-aware.
# /etc/network/interfaces — en cada nodo
auto vmbr0
iface vmbr0 inet static
address 192.168.1.10/24
gateway 192.168.1.1
bridge-ports eno1
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
Después, la zona y la VNet. Se pueden crear desde Datacenter → SDN; así queda la configuración resultante:
# /etc/pve/sdn/zones.cfg
vlan: lan
bridge vmbr0
ipam pve
# /etc/pve/sdn/vnets.cfg
vnet: srv30
zone lan
tag 30
alias Servidores internos
Aplicar y enganchar una VM a la VNet, que a partir de ahí se usa como cualquier bridge:
pvesh set /cluster/sdn
qm set 100 --net0 virtio,bridge=srv30
La VM no ve ninguna etiqueta: envía tramas sin marcar y el bridge le pone la 30 al salir. Si no hay conectividad, el sospechoso número uno es el trunk del switch físico, que tiene que llevar la VLAN 30 hasta el puerto de ese nodo. El SDN no configura tu switch.
Ejemplo: zona VXLAN entre nodos¶
Aquí el segmento existe aunque la red física no sepa nada de él. Tres nodos con IPs 10.10.10.1, .2 y .3 en una red dedicada al tráfico de VMs:
# /etc/pve/sdn/zones.cfg
vxlan: overlay
peers 10.10.10.1,10.10.10.2,10.10.10.3
ipam pve
mtu 1450
# /etc/pve/sdn/vnets.cfg
vnet: app100
zone overlay
tag 100
alias Red interna de aplicaciones
Tres detalles que deciden si esto funciona:
- Todos los nodos van en
peers, incluido el propio. La lista es idéntica en todo el cluster; Proxmox descarta su propia dirección al generar la configuración. - Las IPs de
peerseligen por dónde va el tráfico. Si pones las de gestión, el tráfico de las VMs compartirá enlace con corosync, que es exactamente lo que no quieres. Usa las de la red dedicada. - El
tages el VNI, no una VLAN. Es el identificador del segmento dentro del túnel y debe ser único en la zona.
Entre nodos hace falta conectividad IP y el puerto UDP 4789 abierto en ambos sentidos. Sin plano de control, la difusión y el tráfico a destinos desconocidos se replican por unicast a cada peer: con muchos nodos, el coste crece rápido y ahí es donde EVPN empieza a compensar.
MTU en redes overlay¶
Si algo va a fallar en un overlay, es esto. Encapsular en VXLAN añade 50 bytes a cada trama sobre un underlay IPv4 —cabecera Ethernet exterior (14), IP (20), UDP (8) y VXLAN (8)—, y 70 bytes si el underlay es IPv6. Una trama de invitado de 1500 bytes sale al cable como un paquete de 1550.
Si el switch físico está en 1500, ese paquete no cabe. Y no se fragmenta: el paquete exterior lleva el bit don't fragment, así que se descarta en silencio. El síntoma no es "no hay red", que sería fácil:
- El
pingy el handshake de TCP funcionan: son paquetes pequeños. sshconecta, y se cuelga en cuanto se transfiere algo de volumen.- Una página web carga a medias; una copia de ficheros se queda a cero.
- El descubrimiento de MTU de camino (PMTUD) no te rescata, porque el ICMP que avisa se genera en el underlay y muchos cortafuegos lo filtran.
Ese cuadro —"va lento y a veces falla"— es casi siempre MTU. Las dos salidas:
| Underlay | MTU máximo de la VNet | Qué hacer |
|---|---|---|
| 1500 (estándar) | 1450 | Fijar 1450 en la zona y en los invitados |
| 9000 (jumbo) | 8950 | Jumbo de extremo a extremo y dejar la MTU por defecto |
La opción buena es jumbo frames en el underlay: NICs, bonds, bridges y puertos del switch a 9000, y la VNet queda en 1500 sin que nadie note nada. La opción de emergencia es bajar la MTU del invitado a 1450, que funciona sobre un underlay de 1500 pero exige que los invitados hagan caso: por DHCP (opción 26) o a mano en cada VM. Un solo invitado con 1500 reproduce el problema entero.
Comprueba el camino real con un paquete que no se pueda fragmentar, antes de dar la configuración por buena:
ping -M do -s 8972 10.10.10.2 # 9000 - 20 (IP) - 8 (ICMP): si responde, hay jumbo de verdad
ping -M do -s 1472 10.10.10.2 # 1500 - 28: debe responder siempre
La MTU es del camino entero, no de la interfaz
Un solo eslabón a 1500 —un puerto de switch olvidado, un enlace entre armarios, un router intermedio, una interfaz del bond— convierte todo el trayecto en 1500. La prueba con ping -M do es la única forma fiable de saberlo: ip link te dice lo que has configurado, no lo que el cable transporta.
Cortafuegos y SDN¶
El cortafuegos de Proxmox actúa sobre la interfaz de la VM, y le da igual si el bridge lo creó el SDN o /etc/network/interfaces. Lo que cambia es lo que hay que dejar pasar entre los nodos:
- UDP 4789 para el tráfico VXLAN encapsulado.
- TCP 179 entre los nodos si usas EVPN, para las sesiones BGP.
- Los puertos habituales del cluster, que ya deberían estar contemplados.
El cortafuegos ve el flujo UDP exterior, no las tramas que van dentro. Filtrar tráfico entre dos VMs del mismo segmento se hace en la interfaz de la VM, nunca a nivel de nodo.
Los tres interruptores
El cortafuegos se habilita en Datacenter, en el nodo y en la VM, y los tres tienen que estar activos. Con el de Datacenter apagado no se aplica nada, por muchas reglas que tengas escritas en la VM. Es el motivo más frecuente de "las reglas no hacen nada", y también de dejarse un segmento abierto creyendo que está cerrado.
El aislamiento entre VNets de una misma zona es de capa 2: lo dan la etiqueta o el VNI, no las reglas. Pero en cuanto enrutas entre ellas —con EVPN o con un router externo— ese aislamiento desaparece y hace falta política explícita. Los IPSets y los grupos de seguridad a nivel de Datacenter evitan repetir la misma regla en veinte máquinas; ver seguridad en Proxmox.
EVPN y enrutado entre VNets¶
EVPN añade a VXLAN un plano de control basado en BGP: los nodos se anuncian entre sí qué MAC e IP tienen detrás, en lugar de inundar la red para averiguarlo. Necesita un controlador además de la zona.
# /etc/pve/sdn/controllers.cfg
evpn: ctrl1
asn 65000
peers 10.10.10.1,10.10.10.2,10.10.10.3
# /etc/pve/sdn/zones.cfg
evpn: tenants
controller ctrl1
vrf-vxlan 10000
exit-nodes pve1,pve2
ipam pve
mtu 1450
Cada VNet de la zona lleva su subred con puerta de enlace, y esa puerta de enlace se levanta como anycast: la misma IP y la misma MAC en todos los nodos, de modo que una VM que migra sigue hablando con su gateway sin enterarse de nada. Ese es el motivo real para usar EVPN, más que el ahorro de inundación. Los exit nodes son los nodos por los que el tráfico sale al exterior: declara al menos dos si la salida importa, porque con uno solo apagarlo para mantenimiento deja sin Internet a toda la zona.
Por debajo hay FRR (frr.service), y la depuración no pasa por la interfaz web:
systemctl status frr
vtysh -c 'show bgp l2vpn evpn summary' # sesiones BGP entre nodos
vtysh -c 'show evpn vni' # VNIs conocidos y su VRF
vtysh -c 'show evpn mac vni all' # MACs aprendidas por el plano de control
EVPN es la parte cara
Da por hecho un underlay IP estable entre nodos, sesiones BGP funcionando y alguien que sepa leer una tabla de rutas cuando algo falle. Si lo único que necesitas es un segmento que cruce nodos, una zona VXLAN hace ese trabajo con una fracción de las piezas móviles. EVPN empieza a compensar cuando hay varias subredes que enrutar entre sí, muchos nodos, o la puerta de enlace anycast es un requisito.
Diagnóstico de conectividad entre nodos¶
En orden, de abajo hacia arriba. La mayoría de los problemas se cierran en los dos primeros pasos:
# 1. ¿Se ven los nodos, y aguanta la MTU del camino?
ping -c3 10.10.10.2
ping -M do -s 8972 10.10.10.2
# 2. ¿Está aplicada la configuración en ESTE nodo?
cat /etc/pve/sdn/.running-config
cat /etc/network/interfaces.d/sdn
# 3. ¿Existen las interfaces y con qué parámetros?
ip -br link | grep -E 'vnet|vxlan'
ip -d link show vxlan_app100 # VNI, puerto UDP, MTU y peers reales
# 4. ¿Qué sabe el túnel, qué sale por el cable y qué dijo el último apply?
bridge fdb show dev vxlan_app100
bridge vlan show # en zonas VLAN, etiquetas por puerto
tcpdump -ni eno1 udp port 4789
journalctl -u pvedaemon -u pveproxy --since '30 min ago'
Si tcpdump muestra paquetes saliendo pero el destino no ve nada, el problema está en la red física o en un cortafuegos intermedio, no en Proxmox. Si no sale nada, la interfaz no está encapsulando: vuelve al paso 2.
Troubleshooting¶
| Síntoma | Causa | Arreglo |
|---|---|---|
| Los cambios no tienen ningún efecto | Configuración pendiente sin aplicar | Apply, o pvesh set /cluster/sdn |
| Un nodo se queda sin las interfaces | Estaba apagado o sin quórum al aplicar | pvecm status y volver a aplicar |
| Ping bien, transferencias colgadas | MTU del underlay insuficiente | Jumbo frames, o MTU 1450 en zona e invitados |
| Dos VMs no se ven en nodos distintos | Zona simple: no cruza nodos | Cambiar a VLAN o VXLAN |
| VLAN sin conectividad fuera del nodo | Bridge sin bridge-vlan-aware, o VLAN ausente del trunk |
Corregir el bridge y el puerto del switch |
| VXLAN sin tráfico entre nodos | UDP 4789 bloqueado o peers mal |
Abrir el puerto y revisar las IPs de peers |
| Nadie responde en la IP de la puerta de enlace | Zona VLAN/VXLAN: el gateway vive fuera | Configurarlo en el router, o usar EVPN |
| EVPN sin rutas entre VNets | Sesiones BGP caídas | vtysh -c 'show bgp l2vpn evpn summary' |
| Las VNets pierden la salida exterior | Único exit node apagado | Declarar al menos dos nodos de salida |
| Las reglas de cortafuegos no se aplican | Falta el interruptor de Datacenter o de nodo | Habilitarlo en los tres niveles |
Buenas prácticas¶
- Empieza por la zona más simple que resuelva el problema. Si la VLAN llega, VLAN. Cada capa de encapsulado es una fuente de fallos más y una capa menos de visibilidad para
tcpdump. - Red dedicada para el tráfico del overlay. Compartir enlace con corosync convierte una copia de 64 GB en una pérdida de quórum; ver migración.
- Decide la MTU antes de crear nada y verifícala con
ping -M dode extremo a extremo. Cambiarla después obliga a tocar todos los invitados. - Aplica con todos los nodos encendidos. Un nodo ausente durante el apply queda con una configuración distinta al resto, y el fallo aparece semanas después al migrar una VM.
- Nombres de VNet que digan algo.
srv30odmzsobreviven a un incidente a las tres de la mañana;vnet0yvnet1, no. - Un solo IPAM como fuente de verdad. Proxmox repartiendo direcciones a la vez que el DHCP corporativo termina siempre igual.
- Prueba la migración de una VM antes de dar el segmento por bueno. Es el escenario que descubre las diferencias entre nodos, y el único que importa de verdad en un cluster.