<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Virtio on inetshell</title><link>https://inet.sh/es/tags/virtio/</link><description>Recent content in Virtio on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Fri, 25 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/virtio/index.xml" rel="self" type="application/rss+xml"/><item><title>pfSense virtualizado con VirtIO: sin tráfico hasta desactivar hardware checksum offload</title><link>https://inet.sh/es/posts/pfsense/virtio-desactivar-hardware-checksum-offload/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/pfsense/virtio-desactivar-hardware-checksum-offload/</guid><description>pfSense u OPNsense en Proxmox, KVM o bhyve con NICs VirtIO (vtnet): el firewall arranca pero no pasa tráfico, o no se llega a los equipos detrás de él desde el host y otras VMs. Es el checksum offload de vtnet en FreeBSD. System &amp;gt; Advanced &amp;gt; Networking &amp;gt; Disable hardware checksum offload y reinicio obligatorio.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p><strong>System → Advanced → Networking → Disable hardware checksum offload</strong> ✔ → <strong>Save</strong> → <strong>reinicia la VM</strong>. La GUI no avisa, pero el cambio no aplica a las interfaces <code>vtnet</code> hasta el reinicio.</p>
<p>Para probar sin reiniciar (se pierde al arrancar):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ifconfig vtnet0 -rxcsum -txcsum -tso -lro
</span></span><span class="line"><span class="cl">ifconfig vtnet1 -rxcsum -txcsum -tso -lro
</span></span></code></pre></td></tr></table>
</div>
</div><p>En OPNsense: <strong>Interfaces → Settings → Hardware CRC → Disable hardware checksum offload</strong>, y el mismo reinicio.</p>
<h2 id="síntomas">Síntomas</h2>
<p>La VM arranca, las interfaces están <code>UP</code>, el DHCP de la LAN reparte direcciones y aun así:</p>
<ul>
<li>Los equipos detrás del firewall no llegan a Internet, o la conexión se queda a medias (el ping pasa, TCP se cuelga).</li>
<li>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.</li>
<li>Cambiar la NIC de la VM a <code>e1000</code> lo arregla al momento, lo que confirma el diagnóstico.</li>
</ul>
<h2 id="por-qué-pasa">Por qué pasa</h2>
<p>El driver <code>vtnet</code> 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 <a href="https://docs.netgate.com/pfsense/en/latest/virtualization/virtio-driver-support.html">VirtIO Driver Support</a>.</p>
<p>pfSense intenta marcar la opción solo cuando detecta interfaces <code>vtnet</code> <strong>en la instalación</strong>. Si la NIC VirtIO se añadió después, si restauraste el <code>config.xml</code> de un firewall físico, o si migraste la VM desde otro hipervisor con otro tipo de NIC, la opción sigue apagada.</p>
<h2 id="procedimiento">Procedimiento</h2>
<ol>
<li>
<p><strong>System → Advanced → Networking</strong>, sección <em>Network Interfaces</em>:</p>
<ul>
<li><strong>Disable hardware checksum offload</strong>: marcar.</li>
<li><strong>Disable hardware TCP segmentation offload</strong> y <strong>Disable hardware large receive offload</strong>: ya vienen marcadas por defecto; déjalas así.</li>
</ul>
</li>
<li>
<p><strong>Save</strong>.</p>
</li>
<li>
<p><strong>Reboot</strong> desde Diagnostics → Reboot. Sin este paso, nada cambia en <code>vtnet</code>.</p>
</li>
<li>
<p>Comprueba:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ifconfig vtnet0 <span class="p">|</span> grep options
</span></span></code></pre></td></tr></table>
</div>
</div><p>No deben aparecer <code>RXCSUM</code> ni <code>TXCSUM</code> (ni <code>TSO4</code>, <code>LRO</code>).</p>
</li>
</ol>
<h2 id="si-sigue-igual">Si sigue igual</h2>
<ul>
<li><strong>Todas las NICs de la VM tienen que ser del mismo estilo.</strong> Una <code>vtnet</code> con offload y otra <code>e1000</code> se comportan distinto; revisa cada <code>ifconfig</code>.</li>
<li><strong>Offload en el host.</strong> Netgate señala que a veces también hay que apagar checksums y TSO en el hipervisor. En Proxmox/KVM, sobre la interfaz <code>tap</code> de la VM: <code>ethtool -K tap100i0 tx off</code> (el número es el VMID y <code>i0</code> la NIC). Es raro necesitarlo; pruébalo el último.</li>
<li><strong>Plan B</strong>: modelo de NIC <code>e1000</code> en la VM. Menos rendimiento que VirtIO sin offload, pero sin este bug.</li>
</ul>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>El reinicio no es opcional</strong> y la GUI no lo pide. Es la causa número uno de &ldquo;lo marqué y sigue sin funcionar&rdquo;.</li>
<li><strong>No es un problema de reglas.</strong> Con el offload activo, los paquetes se descartan antes de llegar a <code>pf</code>; el log del firewall no muestra nada.</li>
<li><strong><code>e1000</code> también en OPNsense</strong> como plan B; el ajuste equivalente está en <em>Interfaces → Settings</em>.</li>
<li><strong>Multiqueue</strong> (<code>queues=N</code> en Proxmox) funciona bien con <code>vtnet</code> una vez desactivado el offload; no lo confundas con la causa.</li>
</ul>
]]></content:encoded></item></channel></rss>