VPNSmith
self-host-vpnINFO

WireGuard AllowedIPs: un campo que hace dos trabajos (y por qué el tuyo está mal)

AllowedIPs no es una ruta. El manual de wg dice que decide a la vez qué tráfico se acepta DESDE un par y qué tráfico se le envía. Ese doble papel explica el handshake que funciona sin tráfico, los pares que no pueden solaparse y por qué no puedes restar tu red local.

Por Eric Gerard · Fundador · VPNSmith - Especialista en VPN self-host y VPS GDPR4 min de lecturaPhoto via Pexels

Casi todos los problemas de configuración de WireGuard que sobreviven a un handshake correcto se reducen a un solo campo, y al hecho de que casi nadie lo lee bien. AllowedIPs parece una directiva de enrutamiento. Lo es, y al mismo tiempo es otra cosa.

Lo que dice realmente el manual

El manual de wg lo define en una frase que conviene leer despacio:

a comma-separated list of IP (v4 or v6) addresses with CIDR masks from which incoming traffic for this peer is allowed and to which outgoing traffic for this peer is directed

Dos oraciones, dos trabajos distintos. Saliente: los paquetes cuyo destino cae en esa lista se envían a ese par. Es la mitad de enrutamiento, la que todo el mundo conoce. Entrante: los paquetes que llegan de ese par solo se aceptan si su dirección origen cae en la misma lista. Es una lista de control de acceso, y es la mitad que se ignora.

Esto es lo que WireGuard llama cryptokey routing: la asociación entre una clave pública y un conjunto de direcciones constituye todo el modelo de autorización. No hay ninguna regla de cortafuegos aparte que decida qué par puede reclamar qué dirección.

La consecuencia que nadie prevé

Pon AllowedIPs = 0.0.0.0/0 en un par y no solo has enrutado todo tu tráfico hacia él. También has declarado que ese par puede enviarte un paquete que diga venir de cualquier dirección origen de internet, y tu interfaz lo aceptará.

En un cliente cuyo único par es tu propio servidor, eso es justo lo que quieres y es la configuración normal de túnel completo. En un servidor con varios pares, o en cualquier máquina donde un par no sea de plena confianza, es un agujero abierto sin darte cuenta.

Primer plano en blanco y negro de buzones metálicos numerados, con los números 31 a 40 escritos a mano en pequeñas etiquetas. Cada buzón tiene exactamente un número y ninguno se repite: esa es la restricción que AllowedIPs impone entre pares.
Primer plano en blanco y negro de buzones metálicos numerados, con los números 31 a 40 escritos a mano en pequeñas etiquetas. Cada buzón tiene exactamente un número y ninguno se repite: esa es la restricción que AllowedIPs impone entre pares.

Por qué dos pares nunca pueden compartir un rango

Como la lista decide a qué par se envía un destino, una misma dirección no puede pertenecer a dos pares a la vez: la correspondencia tiene que ser inequívoca. En la práctica, por eso en el lado servidor cada cliente recibe su propio /32 (o /128 en IPv6) en lugar de toda la subred.

La asimetría sorprende. En el cliente, AllowedIPs describe lo que quieres alcanzar por el túnel, a menudo todo. En el servidor, describe quién puede ser ese par concreto, normalmente una sola dirección. El mismo campo, leído desde dos extremos, significa dos cosas distintas.

El problema de excluir la red local, y por qué la resta no existe

La pregunta real más frecuente es "cómo enruto todo menos mi red local". No existe sintaxis de resta. 0.0.0.0/0 menos 192.168.1.0/24 no se puede expresar, porque el campo es una lista de rangos y nada más.

La respuesta es enumerar el complemento: en vez de un comodín, listas los bloques CIDR que juntos cubren todo el espacio de direcciones salvo el rango que quieres mantener local. Es ingrato, produce una línea larga, y es la única forma correcta. Los comodines están documentados sin ambigüedad: 0.0.0.0/0 corresponde a todas las direcciones IPv4 y ::/0 a todas las IPv6.

