<?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>Pfctl on inetshell</title><link>https://inet.sh/es/tags/pfctl/</link><description>Recent content in Pfctl 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/pfctl/index.xml" rel="self" type="application/rss+xml"/><item><title>pfctl: cheat sheet de tablas en pfSense, OPNsense y FreeBSD</title><link>https://inet.sh/es/posts/pfsense/pfctl-tablas-cheat-sheet/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/pfsense/pfctl-tablas-cheat-sheet/</guid><description>Comandos pfctl -t/-T para tablas de PF: listar, ver, añadir, borrar, probar, vaciar, recargar desde archivo y expirar entradas. Con las tablas internas de pfSense (sshguard, virusprot, snort2c, bogons, aliases y pfBlockerNG) y lo que se pierde al recargar el filtro.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<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><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</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">pfctl -sT                                    <span class="c1"># tablas cargadas</span>
</span></span><span class="line"><span class="cl">pfctl -t &lt;tabla&gt; -T show                     <span class="c1"># contenido</span>
</span></span><span class="line"><span class="cl">pfctl -t &lt;tabla&gt; -T add 192.168.1.10         <span class="c1"># añadir IP o red (también 10.20.0.0/16)</span>
</span></span><span class="line"><span class="cl">pfctl -t &lt;tabla&gt; -T delete 192.168.1.10
</span></span><span class="line"><span class="cl">pfctl -t &lt;tabla&gt; -T <span class="nb">test</span> 192.168.1.10        <span class="c1"># ¿está dentro? (match / no match)</span>
</span></span><span class="line"><span class="cl">pfctl -t &lt;tabla&gt; -T flush                    <span class="c1"># vaciar la tabla</span>
</span></span><span class="line"><span class="cl">pfctl -t &lt;tabla&gt; -T replace -f /ruta/lista   <span class="c1"># reemplazar todo el contenido desde un archivo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pfctl -t sshguard -T flush                   <span class="c1"># pfSense: quitar el bloqueo por intentos de login fallidos</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="qué-es-una-tabla">Qué es una tabla</h2>
<p>Una <strong>tabla</strong> de PF es un conjunto de direcciones y redes al que las reglas hacen referencia como <code>&lt;nombre&gt;</code>. Se cambia en caliente, sin recargar el ruleset, y aguanta miles de entradas con búsqueda rápida; por eso PF la usa para listas de bloqueo, bogons y cualquier cosa que cambie más a menudo que las reglas.</p>
<p>En <code>pf.conf</code>:</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-text" data-lang="text"><span class="line"><span class="cl">table &lt;blocklist&gt; persist file &#34;/etc/pf/blocklist.txt&#34;
</span></span><span class="line"><span class="cl">block in quick from &lt;blocklist&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>persist</code> mantiene la tabla aunque ninguna regla la use en ese momento; <code>file</code> la carga desde un archivo (una IP o red por línea).</p>
<h2 id="comandos">Comandos</h2>
<p>Todos con la forma <code>pfctl -t &lt;tabla&gt; -T &lt;comando&gt;</code>:</p>
<table>
  <thead>
      <tr>
          <th>Comando</th>
          <th>Qué hace</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>show</code></td>
          <td>Lista las entradas. Con <code>-v</code>, contadores por entrada (paquetes/bytes in/out)</td>
      </tr>
      <tr>
          <td><code>add &lt;ip|red&gt; …</code></td>
          <td>Añade una o varias entradas</td>
      </tr>
      <tr>
          <td><code>delete &lt;ip|red&gt; …</code></td>
          <td>Quita entradas</td>
      </tr>
      <tr>
          <td><code>test &lt;ip&gt; …</code></td>
          <td>Dice si la dirección cae dentro de la tabla (sin tocarla)</td>
      </tr>
      <tr>
          <td><code>flush</code></td>
          <td>Vacía la tabla; la tabla sigue existiendo</td>
      </tr>
      <tr>
          <td><code>kill</code></td>
          <td>Borra la tabla entera (si no la usa ninguna regla)</td>
      </tr>
      <tr>
          <td><code>replace -f &lt;archivo&gt;</code></td>
          <td>Sustituye el contenido completo por el del archivo, en una sola operación</td>
      </tr>
      <tr>
          <td><code>expire &lt;segundos&gt;</code></td>
          <td>Borra las entradas cuyos contadores llevan más de N segundos sin actividad</td>
      </tr>
      <tr>
          <td><code>zero</code></td>
          <td>Pone a cero los contadores de la tabla (o de una entrada, si la indicas)</td>
      </tr>
  </tbody>
