En corto

System → Advanced → Networking → Disable hardware checksum offload ✔ → Save → reinicia la VM. La GUI no avisa, pero el cambio no aplica a las interfaces vtnet hasta el reinicio.

Para probar sin reiniciar (se pierde al arrancar):

1
2
ifconfig vtnet0 -rxcsum -txcsum -tso -lro
ifconfig vtnet1 -rxcsum -txcsum -tso -lro

En OPNsense: Interfaces → Settings → Hardware CRC → Disable hardware checksum offload, y el mismo reinicio.

Síntomas

La VM arranca, las interfaces están UP, el DHCP de la LAN reparte direcciones y aun así:

  • Los equipos detrás del firewall no llegan a Internet, o la conexión se queda a medias (el ping pasa, TCP se cuelga).
  • Desde el propio host de virtualización o desde otras VMs del mismo host no se llega a nada protegido por pfSense, ni a la GUI.
  • Cambiar la NIC de la VM a e1000 lo arregla al momento, lo que confirma el diagnóstico.

Por qué pasa

El driver vtnet de FreeBSD, con el offload de checksums activado, entrega a la pila de red paquetes cuyo checksum nunca llegó a calcularse: entre VMs del mismo host, y entre el host y la VM, el tráfico no pasa por una NIC física que lo haga. FreeBSD ve checksums inválidos y descarta (bug 165059 de FreeBSD). Netgate lo documenta en VirtIO Driver Support.

pfSense intenta marcar la opción solo cuando detecta interfaces vtnet en la instalación. Si la NIC VirtIO se añadió después, si restauraste el config.xml de un firewall físico, o si migraste la VM desde otro hipervisor con otro tipo de NIC, la opción sigue apagada.

Procedimiento

  1. System → Advanced → Networking, sección Network Interfaces:

    • Disable hardware checksum offload: marcar.
    • Disable hardware TCP segmentation offload y Disable hardware large receive offload: ya vienen marcadas por defecto; déjalas así.
  2. Save.

  3. Reboot desde Diagnostics → Reboot. Sin este paso, nada cambia en vtnet.

  4. Comprueba:

    1
    
    ifconfig vtnet0 | grep options
    

    No deben aparecer RXCSUM ni TXCSUM (ni TSO4, LRO).

Si sigue igual

  • Todas las NICs de la VM tienen que ser del mismo estilo. Una vtnet con offload y otra e1000 se comportan distinto; revisa cada ifconfig.
  • Offload en el host. Netgate señala que a veces también hay que apagar checksums y TSO en el hipervisor. En Proxmox/KVM, sobre la interfaz tap de la VM: ethtool -K tap100i0 tx off (el número es el VMID y i0 la NIC). Es raro necesitarlo; pruébalo el último.
  • Plan B: modelo de NIC e1000 en la VM. Menos rendimiento que VirtIO sin offload, pero sin este bug.

Trampas

  • El reinicio no es opcional y la GUI no lo pide. Es la causa número uno de “lo marqué y sigue sin funcionar”.
  • No es un problema de reglas. Con el offload activo, los paquetes se descartan antes de llegar a pf; el log del firewall no muestra nada.
  • e1000 también en OPNsense como plan B; el ajuste equivalente está en Interfaces → Settings.
  • Multiqueue (queues=N en Proxmox) funciona bien con vtnet una vez desactivado el offload; no lo confundas con la causa.