El síntoma que lleva hasta aquí

Un handshake que se completa, y después nada. wg show muestra un handshake reciente, los pares claramente se encontraron, y no pasa tráfico. Cuando el handshake funciona, las claves y el extremo son correctos por definición: el problema está aguas abajo, y AllowedIPs es el primer sitio donde mirar. O el destino no está en la lista del lado emisor, o el origen no se acepta en el lado receptor.

Si es el handshake el que nunca se completa, el diagnóstico es otro y nuestra guía de solución de problemas del handshake lo cubre. Y si los paquetes circulan pero las páginas se quedan a medias, probablemente estés ante un problema de MTU y no ante este campo.

No confundir con PersistentKeepalive

Se mezclan porque ambos aparecen en la sección del par y ambos parecen tratar de "mantener la conexión". No tienen relación. El manual describe PersistentKeepalive como un intervalo, entre 1 y 65535 segundos, que regula cada cuánto se envía un paquete vacío autenticado al par, para mantener válida una entrada de cortafuegos con estado o de NAT. Está desactivado por defecto, y el manual añade que la mayoría de usuarios no lo necesitará.

AllowedIPs decide qué está permitido. PersistentKeepalive decide con qué frecuencia llamas a la puerta para que una caja NAT no olvide que existes.

Hacerlo bien a la primera

Configura las entradas de par del servidor con una dirección por cliente y nada más. Configura el cliente con los rangos que realmente quieres alcanzar: los comodines para un túnel completo, las subredes concretas para un túnel dividido. Lee cada línea AllowedIPs dos veces: una como ruta, otra como lista de invitados. Nuestras plantillas de configuración listas para usar aplican esa separación.

El campo es pequeño, acepta casi todo lo que escribas y falla en silencio cuando está mal. Esa combinación es la razón por la que merece más atención de la que suele recibir.

★ Datacenter Núremberg GDPR · ✓ IPv4 dedicada incluida · 200+ Mbps garantizados

Aloja tu VPN en tu propio VPS → ContaboAcceso root completo · IPv4 pública · elige tu región

Preguntas frecuentes

¿Para qué sirve AllowedIPs en WireGuard?
Hace dos cosas a la vez. El manual de wg lo define como la lista de direcciones desde las que se permite el tráfico entrante de ese par, y hacia las que se dirige el tráfico saliente destinado a ese par. Es por tanto a la vez una regla de enrutamiento para lo que envías y una lista de control de acceso para lo que aceptas. La mayoría de errores vienen de leer solo la primera mitad.
¿Por qué mi handshake funciona y no pasa tráfico?
Porque el handshake solo demuestra que las claves y el extremo son correctos. Lo que ocurre después con los paquetes lo decide AllowedIPs. O el destino que intentas alcanzar no está listado en el lado emisor y nada entra en el túnel, o la dirección origen no está listada en el receptor y el paquete se descarta al llegar.
¿Pueden dos pares tener el mismo AllowedIPs?
No, y la razón es estructural, no una norma de orden. Como la lista decide a qué par se envía un destino dado, una dirección que perteneciera a dos pares haría ambigua la elección. Por eso cada cliente recibe normalmente su propio /32 en el lado servidor en vez de toda la subred.
¿Cómo excluyo mi red local del túnel?
Enumerando el complemento, porque el campo no tiene sintaxis de resta. En vez de un comodín, listas los bloques CIDR que cubren juntos todo el espacio de direcciones salvo el rango que quieres mantener local. El resultado es una línea larga y es la única forma correcta de expresarlo.
¿Qué diferencia hay entre AllowedIPs y PersistentKeepalive?
Resuelven problemas sin relación. AllowedIPs decide qué tráfico se permite en cada sentido. PersistentKeepalive es un intervalo, entre 1 y 65535 segundos, que regula cada cuánto se envía un paquete vacío autenticado para que siga válida una entrada de cortafuegos con estado o de NAT. Está desactivado por defecto y el manual señala que la mayoría no lo necesitará.