TL;DR
System → Advanced → Networking → Disable hardware checksum offload ✔ → Save → reboot the VM. The GUI does not say so, but the change does not apply to vtnet interfaces until the reboot.
To test without rebooting (lost at boot):
| |
On OPNsense: Interfaces → Settings → Hardware CRC → Disable hardware checksum offload, and the same reboot.
Symptoms
The VM boots, the interfaces are UP, LAN DHCP hands out addresses, and still:
- Hosts behind the firewall cannot reach the Internet, or connections stall halfway (ping passes, TCP hangs).
- From the virtualization host itself or from other VMs on the same host nothing protected by pfSense is reachable, not even the GUI.
- Switching the VM’s NIC to
e1000fixes it on the spot, which confirms the diagnosis.
Why it happens
FreeBSD’s vtnet driver, with checksum offload enabled, hands the network stack packets whose checksum never got computed: between VMs on the same host, and between the host and the VM, traffic never crosses a physical NIC that would do it. FreeBSD sees invalid checksums and drops them (FreeBSD bug 165059). Netgate documents it under VirtIO Driver Support.
pfSense tries to tick the option only when it detects vtnet interfaces at install time. If the VirtIO NIC was added later, if you restored the config.xml from a physical firewall, or if you migrated the VM from another hypervisor with a different NIC type, the option stays off.
Procedure
System → Advanced → Networking, Network Interfaces section:
- Disable hardware checksum offload: tick it.
- Disable hardware TCP segmentation offload and Disable hardware large receive offload: already ticked by default; leave them.
Save.
Reboot from Diagnostics → Reboot. Without this step nothing changes on
vtnet.Check:
1ifconfig vtnet0 | grep optionsNeither
RXCSUMnorTXCSUM(norTSO4,LRO) should show up.
If it is still the same
- All of the VM’s NICs must be the same kind. A
vtnetwith offload and ane1000behave differently; check everyifconfig. - Offload on the host. Netgate notes that sometimes checksums and TSO must also be turned off on the hypervisor. On Proxmox/KVM, on the VM’s
tapinterface:ethtool -K tap100i0 tx off(the number is the VMID andi0the NIC). Rarely needed; try it last. - Plan B:
e1000NIC model on the VM. Less throughput than VirtIO without offload, but none of this bug.
Traps
- The reboot is not optional and the GUI does not ask for it. It is the number one cause of “I ticked it and it still does not work”.
- It is not a rules problem. With offload on, packets are dropped before reaching
pf; the firewall log shows nothing. e1000on OPNsense too as plan B; the equivalent setting lives under Interfaces → Settings.- Multiqueue (
queues=Non Proxmox) works fine withvtnetonce offload is off; do not mistake it for the cause.