</table>
<p>Y sin <code>-t</code>:</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><span class="lnt">3
</span><span class="lnt">4
</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">pfctl -sT                    <span class="c1"># nombres de todas las tablas</span>
</span></span><span class="line"><span class="cl">pfctl -vvsT                  <span class="c1"># info global por tabla: entradas, evaluaciones, referencias</span>
</span></span><span class="line"><span class="cl">pfctl -T load -f /etc/pf.conf   <span class="c1"># recarga solo las definiciones de tabla del pf.conf</span>
</span></span><span class="line"><span class="cl">pfctl -sr <span class="p">|</span> grep <span class="s1">&#39;&lt;nombre&gt;&#39;</span>  <span class="c1"># qué reglas usan una tabla</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="tablas-en-pfsense">Tablas en pfSense</h2>
<ul>
<li><strong>Los aliases son tablas.</strong> Un alias de tipo Host, Network o URL Table llamado <code>Admins</code> existe en PF como <code>&lt;Admins&gt;</code>; <code>pfctl -t Admins -T show</code> te enseña lo que resolvió pfSense, incluidos los FQDN que ya convirtió a IPs.</li>
<li><strong><code>sshguard</code></strong>: donde caen las IPs bloqueadas por intentos de login fallidos a SSH o a la webGUI. Si te bloqueaste a ti mismo, <code>pfctl -t sshguard -T flush</code> (documentado por Netgate en <a href="https://docs.netgate.com/pfsense/en/latest/troubleshooting/locked-out.html">Locked out of the WebGUI</a>).</li>
<li><strong><code>virusprot</code></strong>: hosts bloqueados por superar los límites <em>Max. src. conn. rate</em> o <em>Max. states</em> de una regla. <code>pfctl -t virusprot -T show</code> y <code>-T delete &lt;ip&gt;</code> para soltar a uno.</li>
<li><strong><code>snort2c</code></strong>: bloqueos de Snort/Suricata en modo legacy. <code>-T flush</code> para desbloquear todo.</li>
<li><strong><code>bogons</code> / <code>bogonsv6</code></strong>: las listas que se actualizan solas cuando activas <em>Block bogon networks</em> en una interfaz.</li>
<li><strong>pfBlockerNG</strong>: cada lista es un alias <code>pfB_*</code>. Para saber si una IP está bloqueada por alguna: <code>pfctl -t pfB_Top_v4 -T test 203.0.113.7</code>.</li>
</ul>
<p>En OPNsense la mecánica es la misma (<code>pfctl -sT</code> para ver los nombres); la tabla de bloqueo por login se llama <code>sshlockout</code>.</p>
<h2 id="lo-que-se-pierde-al-recargar">Lo que se pierde al recargar</h2>
<p>Cualquier <code>-T add</code>, <code>-T delete</code> o <code>-T flush</code> vive hasta la siguiente <strong>recarga del filtro</strong>: guardar casi cualquier cosa en la GUI, <code>Filter Reload</code> en Status → Filter Reload, o el cron de actualización de aliases. En ese momento pfSense regenera cada tabla desde su alias y tus cambios a mano desaparecen. Para que algo sea permanente, edita el alias; para pruebas rápidas y desbloqueos, <code>pfctl</code> es perfecto.</p>
<h2 id="más-allá-de-las-tablas">Más allá de las tablas</h2>
<p>Lo que más se usa junto a lo anterior:</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><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</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">pfctl -sr                    <span class="c1"># reglas cargadas (con -vv, contadores y números de regla)</span>
</span></span><span class="line"><span class="cl">pfctl -ss                    <span class="c1"># tabla de estados</span>
</span></span><span class="line"><span class="cl">pfctl -si                    <span class="c1"># estadísticas globales</span>
</span></span><span class="line"><span class="cl">pfctl -k 192.168.1.10        <span class="c1"># matar los estados de un host</span>
</span></span><span class="line"><span class="cl">pfctl -F states              <span class="c1"># matar todos los estados (corta todas las conexiones)</span>
</span></span><span class="line"><span class="cl">pfctl -d / pfctl -e          <span class="c1"># desactivar / activar PF (sin PF no hay NAT: úsalo solo para salir de un bloqueo)</span>
</span></span><span class="line"><span class="cl">pfctl -nf /etc/pf.conf       <span class="c1"># comprobar sintaxis sin cargar</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Referencia completa: <a href="https://www.openbsdhandbook.com/pf/cheat_sheet/">pfctl cheat sheet</a> del OpenBSD Handbook y <code>man pfctl</code> en FreeBSD.</p>
]]></content:encoded></item></channel></rss>