WireGuard en MikroTik: Configuración Completa Dual-Stack IPv4/IPv6
Configura WireGuard en MikroTik RouterOS con dual-stack IPv4/IPv6 completo. Accede a tu red doméstica con IPv6 nativo desde cualquier conexión.

WireGuard ha revolucionado la tecnología VPN con su simplicidad, velocidad y criptografía moderna. A diferencia de protocolos VPN tradicionales como OpenVPN o IPSec, WireGuard utiliza una base de código mínima (~4.000 líneas frente a más de 100.000) y primitivas criptográficas de última generación, tal como se describe en el whitepaper de WireGuard, lo que se traduce en conexiones más rápidas y menor latencia.
Esta guía muestra cómo configurar un WireGuard VPN listo para producción en MikroTik RouterOS con soporte dual-stack IPv4/IPv6. ¿El resultado? Puedes conectarte desde cualquier red —incluso sin IPv6— y disfrutar de conectividad IPv6 completa a través de tu router doméstico.
Lo que vas a construir
- Un servidor WireGuard VPN en MikroTik RouterOS con soporte completo dual-stack IPv4 + IPv6
- IPv6 mediante ULA + NAT66: los clientes VPN reciben direcciones ULA privadas traducidas al prefix global de tu ISP
- Reglas de firewall: input, forward, NAT/masquerade, MSS clamping y optimizaciones en la tabla RAW
- Soporte multi-cliente: cada dispositivo recibe claves únicas y un par de IPs dedicado (IPv4 + IPv6)
- Full tunnel o split tunnel: encamina todo el tráfico por la VPN o solo el de la red doméstica
- Probado en RouterOS 7.x con RB5009, pero aplicable a cualquier router MikroTik con soporte WireGuard
¿Por qué WireGuard en MikroTik?
| Característica | WireGuard | OpenVPN | IPSec/IKEv2 |
|---|---|---|---|
| Complejidad de código | ~4.000 líneas | ~100.000 líneas | ~400.000 líneas |
| Tiempo de conexión | 100ms | 3-10 segundos | 1-3 segundos |
| Carga de CPU | Muy baja | Alta (espacio de usuario) | Media |
| Criptografía | ChaCha20, Curve25519 | Configurable (varía) | AES, RSA/ECDH |
| Soporte de roaming | Transparente | Necesita reconexión | Limitado (MOBIKE) |
Visión general de la arquitectura
Nuestra configuración crea una VPN dual-stack en la que los clientes conectados reciben tanto dirección IPv4 como IPv6. El tráfico de los clientes se traduce mediante NAT (masquerade) para acceder a internet a través de tu conexión doméstica. Para más información, consulta la documentación oficial de WireGuard en MikroTik.
Esquema de direccionamiento
| Componente | Dirección IPv4 | Dirección IPv6 |
|---|---|---|
| Interface WireGuard (Router) | 192.168.100.1/24 | fd00:1111:2222:100::1/64 |
| Rango de clientes VPN | 192.168.100.2-254 | fd00:1111:2222:100::2-ffff |
| LAN doméstica | 192.168.0.0/24 | Prefix asignado por el ISP |
Requisitos previos
Paso 1: crear la interface WireGuard
Primero, creamos la interface WireGuard en el router MikroTik. El router generará un par de claves automáticamente.
/interface wireguard add \
name=wg_devices \
mtu=1500 \
listen-port=53537 \
comment="VPN for Mobile Devices"Obtener la public key del servidor
Tras crear la interface, obtén la public key para configurar los clientes:
Guarda el valor de public-key — lo necesitarás al configurar los dispositivos cliente.
Paso 2: asignar direcciones IP a la interface
La interface WireGuard necesita tanto dirección IPv4 como IPv6 para servir como gateway de los clientes VPN.
# IPv4 address for WireGuard interface
/ip address add \
address=192.168.100.1/24 \
interface=wg_devices \
network=192.168.100.0 \
comment="VPN Devices Network"
# IPv6 ULA address for WireGuard interface
/ipv6 address add \
address=fd00:1111:2222:100::1/64 \
interface=wg_devices \
advertise=no \
comment="VPN Devices IPv6 ULA"Paso 3: crear pool IPv6 (opcional)
Si quieres gestionar la asignación de direcciones IPv6 de forma centralizada, crea un pool:
/ipv6 pool add \
name=wg_devices_pool_global \
prefix=fd00:1111:2222:100::/64 \
prefix-length=64 \
comment="WireGuard Devices Global IPv6 Pool"Paso 4: añadir la interface a las listas de interfaces
MikroTik utiliza listas de interfaces para las reglas de firewall. Añadir WireGuard a las listas adecuadas garantiza una gestión correcta del tráfico.
# Add to VPN list for VPN-specific rules
/interface list member add \
interface=wg_devices \
list=VPN \
comment="VPN Devices"
# Add to LAN list to allow access to local resources
/interface list member add \
interface=wg_devices \
list=LAN \
comment="VPN Devices - LAN Access"Paso 5: configurar reglas de firewall
La configuración del firewall es crítica para la seguridad y la conectividad. Necesitamos reglas para:
- Aceptar tráfico WireGuard en el port de escucha
- Permitir a los clientes VPN acceder a internet
- Permitir a los clientes VPN acceder a las redes locales
- NAT/Masquerade para el tráfico saliente
Cadena input: aceptar conexiones WireGuard
# Allow WireGuard UDP port (IPv4)
/ip firewall filter add \
chain=input \
action=accept \
protocol=udp \
dst-port=53537 \
comment="WireGuard - Accept incoming connections"
# Allow WireGuard UDP port (IPv6)
/ipv6 firewall filter add \
chain=input \
action=accept \
protocol=udp \
port=53537 \
comment="Allow WireGuard"Cadena forward: permitir tráfico VPN
# FastTrack for established WireGuard connections (performance)
/ip firewall filter add \
chain=forward \
action=fasttrack-connection \
connection-state=established,related \
src-address-list=WireGuard \
comment="FastTrack for WireGuard Networks"
# Allow VPN clients to internet
/ip firewall filter add \
chain=forward \
action=accept \
src-address=192.168.100.0/24 \
out-interface-list=WAN \
comment="Allow WireGuard Devices to Internet"
# Allow return traffic from internet to VPN
/ip firewall filter add \
chain=forward \
action=accept \
connection-state=established,related \
dst-address=192.168.100.0/24 \
in-interface-list=WAN \
comment="Allow Internet to WireGuard Devices (replies)"
# Allow VPN clients to Home LAN
/ip firewall filter add \
chain=forward \
action=accept \
src-address=192.168.100.0/24 \
dst-address=192.168.0.0/24 \
comment="Allow WireGuard Devices to Home LAN"# Allow VPN clients all outbound IPv6 traffic
/ipv6 firewall filter add \
chain=forward \
action=accept \
in-interface=wg_devices \
comment="WireGuard Devices: Allow all outbound"
# Allow return IPv6 traffic to VPN clients
/ipv6 firewall filter add \
chain=forward \
action=accept \
connection-state=established,related \
out-interface=wg_devices \
comment="WireGuard Devices: Allow replies"Crear address list para redes WireGuard
/ip firewall address-list add \
list=WireGuard \
address=192.168.100.0/24 \
comment="WireGuard Devices Network"Paso 6: configurar NAT/Masquerade
Para que los clientes VPN accedan a internet, sus direcciones privadas deben traducirse (NAT) a tu IP pública.
# IPv4 Masquerade for WireGuard
/ip firewall nat add \
chain=srcnat \
action=masquerade \
src-address=192.168.100.0/24 \
out-interface-list=WAN \
comment="WireGuard Devices - Internet Access"
# IPv6 NAT66 for WireGuard (ULA to Global)
/ipv6 firewall nat add \
chain=srcnat \
action=masquerade \
src-address=fd00:1111:2222:100::/64 \
out-interface-list=WAN \
comment="WireGuard Devices - IPv6 Internet Access"Paso 7: configurar MSS clamping
El TCP Maximum Segment Size (MSS) clamping evita problemas de fragmentación en túneles VPN. La sobrecarga de WireGuard reduce el MTU efectivo, por lo que debemos ajustar el TCP MSS en consecuencia.
/ip firewall mangle add \
chain=forward \
action=change-mss \
protocol=tcp \
tcp-flags=syn \
tcp-mss=1349-65535 \
new-mss=1420 \
in-interface=wg_devices \
comment="WireGuard MSS clamping - Devices"Paso 8: configurar la tabla RAW para rendimiento
Omitir la protección contra flood para el tráfico WireGuard garantiza una conectividad fluida:
# IPv4: Skip flood protection for WireGuard
/ip firewall raw add \
chain=prerouting \
action=accept \
protocol=udp \
dst-port=53537 \
comment="WireGuard - Skip flood protection"
# IPv6: Skip flood protection for WireGuard
/ipv6 firewall raw add \
chain=prerouting \
action=accept \
protocol=udp \
dst-port=53537 \
comment="WireGuard - Skip flood protection"Paso 9: añadir peers WireGuard (clientes)
Ahora añadimos los dispositivos cliente. Cada cliente necesita:
- Direcciones IP únicas: una dirección IPv4 y una IPv6 dedicadas dentro de la subnet WireGuard
- Par de claves: private key y public key para autenticación
- Preshared key: opcional pero recomendada como capa adicional de cifrado
Crear un peer
Elige cómo generar las claves criptográficas. El enfoque recomendado deja que RouterOS genere todo automáticamente, pero también puedes pre-generar las claves en el dispositivo cliente.
Desde RouterOS 7.x, el router puede generar todas las claves criptográficas automáticamente. Es el enfoque más sencillo — el router crea la private key, calcula la public key y genera la preshared key en un solo comando.
Crear el peer con claves auto-generadas
/interface wireguard peers add \
interface=wg_devices \
name=wg_client1 \
private-key=auto \
preshared-key=auto \
allowed-address=192.168.100.2/32,fd00:1111:2222:100::2/128 \
persistent-keepalive=25s \
comment="Client 1 - Mobile"Establecer propiedades de configuración del cliente (opcional)
Estas propiedades definen la configuración del lado del cliente y habilitan la función de código QR en WinBox/WebFig:
/interface wireguard peers set wg_client1 \
client-address=192.168.100.2/32,fd00:1111:2222:100::2/128 \
client-dns=192.168.0.1,fd00:1111:2222:100::1 \
client-endpoint=your-domain.com:53537 \
client-allowed-address=0.0.0.0/0,::/0 \
client-keepalive=25Obtener claves para configuración manual del cliente
Si necesitas configurar el cliente manualmente en lugar de escanear el código QR, obtén las claves generadas desde el router:
# Client's private key → goes into client's [Interface] section
:put [/interface wireguard peers get [find name=wg_client1] private-key]
# Preshared key → goes into client's [Peer] section
:put [/interface wireguard peers get [find name=wg_client1] preshared-key]
# Server's public key → goes into client's [Peer] section
:put [/interface wireguard get [find name=wg_devices] public-key]Usa estos valores para completar el archivo de configuración del cliente en el Paso 10.
Genera las claves en el dispositivo cliente primero y luego añade el peer en el router usando la public key del cliente.
Generar claves en el cliente
Añadir peer en MikroTik
Usa la public key del cliente (no la private key) y la preshared key:
/interface wireguard peers add \
interface=wg_devices \
name=wg_client1 \
public-key="<CLIENT_PUBLIC_KEY>" \
preshared-key="<PRESHARED_KEY>" \
allowed-address=192.168.100.2/32,fd00:1111:2222:100::2/128 \
persistent-keepalive=25s \
comment="Client 1 - Mobile"La aplicación WireGuard para Windows genera las claves automáticamente al crear un nuevo tunnel.
- Descarga e instala WireGuard para Windows
- Abre la aplicación y haz clic en Add Tunnel → Add empty tunnel
- La aplicación genera un par de claves — copia la Public Key que aparece en la parte superior
- Genera una preshared key desde la línea de comandos:
Añadir peer en MikroTik
/interface wireguard peers add \
interface=wg_devices \
name=wg_client1 \
public-key="<CLIENT_PUBLIC_KEY>" \
preshared-key="<PRESHARED_KEY>" \
allowed-address=192.168.100.2/32,fd00:1111:2222:100::2/128 \
persistent-keepalive=25s \
comment="Client 1 - Mobile"| Parámetro | Valor | Propósito |
|---|---|---|
private-key | auto / ninguno | Auto-genera el par de claves en el router (método recomendado) |
public-key | Public key del cliente | Identifica y autentica al cliente |
preshared-key | auto / secreto compartido | Capa de cifrado simétrico adicional (seguridad post-cuántica) |
allowed-address | IP(s) del cliente | IPs que el cliente puede usar; también actúa como routing table |
persistent-keepalive | 25 segundos | Mantiene los mapeos NAT, permite conexiones entrantes |
Ejemplo: múltiples peers
Cada peer debe tener un par de claves único y direcciones IP únicas. Nunca reutilices claves entre dispositivos.
# Client 1 - Mobile Device (e.g., iPhone)
/interface wireguard peers add \
interface=wg_devices \
name=wg_phone \
private-key=auto \
preshared-key=auto \
allowed-address=192.168.100.2/32,fd00:1111:2222:100::2/128 \
persistent-keepalive=25s \
comment="Phone - Mobile VPN"
# Client 2 - Laptop (e.g., MacBook)
/interface wireguard peers add \
interface=wg_devices \
name=wg_laptop \
private-key=auto \
preshared-key=auto \
allowed-address=192.168.100.3/32,fd00:1111:2222:100::3/128 \
persistent-keepalive=25s \
comment="Laptop - Mobile VPN"
# Client 3 - Remote Site (Site-to-Site VPN)
/interface wireguard peers add \
interface=wg_devices \
name=wg_remote_site \
private-key=auto \
preshared-key=auto \
allowed-address=192.168.100.10/32,fd00:1111:2222:100::a/128 \
persistent-keepalive=25s \
comment="Remote Site - Site-to-Site"Paso 10: configuración del cliente
Ahora configura el dispositivo cliente. Si usaste el método de claves auto de RouterOS y estableciste las propiedades del cliente en el Paso 9, simplemente escanea el código QR desde WinBox/WebFig — no necesitas configuración manual.
Para la configuración manual, el formato del archivo de configuración es el mismo en todas las plataformas, pero el método de instalación varía.
Descarga la app WireGuard desde la App Store o Google Play. Puedes:
- Importar un archivo .conf o escanear un código QR
- Crear manualmente en la app
[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 192.168.100.2/32, fd00:1111:2222:100::2/128
DNS = 192.168.0.1, fd00:1111:2222:100::1
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
Endpoint = your-domain.com:53537
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25Instala WireGuard:
Crea el archivo de configuración:
[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 192.168.100.2/32, fd00:1111:2222:100::2/128
DNS = 192.168.0.1, fd00:1111:2222:100::1
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
Endpoint = your-domain.com:53537
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25Activa el tunnel:
- Descarga e instala WireGuard para Windows
- Abre la aplicación y haz clic en Add Tunnel → Import tunnel(s) from file (si tienes un archivo
.conf) o Add empty tunnel para pegar la configuración - Si lo creas desde cero, sustituye la configuración con:
[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 192.168.100.2/32, fd00:1111:2222:100::2/128
DNS = 192.168.0.1, fd00:1111:2222:100::1
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
Endpoint = your-domain.com:53537
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25- Haz clic en Save y luego en Activate
Opciones de configuración explicadas
| Parámetro | Descripción |
|---|---|
Address | Las direcciones IP asignadas a este cliente (tanto IPv4 como IPv6) |
DNS | Servidores DNS a utilizar. Puede ser tu router o cualquier servidor DNS accesible vía VPN |
Endpoint | La IP pública o nombre de dominio de tu router con el port de WireGuard |
AllowedIPs | 0.0.0.0/0, ::/0 encamina TODO el tráfico por la VPN. Usa subnets específicas para split tunnel |
Split tunnel vs full tunnel
Full tunnel — todo el tráfico pasa por la VPN:
- Oculta tu ubicación a todos los sitios web
- Mayor latencia para la navegación general
- Acceso IPv6 completo a través de la conexión doméstica
# Route ALL traffic through VPN
AllowedIPs = 0.0.0.0/0, ::/0Split tunnel — solo el tráfico a redes especificadas usa la VPN:
- Mejor rendimiento para el uso general de internet
- Acceso a la red doméstica sin encaminar todo el tráfico
# Only route home network traffic through VPN
AllowedIPs = 192.168.0.0/24, 192.168.100.0/24, fd00:1111:2222::/48Paso 11: verificar la conexión
Tras configurar ambos lados, prueba la conexión.
En el cliente
En el router MikroTik
Probar conectividad IPv6
Resumen completo de la configuración
Aquí está la configuración completa de RouterOS como referencia. Los valores marcados con # ← CUSTOMIZE deben sustituirse por los tuyos.
wireguard-complete.rsc
# ═══════════════════════════════════════════════════════════════════════════════
# WIREGUARD VPN - COMPLETE DUAL-STACK CONFIGURATION
# ═══════════════════════════════════════════════════════════════════════════════
# MikroTik RouterOS 7.x
# IPv4 + IPv6 dual-stack with full internet access
# ═══════════════════════════════════════════════════════════════════════════════
# ───────────────────────────────────────────────────────────────────────────────
# INTERFACE CONFIGURATION
# ───────────────────────────────────────────────────────────────────────────────
/interface wireguard add \
name=wg_devices \
mtu=1500 \
listen-port=53537 \
comment="VPN for Mobile Devices" # ← CUSTOMIZE port
# ───────────────────────────────────────────────────────────────────────────────
# IP ADDRESS ASSIGNMENT
# ───────────────────────────────────────────────────────────────────────────────
/ip address add \
address=192.168.100.1/24 \
interface=wg_devices \
network=192.168.100.0 \
comment="VPN Devices Network" # ← CUSTOMIZE subnet
/ipv6 address add \
address=fd00:1111:2222:100::1/64 \
interface=wg_devices \
advertise=no \
comment="VPN Devices IPv6 ULA" # ← CUSTOMIZE ULA prefix
# ───────────────────────────────────────────────────────────────────────────────
# IPv6 POOL (Optional)
# ───────────────────────────────────────────────────────────────────────────────
/ipv6 pool add \
name=wg_devices_pool_global \
prefix=fd00:1111:2222:100::/64 \
prefix-length=64 \
comment="WireGuard Devices Global IPv6 Pool"
# ───────────────────────────────────────────────────────────────────────────────
# INTERFACE LISTS (create 'VPN' list if it doesn't exist)
# ───────────────────────────────────────────────────────────────────────────────
/interface list add name=VPN comment="VPN Interfaces" # only if list doesn't exist yet
/interface list member add interface=wg_devices list=VPN comment="VPN Devices"
/interface list member add interface=wg_devices list=LAN comment="VPN Devices - LAN Access"
# ───────────────────────────────────────────────────────────────────────────────
# ADDRESS LISTS
# ───────────────────────────────────────────────────────────────────────────────
/ip firewall address-list add \
list=WireGuard \
address=192.168.100.0/24 \
comment="WireGuard Devices Network"
# ───────────────────────────────────────────────────────────────────────────────
# FIREWALL - INPUT CHAIN
# ───────────────────────────────────────────────────────────────────────────────
/ip firewall filter add \
chain=input \
action=accept \
protocol=udp \
dst-port=53537 \
comment="WireGuard - Accept incoming connections" # ← CUSTOMIZE port
/ipv6 firewall filter add \
chain=input \
action=accept \
protocol=udp \
port=53537 \
comment="Allow WireGuard" # ← CUSTOMIZE port
# ───────────────────────────────────────────────────────────────────────────────
# FIREWALL - FORWARD CHAIN (IPv4)
# ───────────────────────────────────────────────────────────────────────────────
/ip firewall filter add \
chain=forward \
action=fasttrack-connection \
connection-state=established,related \
src-address-list=WireGuard \
comment="FastTrack for WireGuard Networks"
/ip firewall filter add \
chain=forward \
action=accept \
src-address=192.168.100.0/24 \
out-interface-list=WAN \
comment="Allow WireGuard Devices to Internet" # ← CUSTOMIZE subnet
/ip firewall filter add \
chain=forward \
action=accept \
connection-state=established,related \
dst-address=192.168.100.0/24 \
in-interface-list=WAN \
comment="Allow Internet to WireGuard Devices (replies)" # ← CUSTOMIZE subnet
/ip firewall filter add \
chain=forward \
action=accept \
src-address=192.168.100.0/24 \
dst-address=192.168.0.0/24 \
comment="Allow WireGuard Devices to Home LAN" # ← CUSTOMIZE subnets
# ───────────────────────────────────────────────────────────────────────────────
# FIREWALL - FORWARD CHAIN (IPv6)
# ───────────────────────────────────────────────────────────────────────────────
/ipv6 firewall filter add \
chain=forward \
action=accept \
in-interface=wg_devices \
comment="WireGuard Devices: Allow all outbound"
/ipv6 firewall filter add \
chain=forward \
action=accept \
connection-state=established,related \
out-interface=wg_devices \
comment="WireGuard Devices: Allow replies"
# ───────────────────────────────────────────────────────────────────────────────
# NAT / MASQUERADE
# ───────────────────────────────────────────────────────────────────────────────
/ip firewall nat add \
chain=srcnat \
action=masquerade \
src-address=192.168.100.0/24 \
out-interface-list=WAN \
comment="WireGuard Devices - Internet Access" # ← CUSTOMIZE subnet
/ipv6 firewall nat add \
chain=srcnat \
action=masquerade \
src-address=fd00:1111:2222:100::/64 \
out-interface-list=WAN \
comment="WireGuard Devices - IPv6 Internet Access" # ← CUSTOMIZE ULA prefix
# ───────────────────────────────────────────────────────────────────────────────
# MANGLE - MSS CLAMPING
# ───────────────────────────────────────────────────────────────────────────────
/ip firewall mangle add \
chain=forward \
action=change-mss \
protocol=tcp \
tcp-flags=syn \
tcp-mss=1349-65535 \
new-mss=1420 \
in-interface=wg_devices \
comment="WireGuard MSS clamping - Devices"
# ───────────────────────────────────────────────────────────────────────────────
# RAW TABLE - SKIP FLOOD PROTECTION
# ───────────────────────────────────────────────────────────────────────────────
/ip firewall raw add \
chain=prerouting \
action=accept \
protocol=udp \
dst-port=53537 \
comment="WireGuard - Skip flood protection"
/ipv6 firewall raw add \
chain=prerouting \
action=accept \
protocol=udp \
dst-port=53537 \
comment="WireGuard - Skip flood protection"
# ───────────────────────────────────────────────────────────────────────────────
# PEERS — Using auto-generated keys (recommended)
# Retrieve keys with: :put [/interface wireguard peers get [find name=X] private-key]
# ───────────────────────────────────────────────────────────────────────────────
/interface wireguard peers add \
interface=wg_devices \
name=wg_phone \
private-key=auto \
preshared-key=auto \
allowed-address=192.168.100.2/32,fd00:1111:2222:100::2/128 \ # ← CUSTOMIZE IPs
persistent-keepalive=25s \
comment="Phone - Mobile VPN" # ← CUSTOMIZE
/interface wireguard peers add \
interface=wg_devices \
name=wg_laptop \
private-key=auto \
preshared-key=auto \
allowed-address=192.168.100.3/32,fd00:1111:2222:100::3/128 \ # ← CUSTOMIZE IPs
persistent-keepalive=25s \
comment="Laptop - Mobile VPN" # ← CUSTOMIZEResolución de problemas
La conexión no se establece
El problema más común. Si last-handshake nunca aparece en ninguno de los dos lados, el handshake inicial no se está completando.
Comprueba que la interface WireGuard está en funcionamiento — una interface desactivada o detenida no aceptará conexiones:
/interface wireguard print
# Look for the "R" (running) flag. If you see "X" (disabled), enable it:
/interface wireguard enable wg_devicesVerifica que el port UDP es accesible — el firewall debe aceptar paquetes WireGuard entrantes. Comprueba que la cadena input tiene una regla de aceptación para tu port:
# List input rules that match your WireGuard port
/ip firewall filter print where chain=input and dst-port~"53537"
# If empty, add the rule:
/ip firewall filter add chain=input action=accept protocol=udp dst-port=53537 \
comment="WireGuard - Accept incoming connections" place-before=0Verifica que la public key del peer coincide — el error más sutil. El servidor debe tener la public key del cliente, y el cliente debe tener la public key del servidor. Cualquier discrepancia descarta silenciosamente todos los paquetes:
# Show the server's public key (this goes into the client's [Peer] section)
:put [/interface wireguard get wg_devices public-key]
# Show the client's public key stored on this peer
:put [/interface wireguard peers get [find name=wg_client1] public-key]Comprueba si el peer muestra un handshake — si last-handshake muestra un tiempo, el tunnel está establecido aunque el tráfico no fluya:
/interface wireguard peers print detail where interface=wg_devices
# Look for: last-handshake=Xs (seconds since last handshake)
# If empty or very old, the tunnel is not establishedSe conecta pero no hay acceso a internet
El tunnel está activo (el handshake tiene éxito) pero el cliente no puede navegar ni alcanzar hosts externos.
Comprueba las reglas NAT/masquerade — sin masquerade, la IP privada del cliente VPN llega a internet pero los paquetes de retorno no tienen adónde ir:
# Check IPv4 masquerade
/ip firewall nat print where chain=srcnat and src-address~"192.168.100"
# Should show: action=masquerade out-interface-list=WAN
# Check IPv6 masquerade
/ipv6 firewall nat print where chain=srcnat and src-address~"fd00"Comprueba las reglas de la cadena forward — incluso con NAT, la cadena forward del firewall debe permitir el tráfico VPN hacia la WAN:
/ip firewall filter print where chain=forward and src-address~"192.168.100"
# You need at least:
# accept src=192.168.100.0/24 out-interface-list=WAN
# accept connection-state=established,related dst=192.168.100.0/24 in-interface-list=WANPrueba la resolución DNS — una causa habitual de “no hay internet” es que las consultas DNS fallan. Desde el cliente, intenta alcanzar una IP directamente para aislar el problema:
IPv6 no funciona
IPv4 funciona a través del tunnel pero el tráfico IPv6 no fluye.
Verifica que la dirección IPv6 está asignada a la interface WireGuard:
/ipv6 address print where interface=wg_devices
# Should show your ULA address, e.g., fd00:1111:2222:100::1/64Comprueba la regla NAT66 para IPv6 — a diferencia de IPv4, el masquerade para IPv6 suele olvidarse:
/ipv6 firewall nat print where chain=srcnat
# Must include: action=masquerade src-address=fd00:1111:2222:100::/64 out-interface-list=WANComprueba las reglas forward de IPv6 — el firewall IPv6 es independiente del de IPv4. Necesitas reglas forward explícitas:
/ipv6 firewall filter print where chain=forward and interface~"wg_devices"
# Need at minimum:
# accept in-interface=wg_devices (outbound)
# accept connection-state=established,related out-interface=wg_devices (return)Prueba desde el cliente — ejecuta estos comandos mientras estás conectado a la VPN:
Rendimiento lento
WireGuard es extremadamente eficiente, pero varios factores pueden limitar el rendimiento en dispositivos MikroTik.
Habilita FastTrack — esta es la mejora de rendimiento más significativa. FastTrack omite la mayor parte del procesamiento del firewall para conexiones establecidas:
# Verify FastTrack rule exists and has packet counters increasing
/ip firewall filter print stats where action=fasttrack-connection and comment~"WireGuard"
# If missing:
/ip firewall filter add chain=forward action=fasttrack-connection \
connection-state=established,related src-address-list=WireGuard \
comment="FastTrack for WireGuard Networks"Comprueba MSS clamping — los síntomas de falta de MSS clamping incluyen: páginas que cargan parcialmente, sitios HTTPS que agotan el tiempo, descargas de archivos grandes que fallan mientras las peticiones pequeñas funcionan:
/ip firewall mangle print where action=change-mss and in-interface=wg_devices
# Should show: new-mss=1420 tcp-flags=syn tcp-mss=1349-65535Comprueba el MTU — si experimentas pérdida de paquetes o bloqueos, prueba a reducir el MTU de la interface WireGuard:
# Check current MTU
/interface wireguard print proplist=name,mtu
# If set to 1500 and experiencing issues, try the default 1420:
/interface wireguard set wg_devices mtu=1420
# Then update MSS clamping to match:
# new-mss = MTU - 40 (IPv6 header) - 20 (TCP header) = 1360Monitoriza la carga de CPU — el cifrado de WireGuard no tiene aceleración por hardware en MikroTik. Un uso alto de CPU limita el rendimiento:
/system resource print
# Look for cpu-load percentage. On RB5009 with a single client,
# WireGuard typically uses <5% CPU at 100+ Mbps.Comandos de diagnóstico útiles
Referencia rápida de comandos comunes de diagnóstico en RouterOS relacionados con WireGuard:
# Show all peers with connection status and traffic stats
/interface wireguard peers print detail
# Show only connected peers (those with a recent handshake)
/interface wireguard peers print where last-handshake<1m
# Monitor WireGuard traffic in real-time
/interface monitor-traffic wg_devices once
# Check interface packet counters
/interface print stats where name=wg_devices
# View firewall rule hit counters (useful to find rules that never match)
/ip firewall filter print stats where comment~"WireGuard"
# Check if the port is listening
/tool netwatch print where host=127.0.0.1 and port=53537Buenas prácticas de seguridad
- Usa siempre preshared keys para seguridad post-cuántica
- Utiliza pares de claves únicos para cada dispositivo (nunca compartas las private keys)
- Mantén RouterOS actualizado para recibir parches de seguridad
- Usa un port no estándar para reducir la exposición a escaneos
- Considera la inclusión automática en lista blanca de IPs para peers conectados
- Monitoriza los registros de conexión en busca de intentos de acceso no autorizados
Conclusión
Ahora tienes un WireGuard VPN completamente funcional con soporte dual-stack IPv4/IPv6 en tu router MikroTik. Esta configuración proporciona:
- Acceso remoto seguro a tu red doméstica desde cualquier lugar
- Conectividad IPv6 completa incluso desde redes solo IPv4
- Cifrado rápido y moderno con sobrecarga mínima
- Roaming transparente entre redes Wi-Fi y datos móviles
La simplicidad de WireGuard facilita su mantenimiento, y la implementación de MikroTik es lo suficientemente robusta para uso en producción. Ya sea para acceder a tu NAS, domótica o simplemente navegar con seguridad en redes Wi-Fi públicas, esta configuración lo cubre todo.