Volver al Blog
José Manuel Requena Plens

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.

Imagen de portada de WireGuard en MikroTik: Configuración Completa Dual-Stack IPv4/IPv6

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?

Comparativa de protocolos VPN
CaracterísticaWireGuardOpenVPNIPSec/IKEv2
Complejidad de código~4.000 líneas~100.000 líneas~400.000 líneas
Tiempo de conexión100ms3-10 segundos1-3 segundos
Carga de CPUMuy bajaAlta (espacio de usuario)Media
CriptografíaChaCha20, Curve25519Configurable (varía)AES, RSA/ECDH
Soporte de roamingTransparenteNecesita reconexiónLimitado (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.

Red doméstica

Clientes VPN

Router MikroTik

Internet

Túnel cifrado

Túnel cifrado

Túnel cifrado

Masquerade

Acceso

Conexión ISP

IPv4 + IPv6

Interface WireGuard

wg_devices

Firewall + NAT

Cliente 1

192.168.100.2

fd00:...:100::2

Cliente 2

192.168.100.3

fd00:...:100::3

Cliente N

192.168.100.x

fd00:...:100::x

Dispositivos LAN

192.168.0.0/24

Arquitectura WireGuard Dual-Stack

Esquema de direccionamiento

Asignación de direcciones IP
ComponenteDirección IPv4Dirección IPv6
Interface WireGuard (Router)192.168.100.1/24fd00:1111:2222:100::1/64
Rango de clientes VPN192.168.100.2-254fd00:1111:2222:100::2-ffff
LAN doméstica192.168.0.0/24Prefix 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.

ROUTEROSCrear interface WireGuard
/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:

/interface wireguard print
Flags: X - disabled; R - running 0 R name="wg_devices" mtu=1500 listen-port=53537 private-key="[REDACTED]" public-key="YourServerPublicKeyHere123456789ABCDEFGHIJ="

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.

ROUTEROSAsignar direcciones IP
# 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:

ROUTEROSCrear pool IPv6
/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.

ROUTEROSAñadir a listas de interfaces
# 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:

  1. Aceptar tráfico WireGuard en el port de escucha
  2. Permitir a los clientes VPN acceder a internet
  3. Permitir a los clientes VPN acceder a las redes locales
  4. NAT/Masquerade para el tráfico saliente

Cadena input: aceptar conexiones WireGuard

ROUTEROSReglas de firewall input
# 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

ROUTEROSReglas de firewall forward - IPv4
# 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"
ROUTEROSReglas de firewall forward - IPv6
# 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

ROUTEROSListas de direcciones
/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.

ROUTEROSConfiguración NAT
# 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.

ROUTEROSMSS 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"

Paso 8: configurar la tabla RAW para rendimiento

Omitir la protección contra flood para el tráfico WireGuard garantiza una conectividad fluida:

ROUTEROSReglas de la tabla RAW
# 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

ROUTEROSAñadir 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:

ROUTEROSEstablecer propiedades de configuración del cliente
/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=25

Obtener 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:

ROUTEROSObtener claves generadas
# 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

# Generate private key wg genkey > privatekey # Generate public key from private key cat privatekey | wg pubkey > publickey # Generate preshared key (optional but recommended) wg genpsk > presharedkey # Display keys cat privatekey publickey presharedkey

Añadir peer en MikroTik

Usa la public key del cliente (no la private key) y la preshared key:

ROUTEROSAñadir peer WireGuard (Linux/macOS)
/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.

  1. Descarga e instala WireGuard para Windows
  2. Abre la aplicación y haz clic en Add TunnelAdd empty tunnel
  3. La aplicación genera un par de claves — copia la Public Key que aparece en la parte superior
  4. Genera una preshared key desde la línea de comandos:
# If WireGuard is installed, wg.exe is available in PATH wg genpsk

Añadir peer en MikroTik

ROUTEROSAñadir peer WireGuard (Windows)
/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ámetros de configuración del peer
ParámetroValorPropósito
private-keyauto / ningunoAuto-genera el par de claves en el router (método recomendado)
public-keyPublic key del clienteIdentifica y autentica al cliente
preshared-keyauto / secreto compartidoCapa de cifrado simétrico adicional (seguridad post-cuántica)
allowed-addressIP(s) del clienteIPs que el cliente puede usar; también actúa como routing table
persistent-keepalive25 segundosMantiene 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.

ROUTEROSConfiguración de múltiples peers (claves auto en RouterOS)
# 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
wg_home.conf (iOS/​Android)
[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

Instala WireGuard:

# macOS (Homebrew) brew install wireguard-tools # Ubuntu/Debian sudo apt install wireguard # Fedora sudo dnf install wireguard-tools

Crea el archivo de configuración:

/​etc/​wireguard/​wg_home.conf
[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

Activa el tunnel:

# Start the tunnel sudo wg-quick up wg_home # Check status sudo wg show # Stop the tunnel sudo wg-quick down wg_home # Enable on boot (Linux only) sudo systemctl enable wg-quick@wg_home
  1. Descarga e instala WireGuard para Windows
  2. Abre la aplicación y haz clic en Add TunnelImport tunnel(s) from file (si tienes un archivo .conf) o Add empty tunnel para pegar la configuración
  3. Si lo creas desde cero, sustituye la configuración con:
wg_home.conf (Windows)
[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
  1. Haz clic en Save y luego en Activate

Opciones de configuración explicadas

Parámetros de configuración del cliente
ParámetroDescripción
AddressLas direcciones IP asignadas a este cliente (tanto IPv4 como IPv6)
DNSServidores DNS a utilizar. Puede ser tu router o cualquier servidor DNS accesible vía VPN
EndpointLa IP pública o nombre de dominio de tu router con el port de WireGuard
AllowedIPs0.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

Split Tunnel

Red doméstica

Internet

Cliente

¿Destino?

Túnel VPN

Router doméstico

Conexión directa

Full Tunnel

Cliente

Túnel VPN

Router doméstico

Internet

Modos de encaminamiento de tráfico

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
INIEjemplo de full tunnel
# Route ALL traffic through VPN
AllowedIPs = 0.0.0.0/0, ::/0

Split 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
INIEjemplo de split tunnel
# Only route home network traffic through VPN
AllowedIPs = 192.168.0.0/24, 192.168.100.0/24, fd00:1111:2222::/48

Paso 11: verificar la conexión

Tras configurar ambos lados, prueba la conexión.

En el cliente

# macOS/Linux sudo wg show # Or use the WireGuard app on iOS/Android
interface: wg_home public key: ClientPublicKeyHere123456789ABCDEFGHIJKLMNO= private key: (hidden) listening port: 51820 peer: YourServerPublicKeyHere123456789ABCDEFGHIJ= preshared key: (hidden) endpoint: 203.0.113.50:53537 allowed ips: 0.0.0.0/0, ::/0 latest handshake: 5 seconds ago transfer: 1.24 MiB received, 456.78 KiB sent

En el router MikroTik

/interface wireguard peers print
Flags: X - disabled 0 name="wg_client1" interface=wg_devices public-key="<CLIENT_PUBLIC_KEY>" preshared-key="(present)" allowed-address=192.168.100.2/32,fd00:1111:2222:100::2/128 current-endpoint-address=198.51.100.75 current-endpoint-port=51820 last-handshake=5s rx=1302528 tx=467352

Probar conectividad IPv6

# Check your IPv6 address curl -6 ifconfig.co # Test IPv6 connectivity ping6 google.com # Verify route traceroute6 google.com

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"                                  # ← CUSTOMIZE

Resolució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:

ROUTEROSVerificar estado de la interface
/interface wireguard print
# Look for the "R" (running) flag. If you see "X" (disabled), enable it:
/interface wireguard enable wg_devices

Verifica 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:

ROUTEROSComprobar reglas de firewall input
# 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=0

Verifica 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:

ROUTEROSVerificar claves
# 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:

ROUTEROSComprobar handshake del peer
/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 established

Se 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:

ROUTEROSVerificar reglas NAT
# 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:

ROUTEROSVerificar reglas forward
/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=WAN

Prueba 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:

# Test direct IP connectivity (bypasses DNS) ping 1.1.1.1 # If ping works but browsing doesn't, DNS is the problem. # Try a different DNS in the client config: # DNS = 1.1.1.1, 2606:4700:4700::1111

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:

ROUTEROSComprobar dirección IPv6
/ipv6 address print where interface=wg_devices
# Should show your ULA address, e.g., fd00:1111:2222:100::1/64

Comprueba la regla NAT66 para IPv6 — a diferencia de IPv4, el masquerade para IPv6 suele olvidarse:

ROUTEROSVerificar NAT66 para IPv6
/ipv6 firewall nat print where chain=srcnat
# Must include: action=masquerade src-address=fd00:1111:2222:100::/64 out-interface-list=WAN

Comprueba las reglas forward de IPv6 — el firewall IPv6 es independiente del de IPv4. Necesitas reglas forward explícitas:

ROUTEROSVerificar reglas forward de IPv6
/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:

# Verify your IPv6 address is from the ULA range ip -6 addr show wg_home # Test connectivity to a known IPv6 address (Google DNS) ping6 2001:4860:4860::8888 # If the ping works, test DNS resolution over IPv6 curl -6 ifconfig.co

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:

ROUTEROSComprobar FastTrack
# 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:

ROUTEROSVerificar MSS clamping
/ip firewall mangle print where action=change-mss and in-interface=wg_devices
# Should show: new-mss=1420 tcp-flags=syn tcp-mss=1349-65535

Comprueba el MTU — si experimentas pérdida de paquetes o bloqueos, prueba a reducir el MTU de la interface WireGuard:

ROUTEROSAjustar MTU
# 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) = 1360

Monitoriza la carga de CPU — el cifrado de WireGuard no tiene aceleración por hardware en MikroTik. Un uso alto de CPU limita el rendimiento:

ROUTEROSMonitorizar CPU
/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:

ROUTEROSComandos de diagnóstico 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=53537

Buenas 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.