<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ipv4 | JesusMarin.Dev</title><link>https://jesusmarin.dev/tags/ipv4/</link><description/><generator>Hugo 0.160.1</generator><language>es</language><managingEditor>contacto [ a T ] jesusmarin.dev (Jesus Marin)</managingEditor><webMaster>contacto [ a T ] jesusmarin.dev (Jesus Marin)</webMaster><lastBuildDate>Sun, 31 May 2026 16:01:25 +0000</lastBuildDate><atom:link href="https://jesusmarin.dev/tags/ipv4/" rel="self" type="application/rss+xml"/><item><title>Cómo obtener IPv6 si tu ISP solo ofrece IPv4 bajo CGNAT</title><link>https://jesusmarin.dev/blog/como-obtener-ipv6-cuando-tu-isp-solo-ofrece-ipv4-bajo-cgnat/</link><description>Obten IPv6 para los equipos de tu red cuando tu ISP solo te ofrece IPv4.</description><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">&lt;![CDATA[<p>Desde que adquirí mi primera Raspberry Pi por allá en el 2016 para crear mi propio NAS casero con un disco duro de 2TB, me quedé enganchado con el mundo del self-hosting. Desde ese entonces ya ha pasado mucho tiempo y el intentar alojar aplicaciones en mi propia red ha hecho que aprenda por mi cuenta cómo funciona realmente internet y también cómo funcionan las redes.</p><p>Una de las cosas que son como la piedra en el camino al momento de alojar tus propios servicios en tu red es cómo hacerlos accesibles a internet. Esto se debe a que, si tienes internet residencial por fibra, es cada vez más común que tu ISP te entregue una sola dirección IPv4 compartida tras CGNAT y ninguna dirección IPv6. Esto tiene dos consecuencias graves:</p><ol><li>Tus dispositivos no son accesibles desde internet<strong>sin trucos</strong> (el port forwarding no existe si no tienes IP pública real).</li><li>No puedes conectarte a servicios o dispositivos que<strong>solo tienen IPv6</strong> (¿algún proveedor VPS te da descuento si usas un VPS con solo IPv6? pues no lo puedes conectarte a el si solo tienes IPv4).</li></ol><p>La solución “correcta” sería que tu ISP te dé una IPv4 pública fija, pero esto puede ser costoso (la última vez que le consulté a mi ISP, me cobraba 10 USD/mes) debido a la escasez de IPv4; además, no todos los ISPs ofrecen esta opción a usuarios residenciales.</p><p>La otra solución “correcta” sería que tu ISP habilitara IPv6. Pero de nuevo, muchos no lo ofrecen todavía o se niegan. Así que no toca otra más que ser ingeniosos.</p><p>No soy precisamente un experto en redes, pero dado que me gusta aprender por mi cuenta, me he cruzado con muchos artículos, foros de self-hosting y redes sociales en donde a menudo, al indagar sobre las limitaciones como esta, me encontraba con la frase “IPv6 tunneling”.</p><p>Al investigar más sobre el tema y con la ayuda de la IA para mejorar y acelerar la investigación, entendí por fin cuál era la solución que podría servirme para lograr la meta de tener IPv6 pública en mi red local.</p><h3 id="la-solución-un-túnel-wireguard-desde-un-vps-con-ipv6">La solución: un túnel WireGuard desde un VPS con IPv6</h3><p>La idea es bastante sencilla:</p><ol><li>Contratas un<strong>VPS con un prefijo IPv6 ruteado</strong> (mínimo /56, idealmente /48).</li><li>Creas un<strong>túnel WireGuard</strong> entre ese VPS y tu router doméstico.</li><li>El VPS reenvía el prefijo IPv6 a través del túnel, y tu router lo distribuye a tus VLANs.</li></ol><p>Resultado:<strong>tu red local obtiene direcciones IPv6 globales ruteables</strong> sin que tu ISP haga nada.</p><p>Antes de continuar, es bueno que explique mi caso de uso para que lo que viene a continuación tenga más sentido.
Mi router es lo que llaman un Firewall Appliance, básicamente palabras bonitas para una mini PC con muchos puertos de red. Este router ejecuta OPNsense 26 y mi red local consta de alrededor de 8 VLAN IPv4 (privadas, lógicamente) e IPv6 ULA (son similares a las IPv4 privadas de una red local).</p><p>También debo destacar que, de momento, mi intención es que solo algunos dispositivos de mi red, más en específico, solo dos de mis VLAN, obtengan IPv6 GUA. Estos dispositivos son básicamente algunos contenedores LXC gestionados por un servidor Proxmox y algunos otros dispositivos en otra VLAN.</p><hr><h2 id="paso-1-conseguir-un-vps-con-ipv6">Paso 1: Conseguir un VPS con IPv6</h2><p>Cualquier proveedor que ofrezca prefijo IPv6 ruteado funciona. En mi caso tengo años usando<a href="https://buyvm.net">BuyVM</a> en Miami el cual ya me ofrece un prefijo IPv6 /48 ruteada sin que se lo pida, pero he escuchado que alternativas como AdvinServers o Clouvider son tambien muy buenas y recomendables.</p><p><strong>Verifica antes de comprar:</strong></p><ul><li>El VPS tiene al menos una IPv6 activa.</li><li>Tiene un<strong>prefijo ruteado</strong> (por ejemplo<code>2803:d760:c01::/48</code>).</li><li>Puede depender del proveedor, pero con BuyVM tuve que asegurarme que la IPv6 del VPS está configurada como<strong>Next Hop Address</strong> para el prefijo ruteado.</li></ul><p>En BuyVM todo esto se verifica en el panel de control del proveedor, en la sección de networking. para otros
proveedores puede ser distinto o habria que consultarle a soporte.</p><h2 id="paso-2-configurar-el-vps">Paso 2: Configurar el VPS</h2><h3 id="paso-21-activar-forwarding-de-paquetes">Paso 2.1: Activar forwarding de paquetes</h3><p>Crea<code>/etc/sysctl.d/99-wireguard-forward.conf</code>:</p><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1">1</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2">2</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3">3</a></span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>net.ipv4.ip_forward<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span></span></span><span style="display:flex;"><span>net.ipv6.conf.all.forwarding<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span></span></span><span style="display:flex;"><span>net.ipv6.conf.default.forwarding<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span></span></span></code></pre></td></tr></table></div></div><p>Y aplica con<code>sudo sysctl -p</code>.</p><h3 id="paso-22-configurar-el-firewall-con-nftables">Paso 2.2: Configurar el firewall con nftables</h3><p>Necesitas permitir tráfico UDP al puerto de WireGuard y el tráfico ICMPv6 esencial:</p><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"> 1</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"> 2</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"> 3</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"> 4</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"> 5</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-6"> 6</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-7"> 7</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-8"> 8</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-9"> 9</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-10">10</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-11">11</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-12">12</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-13">13</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-14">14</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-15">15</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-16">16</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-17">17</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-18">18</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-19">19</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-20">20</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-21">21</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-22">22</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-23">23</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-24">24</a></span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/sbin/nft -f</span></span></span><span style="display:flex;"><span>flush ruleset</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>table inet filter<span style="color:#f92672">{</span></span></span><span style="display:flex;"><span> chain input<span style="color:#f92672">{</span></span></span><span style="display:flex;"><span> type filter hook input priority filter; policy drop;</span></span><span style="display:flex;"><span> iifname<span style="color:#e6db74">"lo"</span> accept</span></span><span style="display:flex;"><span> udp dport<span style="color:#ae81ff">5050</span> accept<span style="color:#75715e"># WireGuard</span></span></span><span style="display:flex;"><span> icmp type echo-request accept</span></span><span style="display:flex;"><span> icmp type echo-reply accept</span></span><span style="display:flex;"><span> ct state established,related accept</span></span><span style="display:flex;"><span> meta nfproto ipv6 icmpv6 type<span style="color:#f92672">{</span></span></span><span style="display:flex;"><span> destination-unreachable, packet-too-big, time-exceeded,</span></span><span style="display:flex;"><span> parameter-problem, echo-reply, echo-request,</span></span><span style="display:flex;"><span> nd-router-solicit, nd-router-advert,</span></span><span style="display:flex;"><span> nd-neighbor-solicit, nd-neighbor-advert</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span> accept</span></span><span style="display:flex;"><span> ip6 saddr fe80::/10 icmpv6 type<span style="color:#f92672">{</span></span></span><span style="display:flex;"><span> 130, 131, 132, 143, 151, 152,<span style="color:#ae81ff">153</span></span></span><span style="display:flex;"><span><span style="color:#f92672">}</span> accept</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span></span></span><span style="display:flex;"><span> chain forward<span style="color:#f92672">{</span> type filter hook forward priority filter;<span style="color:#f92672">}</span></span></span><span style="display:flex;"><span> chain output<span style="color:#f92672">{</span> type filter hook output priority filter;<span style="color:#f92672">}</span></span></span><span style="display:flex;"><span><span style="color:#f92672">}</span></span></span></code></pre></td></tr></table></div></div><figure><blockquote class="blockquote"><p><strong>Nota importante:</strong> No necesitas masquerade/NAT. El /48 es un prefijo ruteado, no una dirección compartida.</p></blockquote></figure><h3 id="paso-23-instalar-wireguard-y-generar-claves">Paso 2.3: Instalar WireGuard y generar claves</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt install wireguard</span></span><span style="display:flex;"><span>wg genkey | tee /etc/wireguard/private.key | wg pubkey &gt; /etc/wireguard/public.key</span></span></code></pre></div><p>Guarda las claves publicas y privadas, las vamos a usar mas adelante.</p><h3 id="paso-24-crear-la-configuración-de-wireguard">Paso 2.4: Crear la configuración de WireGuard</h3><p>Crea<code>/etc/wireguard/wg0.conf</code>:</p><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1"> 1</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-2"> 2</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-3"> 3</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-4"> 4</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-5"> 5</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-6"> 6</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-7"> 7</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-8"> 8</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-9"> 9</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-10">10</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-11">11</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-12">12</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-13">13</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-14">14</a></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-15">15</a></span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[Interface]</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">PrivateKey</span><span style="color:#f92672">=</span><span style="color:#e6db74">&lt;tu_clave_privada&gt;</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">Address</span><span style="color:#f92672">=</span><span style="color:#e6db74">2803:d760:c01:0::1/64</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">ListenPort</span><span style="color:#f92672">=</span><span style="color:#e6db74">5050</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#a6e22e">PostUp</span><span style="color:#f92672">=</span><span style="color:#e6db74">nft add table ip6 wireguard</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">PostUp</span><span style="color:#f92672">=</span><span style="color:#e6db74">nft 'add chain ip6 wireguard forward { type filter hook forward priority 0; policy accept; }'</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">PostUp</span><span style="color:#f92672">=</span><span style="color:#e6db74">nft add rule ip6 wireguard forward iifname "wg0" accept</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">PostUp</span><span style="color:#f92672">=</span><span style="color:#e6db74">nft add rule ip6 wireguard forward oifname "wg0" accept</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">PostDown</span><span style="color:#f92672">=</span><span style="color:#e6db74">nft delete table ip6 wireguard</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#66d9ef">[Peer]</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">PublicKey</span><span style="color:#f92672">=</span><span style="color:#e6db74">&lt;clave_publica_del_router&gt; #La generas en Opnsense, paso 3.1</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">AllowedIPs</span><span style="color:#f92672">=</span><span style="color:#e6db74">2803:d760:c01::/48</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">PersistentKeepalive</span><span style="color:#f92672">=</span><span style="color:#e6db74">25</span></span></span></code></pre></td></tr></table></div></div><p><strong>Divide tu prefijo /48 en /64 por VLAN:</strong></p><table><thead><tr><th>Prefijo /64</th><th>Uso</th></tr></thead><tbody><tr><td><code>2803:d760:c01:0::/64</code></td><td>Enlace WireGuard (VPS ↔ Router)</td></tr><tr><td><code>2803:d760:c01:1::/64</code></td><td>VLAN LAN</td></tr><tr><td><code>2803:d760:c01:2::/64</code></td><td>VLAN Proxmox</td></tr><tr><td><code>2803:d760:c01:XX::/64</code></td><td>Cada VLAN adicional</td></tr></tbody></table><p>Activa el túnel:</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl enable --now wg-quick@wg0</span></span></code></pre></div><p>Recomiendo reiniciar el VPS para verificar que todo arranca automáticamente.</p><hr><h2 id="paso-3-configurar-opnsense-desde-tu-red-local">Paso 3: Configurar OPNsense desde tu red local</h2><h3 id="paso-31-crear-la-instancia-wireguard">Paso 3.1: Crear la instancia WireGuard</h3><p>Ve a<strong>VPN &gt; WireGuard &gt; Instances</strong> y agrega:</p><ul><li><strong>Name:</strong><code>v6lan</code> (o el nombre que prefieras)</li><li><strong>Public Key:</strong> genera una nueva con el icono de engranaje. copiala en el<code>wg0.conf</code> del<strong>paso 2.4</strong></li><li><strong>Tunnel Address:</strong><code>2803:d760:c01:0::2/128</code></li></ul><p>El resto lo dejamos sin modificar.<strong>Peers</strong> va a sufrir un cambio pero eso sera cuando hayamos creado ya el Peer en el siguiente caso.</p><h3 id="paso-32-crear-el-peer">Paso 3.2: Crear el Peer</h3><p>Ve a<strong>VPN &gt; WireGuard &gt; Peers</strong> y agrega:</p><ul><li><strong>Name:</strong><code>miabuy</code></li><li><strong>PublicKey:</strong> la clave pública del VPS (la que mencione mas arriba que guardaras en el<strong>paso 2.3</strong>)</li><li><strong>Allowed IPs:</strong><code>::/0</code> (todo el tráfico IPv6 por el túnel)</li><li><strong>Endpoint address:</strong> la IPv4 pública del VPS</li><li><strong>Endpoint Port:</strong><code>5050</code></li><li><strong>Instances:</strong> Acá elegimos la instancia recientemente creada en el paso anterior, en nuestro caso<strong>v6vlan</strong></li><li><strong>Keepalive interval:</strong><code>25</code></li></ul><h3 id="paso-33-asignar-la-interfaz">Paso 3.3: Asignar la interfaz</h3><p>Ve a<strong>Interfaces &gt; Assignments</strong>, selecciona<code>wg0</code> en &ldquo;Assign a new interface&rdquo; y dale a<strong>Add</strong>.</p><p>Con esto deberíamos poder ver la interfaz en el listado<strong>Interfaces</strong>, seleccionamos la que hemos creado, la habilitamos y dejamos el resto como está. No necesitamos agregar más nada, ya que la configuración de esta interfaz se hace por WireGuard automáticamente.</p><p>Regresa a<strong>VPN &gt; WireGuard</strong> y dale a<strong>Enable WireGuard</strong>. Verifica en<strong>Status</strong> que tanto Instance como Peer muestren<strong>UP</strong> (check verde).</p><h3 id="paso-34-agregar-el-gateway-ipv6">Paso 3.4: Agregar el Gateway IPv6</h3><p>Ve a<strong>System &gt; Gateways &gt; Configuration</strong> y agrega:</p><ul><li><strong>Name:</strong><code>wg_vps</code></li><li><strong>Interface:</strong> la interfaz WireGuard</li><li><strong>Address Family:</strong><code>IPv6</code></li><li><strong>Priority:</strong><code>255</code></li><li><strong>IP Address:</strong><code>2803:d760:c01:0::1</code> (la IP del VPS en el túnel)</li><li><strong>Upstream Gateway:</strong> habilitado</li></ul><h3 id="paso-35-asignar-prefijos-64-a-cada-vlan">Paso 3.5: Asignar prefijos /64 a cada VLAN</h3><p>Dado que actualmente tengo configurado IPv6 ULA (Unique Local Address) en varias de mis VLANs,
no puedo agregar el prefijo /64 GUA (Global Unicast Address) a la interface de mi Vlan debido a
que ya está configurada con el prefijo /64 ULA. Es por esta razón que debemos agregar
dicho prefijo GUA como<strong>IP virtual</strong>.</p><p>Ve a<strong>Interfaces &gt; Virtual IPs &gt; Settings</strong> y agrega por cada VLAN:</p><ul><li><strong>Mode:</strong> IP Alias</li><li><strong>Interface:</strong> la VLAN correspondiente</li><li><strong>Network:</strong> el /64 asignado (ej.<code>2803:d760:c01:2::1/64</code>)</li><li><strong>Description:</strong> algo como:<code>IPv6 publica desde miabuy para VLAN X</code></li></ul><p>Repite para cada VLAN que necesite IPv6.</p><h3 id="paso-36-configurar-dnsmasq-ra--slaac">Paso 3.6: Configurar DNSmasq (RA + SLAAC)</h3><p>Dado que Opnsense 26 en adelante, por defecto usa Dnsmasq para la gestión DHCP y debido a que ya estoy
usando la función RA de Dnsmasq para las IPv6 ULA, solo necesitaríamos verificar o hacer un
ajuste para que los dispositivos en esta vlan puedan obtener IPv6 GUA del prefijo /64 asignado.</p><p>Ve a<strong>Services &gt; Dnsmasq DNS &amp; DHCP &gt; DHCP Range</strong>, selecciona la interfaz de la VLAN y verifica:</p><ul><li><strong>Start address:</strong><code>::1000</code></li><li><strong>End address:</strong><code>::fffe</code></li><li><strong>RA mode:</strong><code>ra-stateless</code> +<code>slaac</code></li></ul><p>Esto permite que los dispositivos obtengan IPv6 automáticamente.</p><h3 id="paso-37-reglas-de-firewall-por-vlan">Paso 3.7: Reglas de firewall por VLAN</h3><p>De momento quiero que mis dispositivos con IPv6 GUA puedan acceder a internet con dichas IPv6, pero no quiero que estos dispositivos sean accesibles desde internet mediante estas IPv6.</p><p>En<strong>Firewall &gt; Rules [new] &gt; [Tu Interfaz VLAN]</strong>, agrega en orden:</p><p><strong>A) ICMPv6 permitido:</strong></p><ul><li><strong>Description:</strong> algo como Permitir Ping ICMPv6 en IPv6 de miabuy</li><li><strong>Interface:</strong> La interfaz a la cual se aplicara la regla.</li><li><strong>Action:</strong> Pass</li><li><strong>Direction:</strong> In</li><li><strong>Version:</strong> IPv6</li><li><strong>Protocol:</strong> ICMP</li><li><strong>ICMP type:</strong> Any</li><li><strong>Source:</strong> Any</li><li><strong>Source port:</strong> Any</li><li><strong>Destination:</strong> Any</li><li><strong>Destination port:</strong> Any</li></ul><p><strong>B) Salida a internet:</strong></p><ul><li><strong>Description:</strong> algo como Permitir salida IPv6 a internet para Vlan X</li><li><strong>Interface:</strong> La interfaz a la cual se aplicara la regla</li><li><strong>Action:</strong> Pass</li><li><strong>Direction:</strong> In</li><li><strong>Version:</strong> IPv6</li><li><strong>Protocol:</strong> Any</li><li><strong>Source:</strong> Pve Network</li><li><strong>Source port:</strong> Any</li><li><strong>Destination:</strong> Any</li><li><strong>Destination port:</strong> Any</li></ul><p><strong>C) Bloqueo entrante por defecto:</strong></p><ul><li><strong>Description:</strong> algo como Bloquear IPv6 entrante no solicitado</li><li><strong>Interface:</strong> La interfaz a la cual se aplicara la regla</li><li><strong>Action:</strong> Block</li><li><strong>Direction:</strong> In</li><li><strong>Version:</strong> IPv6</li><li><strong>Protocol:</strong> Any</li><li><strong>Source:</strong> Any</li><li><strong>Source port:</strong> Any</li><li><strong>Destination:</strong> Any</li><li><strong>Destination port:</strong> Any</li></ul><p>Si en el futuro quiero exponer un servicio específico de un contenedor (por ejemplo el puerto<code>443</code> de un
contenedor con IP<code>2803:4f10:5:1::abc</code>), solo se añade en la interfaz<strong>v6lan</strong> (la interfaz Wireguard) una
regla puntual:<code>Pass IPv6 TCP, destination 2803:4f10:5:1::abc port 443</code>.</p><hr><h2 id="verificar-que-funciona">Verificar que funciona</h2><p>Desde cualquier dispositivo con IPv6 de tu red:</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ip -6 addr show<span style="color:#75715e"># Deberías ver la IPv6 asignada</span></span></span><span style="display:flex;"><span>ping6 -c<span style="color:#ae81ff">4</span> ipv6.google.com<span style="color:#75715e"># Verificar conectividad</span></span></span><span style="display:flex;"><span>curl -6 ifconfig.co/json<span style="color:#75715e"># Mostrar tu IPv6 pública</span></span></span></code></pre></div><hr><h2 id="conclusión">Conclusión</h2><p>El resultado es el mismo que si tu ISP te diera IPv6 nativo:<strong>tus dispositivos pueden acceder directamente a internet por IPv6</strong>, sin NAT, sin restricciones de CGNAT. Y lo mejor: tu ISP no tiene nada que ver.</p><p>Cabe destacar que como todo, esto tiene sus ventajas y desventajas:</p><h3 id="ventajas">Ventajas</h3><ul><li><strong>IPv6 nativo en toda la red:</strong> Todas tus VLANs, incluyendo las que no tienen cliente de VPN, obtienen direcciones IPv6 globales (GUA).</li><li><strong>Sin overhead de encapsulación:</strong> El tráfico es IPv6 real, sin bytes adicionales de túnel.</li><li><strong>Servicios directamente accesibles:</strong> Puedes exponer servicios web, juegos, cámaras, etc. a internet por IPv6 sin configuraciones complejas.</li><li><strong>Independencia del ISP:</strong> Tu proveedor de internet no necesita hacer nada. No dependes de su voluntad de habilitar IPv6.</li><li><strong>Escalable:</strong> El prefijo /48 te da 65,536 subredes /64. Puedes asignar una a cada VLAN, cada dispositivo, o cada servicio.</li><li><strong>Costo bajo:</strong> Un VPS económico con IPv6 es suficiente. No necesitas infraestructria compleja.</li><li><strong>Estándar abierto:</strong> WireGuard es un protocolo abierto, auditado y ampliamente adoptado.</li></ul><h3 id="desventajas">Desventajas</h3><ul><li><strong>Dependencia de un VPS externo:</strong> Si el VPS cae, pierdes IPv6 hasta que se recupere. Necesitas un proveedor confiable con buen uptime.</li><li><strong>Latencia adicional:</strong> El tráfico que va y viene del VPS añade latencia. Para servicios locales no afecta, pero si expones servicios, el tráfico entra desde el VPS.</li><li><strong>Tu IPv6 es pública:</strong> Cualquier persona en internet puede hacer ping a tus direcciones. Requiere firewall bien configurado.</li><li><strong>No resuelve IPv4:</strong> Solo entrega IPv6. Si necesitas IP pública IPv4, esto no ayuda.</li><li><strong>Configuración inicial compleja:</strong> Requiere conocimientos de redes, routing, firewalls y VPN. No es plug-and-play. Aunque es divertido y aprendes mucho en el proceso.</li><li><strong>Tu VPS consume ancho de banda del túnel:</strong> Si en algún momento enrutas tráfico general por el túnel (no solo como distribución de prefijo), el ancho de banda del VPS se convierte en cuello de botella.</li><li><strong>Responsabilidad de seguridad:</strong> Tú eres responsable de configurar correctamente el firewall. Un error puede exponer tu red local innecesariamente.</li></ul>
]]></content:encoded><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://jesusmarin.dev/blog/como-obtener-ipv6-cuando-tu-isp-solo-ofrece-ipv4-bajo-cgnat/</guid><category>ipv6</category><category>ipv4</category><category>cgnat</category><category>wireguard</category></item></channel></rss>