1. Si tienes RouterOS 7.13 o superior, usa el menú WiFi (no el antiguo "Wireless") para las interfaces AX.
2. Actualiza RouterOS
3. Configura la Seguridad Híbrida (WPA2/WPA3) mejora la compatibilidad y el roaming en dispositivos.
freebsd, unix, openbsd, servidores, bsd, redes, linux, mikrotik, synology, zfs,
1. Si tienes RouterOS 7.13 o superior, usa el menú WiFi (no el antiguo "Wireless") para las interfaces AX.
2. Actualiza RouterOS
3. Configura la Seguridad Híbrida (WPA2/WPA3) mejora la compatibilidad y el roaming en dispositivos.
En la Parte 3 dejamos el hAP ax³ funcionando con un túnel WireGuard apuntando a un servidor de ProtonVPN en Barcelona. En esta cuarta y última parte, vamos a levantar un segundo túnel simultáneo hacia Marsella y usaremos Address Lists para enrutar el tráfico por dispositivo.
Este enfoque no solo nos permite organizar la red de forma granular, sino que separa una configuración doméstica de una infraestructura profesional: podremos añadir decenas de dispositivos y cambiar su país de salida con un solo clic, sin tocar el firewall.
/system backup save name=ax3-dual-20261024-vpn-marsella-barcelona-OK /export compact file=ax3-dual-20261024-vpn-marsella-barcelona-OK
Configurar dos túneles VPN simultáneos hacia el mismo proveedor (ProtonVPN) nos obligará a sortear tres problemas que, si no se controlan, romperán la red:
10.2.0.2/32).10.3.0.0/24) que debe ser excluida del enrutamiento.Descarga el archivo WireGuard de ProtonVPN para Marsella y edítalo con un editor de texto:
# Original Address = 10.2.0.2/32 # Modificado Address = 10.3.0.2/32
En WinBox, ve a WireGuard → Interface → + → Import from file y selecciona el archivo de Marsella.
proton-vpn-marsella13232 (distinto al 13231 de Barcelona).1380 (ajustado para evitar fragmentación).El parámetro fib es fundamental para que las rutas de esa tabla se instalen en el Forwarding Information Table y el tráfico realmente se enrute.
/routing table add name=via-vpn-marsella fib
/ip route add dst-address=0.0.0.0/0 gateway=proton-vpn-marsella routing-table=via-vpn-marsella distance=1 comment="Salida por Marsella" /ip route add dst-address=0.0.0.0/0 blackhole=yes routing-table=via-vpn-marsella distance=2 comment="Kill switch Marsella"
/ip firewall address-list add list=lan-directa address=10.3.0.0/24 comment="Red interna Marsella"
# NAT (Masquerade para Marsella) /ip firewall nat add chain=srcnat action=masquerade src-address=192.168.88.0/24 out-interface=proton-vpn-marsella comment="NAT para Marsella" # Filter (Permitir LAN a Marsella) /ip firewall filter add chain=forward in-interface-list=LAN out-interface=proton-vpn-marsella action=accept comment="Permitir LAN a VPN Marsella" place-before=[find comment="Drop todo lo dems"]
En lugar de reglas individuales, agrupamos los dispositivos en listas:
# Lista para Marsella /ip firewall address-list add list=vpn-marsella address=192.168.88.100 comment="pc100" add list=vpn-marsella address=192.168.88.101 comment="movil101" add list=vpn-marsella address=192.168.88.102 comment="tablet102" add list=vpn-marsella address=192.168.88.103 comment="portatil103" # Lista para Barcelona /ip firewall address-list add list=vpn-barcelona address=192.168.88.201 comment="portatil201" add list=vpn-barcelona address=192.168.88.202 comment="movil202" add list=vpn-barcelona address=192.168.88.203 comment="movil203"
Y creamos las reglas genéricas de Mangle (Marcar primero, Enrutar después):
# --- MARSELLA --- /ip firewall mangle add chain=prerouting src-address-list=vpn-marsella in-interface=bridge action=mark-connection new-connection-mark=conn-marsella passthrough=yes comment="Mangle: Marcar lista Marsella" /ip firewall mangle add chain=prerouting connection-mark=conn-marsella action=mark-routing new-routing-mark=via-vpn-marsella passthrough=no comment="Mangle: Enrutar lista Marsella" # --- BARCELONA (ESPAÑA) --- /ip firewall mangle add chain=prerouting src-address-list=vpn-barcelona in-interface=bridge action=mark-connection new-connection-mark=conn-barcelona passthrough=yes comment="Mangle: Marcar lista Barcelona" /ip firewall mangle add chain=prerouting connection-mark=conn-barcelona action=mark-routing new-routing-mark=via-vpn passthrough=no comment="Mangle: Enrutar lista Barcelona"
Address Lists funcionan
buscando la IP del dispositivo. Si el servidor DHCP de tu router le asigna mañana
una IP diferente al dispositivo (ej. pasa de la .100 a la .105), las reglas de Mangle no
lo reconocerán y se saltará la VPN.
IP → DHCP Server → Leases, busca los
dispositivos de tus listas, haz clic derecho y selecciona "Make Static"
(o usa el comando /ip dhcp-server lease make-static [find]). Así te
aseguras de que su IP nunca cambie y el enrutamiento sea siempre perfecto.
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn out-interface=proton-vpn-marsella action=change-mss new-mss=1340 passthrough=yes comment="MSS para tunel Marsella (MTU 1380)"
/ip firewall connection remove [find src-address~"192.168.88.10"] /ip firewall connection remove [find src-address~"192.168.88.20"]
Para asegurarte de que todo está fluyendo correctamente, ejecuta estas comprobaciones en el MikroTik:
# 1. ¿Los túneles están vivos y con handshake reciente? /interface wireguard peers print detail # 2. ¿Puede el router hacer ping a través de Marsella? (Debe ser 0% packet-loss) /ping 1.1.1.1 interface=proton-vpn-marsella count=3 # 3. ¿Está la tabla de rutas de Marsella activa y con su Kill Switch? /ip route print where routing-table=via-vpn-marsella # 4. ¿Están los dispositivos generando tráfico y con la marca correcta? /ip firewall connection print where src-address~"192.168.88.10" # (Fíjate en la columna CONNECTION-MARK: debería decir conn-marsella) # 5. ¿Están subiendo los contadores de las reglas de Mangle? /ip firewall mangle print stats
Si el túnel se levanta pero los dispositivos no tienen Internet, revisa estos cinco puntos:
*D) o un peer duplicado con la misma clave pública, el túnel se volverá loco y perderá paquetes. Elimina cualquier peer que no corresponda con su interfaz.
/interface wireguard peers remove [find name="peerX"]
/ip address print que no existe ninguna interfaz llamada unknown. Si existe, bórrala: /ip address remove [find interface=unknown].out-interface=proton-vpn-marsella antes del Drop general en la cadena forward.192.168.88.244) y que el tráfico hacia esa IP no está siendo enrutado por error hacia la VPN (la regla lan-directa lo evita).IP → DHCP Server → Leases que sigue teniendo la misma IP que pusiste en la Address List. Si no lo hiciste en su momento, haz clic derecho y selecciona "Make Static".La ventaja de las Address Lists es que el cambio es instantáneo. Para pasar un dispositivo de Marsella a Barcelona:
IP → Firewall → Address Lists.List de vpn-marsella a vpn-barcelona./ip firewall connection remove [find src-address~"192.168.88.100"]
/ip firewall mangle print
Flags: D - DYNAMIC
0 D ;;; special dummy rule to show fasttrack counters
chain=prerouting action=passthrough
1 D ;;; special dummy rule to show fasttrack counters
chain=forward action=passthrough
2 D ;;; special dummy rule to show fasttrack counters
chain=postrouting action=passthrough
3 ;;; evita problemas de fragmentacion de paquetes
chain=forward action=change-mss new-mss=1452 passthrough=yes tcp-flags=syn protocol=tcp out-interface=pppoe-o2 log=no
log-prefix=""
4 ;;; No marcar Trafico LAN
chain=prerouting action=return dst-address-list=lan-directa log=no log-prefix=""
5 ;;; Mangle: Marcar lista Barcelona
chain=prerouting action=mark-connection new-connection-mark=conn-barcelona passthrough=yes src-address-list=vpn-barcelona
in-interface=bridge
6 ;;; Mangle: Marcar lista Marsella
chain=prerouting action=mark-connection new-connection-mark=conn-marsella passthrough=yes src-address-list=vpn-marsella
in-interface=bridge
7 ;;; Mangle: Enrutar lista Marsella
chain=prerouting action=mark-routing new-routing-mark=via-vpn-marsella passthrough=no connection-mark=conn-marsella
8 ;;; Mangle: Enrutar lista Barcelona
chain=prerouting action=mark-routing new-routing-mark=via-vpn passthrough=no connection-mark=conn-barcelona
9 ;;; MSS para tunel WireGuard (MTU 1420)
chain=forward action=change-mss new-mss=1380 passthrough=yes tcp-flags=syn protocol=tcp out-interface=proton-vpn
10 ;;; MSS para tunel Marsella (MTU 1380)
chain=forward action=change-mss new-mss=1340 passthrough=yes tcp-flags=syn protocol=tcp out-interface=proton-vpn-marsella
Conclusión de la serie: Con esta cuarta parte, el hAP ax³ deja de ser un simple router doméstico y se convierte en un verdadero concentrador de enrutamiento avanzado. Hemos eliminado el doble NAT, montado un sistema de VPN multi-región por dispositivo con Address Lists, asegurado el DNS con Pi-Hole y Unbound, y añadido failover (Kill Switch) a cada túnel. Una infraestructura de red de nivel profesional, documentada paso a paso y con un plan de reversión en cada fase.
Serie: este artículo es la Parte 4 de Proyecto ax³. Viene de la Parte 3 — Monopuesto, VPN y corte final.FreeBSD es genial!.
Volver al índice de la serie · Cheatsheet RouterOS
Ejecutar automáticamente un script al despertar el equipo de suspensión (S3) para restaurar:
| Pieza | Ruta |
|---|---|
| Script de restauración | /usr/local/sbin/resume-network.sh |
| Regla de devd | /etc/devd/resume-network.conf |
| Log del script | /var/log/resume-network.log |
| Syslog (logger) | /var/log/messages |
doas vim /usr/local/sbin/resume-network.sh
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin export PATH
exec >> /var/log/resume-network.log 2>&1
log() {
echo "[$(date '+%F %T')] $*"
logger -t resume-network "$*"
}
doas chmod +x /usr/local/sbin/resume-network.sh
#!/bin/sh
# =========================================================
# /usr/local/sbin/resume-network.sh
# Restaura Ethernet (em0, IP fija), ratón USB y NFS
# tras un resume ACPI.
# (WireGuard y qBittorrent excluidos)
# =========================================================
# PATH completo: devd ejecuta los scripts con un PATH mínimo
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
export PATH
LOG="/var/log/resume-network.log"
exec >> "$LOG" 2>&1
# Función para loguear en archivo y en syslog
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
logger -t resume-network "$*"
}
log "=== $(date) - Resume detectado ==="
# ---------------------------------------------------------
# 1. Ethernet: reactivar em0 y aplicar IP fija
# ---------------------------------------------------------
sleep 3
ifconfig em0 down
sleep 1
ifconfig em0 up
# Esperar a que el enlace esté activo (hasta 15s)
i=0
status=""
while [ $i -lt 15 ]; do
status=$(ifconfig em0 | awk '/status:/ {print $2}')
[ "$status" = "active" ] && break
sleep 1
i=$((i + 1))
done
log "em0 status=$status tras ${i}s"
if [ "$status" != "active" ]; then
log "ERROR - em0 sin enlace tras ${i}s"
exit 1
fi
# Eliminar IP previa (si existe) y reaplicar IP fija y ruta
ifconfig em0 inet 192.168.88.50 delete 2>/dev/null
ifconfig em0 inet 192.168.88.50 netmask 255.255.255.0
route delete default 2>/dev/null
route add default 192.168.88.1
log "Ethernet OK (IP fija y ruta activas)"
# ---------------------------------------------------------
# 2. Recargar pf para limpiar estados obsoletos
# ---------------------------------------------------------
/sbin/pfctl -f /etc/pf.conf 2>/dev/null
log "pf recargado"
# ---------------------------------------------------------
# 3. Verificar conectividad con reintentos
# ---------------------------------------------------------
connected=0
for attempt in 1 2 3; do
if ping -c 1 -t 3 192.168.88.1 >/dev/null 2>&1; then
connected=1
break
fi
sleep 2
done
if [ "$connected" != "1" ]; then
log "ERROR - sin conectividad a la puerta de enlace"
exit 1
fi
log "Conectividad verificada tras ${attempt} intento(s)"
# ---------------------------------------------------------
# 4. Reactivar ratón USB
# ---------------------------------------------------------
if kldstat -q -m ums 2>/dev/null; then
kldunload ums 2>/dev/null
sleep 1
kldload ums
log "módulo ums recargado"
elif kldstat -q -m uhid 2>/dev/null; then
kldunload uhid 2>/dev/null
sleep 1
kldload uhid
log "módulo uhid recargado"
else
log "ni ums ni uhid cargados, ratón sin cambios"
fi
# Reiniciar moused si está corriendo
if pgrep -q moused; then
service moused restart 2>/dev/null || {
pkill -f moused 2>/dev/null
sleep 1
service moused start 2>/dev/null
}
log "moused reiniciado"
fi
# ---------------------------------------------------------
# 5. Reiniciar el cliente NFS
# ---------------------------------------------------------
service nfsclient restart
log "nfsclient reiniciado"
# Opcional: remontar sistemas NFS si se quedan colgados
# mount -a -t nfs
# log "sistemas NFS remontados"
log "=== $(date) - Resume completado ==="
exit 0
# cat /etc/devd/resume-network.conf
notify 100 {
match "system" "ACPI";
match "subsystem" "Resume";
action "/usr/local/sbin/resume-network.sh";
};
doas service devd restart
Verifica que el subsystem sea exactamente el correcto. Algunos equipos emiten Resume y otros resume. Para ver qué llega:
doas devd -d
Suspende y despierta el equipo. Si no aparece el evento ACPI/Resume, ajusta la regla con el subsystem que realmente emita tu hardware (puedes verlo también en /var/log/messages).
Ejecuta el script manualmente como root:
doas sh -x /usr/local/sbin/resume-network.sh
Y revisa el log:
tail -f /var/log/resume-network.log
Log propio del script:
tail -n 50 /var/log/resume-network.log
add net default: gateway 192.168.88.1 [2026-10-16 15:02:49] Ethernet OK (IP fija y ruta activas) [2026-10-16 15:02:49] pf recargado [2026-10-16 15:02:51] Conectividad verificada tras 1 intento(s) [2026-10-16 15:02:51] ni ums ni uhid cargados, ratón sin cambios Starting default moused. [2026-10-16 15:02:51] moused reiniciado NFS access cache time=60 [2026-10-16 15:02:51] nfsclient reiniciado [2026-10-16 15:02:51] === Fri Oct 16 15:02:51 CEST 2026 - Resume completado === [2026-10-16 15:03:28] === Fri Oct 16 15:03:28 CEST 2026 - Resume detectado === [2026-10-16 15:03:36] em0 status=active tras 2s add net default: gateway 192.168.88.1 [2026-10-16 15:03:37] Ethernet OK (IP fija y ruta activas) [2026-10-16 15:03:37] pf recargado [2026-10-16 15:03:42] Conectividad verificada tras 2 intento(s) [2026-10-16 15:03:42] ni ums ni uhid cargados, ratón sin cambios Starting default moused. [2026-10-16 15:03:42] moused reiniciado NFS access cache time=60 [2026-10-16 15:03:42] nfsclient reiniciado [2026-10-16 15:03:42] === Fri Oct 16 15:03:42 CEST 2026 - Resume completado === [2026-10-16 18:34:14] === Fri Oct 16 18:34:14 CEST 2026 - Resume detectado === [2026-10-16 18:34:23] em0 status=active tras 2s add net default: gateway 192.168.88.1 [2026-10-16 18:34:23] Ethernet OK (IP fija y ruta activas) [2026-10-16 18:34:23] pf recargado [2026-10-16 18:34:26] Conectividad verificada tras 1 intento(s) [2026-10-16 18:34:26] ni ums ni uhid cargados, ratón sin cambios Starting default moused. [2026-10-16 18:34:26] moused reiniciado NFS access cache time=60 [2026-10-16 18:34:26] nfsclient reiniciado [2026-10-16 18:34:26] === Fri Oct 16 18:34:26 CEST 2026 - Resume completado === [2026-10-16 21:58:08] === Fri Oct 16 21:58:08 CEST 2026 - Resume detectado === [2026-10-16 21:58:16] em0 status=active tras 2s add net default: gateway 192.168.88.1 [2026-10-16 21:58:17] Ethernet OK (IP fija y ruta activas) [2026-10-16 21:58:17] pf recargado [2026-10-16 21:58:22] Conectividad verificada tras 2 intento(s) [2026-10-16 21:58:22] ni ums ni uhid cargados, ratón sin cambios Starting default moused. [2026-10-16 21:58:22] moused reiniciado NFS access cache time=60 [2026-10-16 21:58:22] nfsclient reiniciado [2026-10-16 21:58:22] === Fri Oct 16 21:58:22 CEST 2026 - Resume completado ===
Mensajes que ha escrito devd y el script vía logger:
grep resume /var/log/messages
Oct 16 21:58:08 solaris resume-network[18841]: === Fri Oct 16 21:58:08 CEST 2026 - Resume detectado === Oct 16 21:58:16 solaris resume-network[18862]: em0 status=active tras 2s Oct 16 21:58:17 solaris resume-network[18871]: Ethernet OK (IP fija y ruta activas) Oct 16 21:58:17 solaris resume-network[18877]: pf recargado Oct 16 21:58:22 solaris resume-network[18891]: Conectividad verificada tras 2 intento(s) Oct 16 21:58:22 solaris resume-network[18898]: ni ums ni uhid cargados, ratón sin cambios Oct 16 21:58:22 solaris resume-network[18929]: moused reiniciado Oct 16 21:58:22 solaris resume-network[18945]: nfsclient reiniciado Oct 16 21:58:22 solaris resume-network[18951]: === Fri Oct 16 21:58:22 CEST 2026 - Resume completado ===
| Síntoma | Causa | Solución |
|---|---|---|
| Nada ocurre al despertar | & al final del action |
Quitarlo |
| Nada ocurre al despertar | subsystem distinto (resume vs Resume) |
Ajustar en el .conf |
| Script falla silenciosamente | Comando no encontrado (logger, route, …) | Añadir PATH completo |
| IP fija no se aplica | La IP ya estaba asignada | ifconfig em0 inet X delete antes |
| Ratón no vuelve | Módulo incorrecto cargado | Probar ums, uhid, usbhid |
| NFS colgado | service nfsclient restart no remonta |
Añadir umount -f + mount -a |
service devd restart # recargar reglas devd -d # ver eventos en directo ifconfig em0 # ver estado del enlace netstat -rn # ver rutas pfctl -s info # estado de pf kldstat # módulos cargados mount | grep nfs # montajes NFS activos
Todo el flujo en un solo vistazo: script → regla devd → restart → log → depuración.
FreeBSD es genial!.Resumen de comandos útiles de RouterOS y del cliente SSH, agrupados por tema y con comentarios. Todo lo que aparece aquí es lo que se usó realmente durante el Proyecto ax³: la migración del hAP ac² al hAP ax³ con monopuesto de O2, policy routing multi-región con ProtonVPN y Address Lists, DNS con Pi-Hole y Unbound, y backups.
# Ver la configuración SSH actual /ip ssh print # Permitir autenticación por contraseña /ip ssh set password-authentication=yes # Solo permitir contraseña a usuarios SIN clave (recomendado tras importar claves) /ip ssh set password-authentication=yes-if-no-key # Forzar algoritmos criptográficos modernos (AES-GCM, ChaCha20, Ed25519) /ip ssh set strong-crypto=yes # Ver las claves SSH importadas de los usuarios /user ssh-keys print # Ver detalle (incluye fingerprint) /user ssh-keys print detail # Importar una clave pública a un usuario /user ssh-keys import public-key-file=mikrotik_axe.pub user=carlos # Eliminar una clave por índice /user ssh-keys remove 1 # Eliminar una clave por fingerprint (más seguro) /user ssh-keys remove [find fingerprint="SHA256:..."]
password-authentication:
yes — Login por contraseña siempre permitido.no — Nunca permitido, solo clave SSH.yes-if-no-key — Solo si el usuario no tiene clave asociada. Recomendado tras importar las claves.# Listar todos los usuarios /user print # Habilitar un usuario y asignarle contraseña /user set admin disabled=no password="TuContraseñaSegura" # Asignar grupo (full = control total) /user set admin disabled=no group=full password="TuContraseñaSegura" # Dejar un usuario sin contraseña (solo entrará con clave SSH) /user set carlos password="" # Deshabilitar un usuario temporalmente /user set carlos disabled=yes
# Backup binario (restaurable, incluye todo) /system backup save name=ax3-2026-10-25-dual-vpn-OK # Backup con contraseña (recomendado si sale del router) /system backup save name=ax3-2026-10-25-dual-vpn-OK password="clave" # Export legible (.rsc, sin contraseñas) /export compact file=ax3-2026-10-25-dual-vpn-OK # Export con datos sensibles (¡cuidado con dónde se guarda!) /export file=ax3-2026-10-25-dual-vpn-OK show-sensitive # Listar archivos existentes /file print # Restaurar un backup binario /system backup load name=ax3-2026-10-25-dual-vpn-OK.backup # Reiniciar el router /system reboot
ax3-AAAA-MM-DD-HHMM-<estado>.ext. Guardar siempre una copia
fuera del router (en tormenta, por ejemplo, con ZFS y snapshots).
# Ver reglas
/ip firewall filter print
/ip firewall filter print stats
# Permitir LAN → WAN (con prioridad antes del drop final)
/ip firewall filter add chain=forward in-interface-list=LAN out-interface-list=WAN \
action=accept comment="Permitir LAN a WAN"
# Permitir LAN → VPN España
/ip firewall filter add chain=forward in-interface-list=LAN out-interface=proton-vpn \
action=accept comment="Permitir LAN a VPN España"
# Permitir LAN → VPN Marsella
/ip firewall filter add chain=forward in-interface-list=LAN out-interface=proton-vpn-marsella \
action=accept comment="Permitir LAN a VPN Marsella"
# Colocar una regla antes de otra (ej. antes del Drop final)
/ip firewall filter add ... place-before=[find comment="Drop todo lo dems"]
# Mover una regla después de crearla
/ip firewall filter move [find comment~"Permitir LAN a VPN"] \
destination=[find comment~"Drop todo lo dems"]
# Resetear contadores
/ip firewall filter reset-counters [find]
# Ver reglas y contadores
/ip firewall mangle print
/ip firewall mangle print stats
# 1. Excluir tráfico LAN del marcado (DEBE IR PRIMERO)
/ip firewall mangle add chain=prerouting dst-address-list=lan-directa \
action=return comment="No marcar tráfico LAN"
# 2. Marcar la conexión (usando Address Lists en lugar de IPs sueltas)
/ip firewall mangle add chain=prerouting src-address-list=vpn-marsella in-interface=bridge \
action=mark-connection new-connection-mark=conn-marsella passthrough=yes \
comment="Mangle: Marcar lista Marsella"
# 3. Enrutar por la tabla correspondiente
/ip firewall mangle add chain=prerouting connection-mark=conn-marsella \
action=mark-routing new-routing-mark=via-vpn-marsella passthrough=no \
comment="Mangle: Enrutar lista Marsella"
# --- MSS (Cálculo correcto = MTU - 40) ---
# PPPoE: MTU 1492 -> MSS 1452
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn \
out-interface=pppoe-o2 action=change-mss new-mss=1452 passthrough=yes \
comment="MSS para PPPoE"
# WireGuard España: MTU 1420 -> MSS 1380
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn \
out-interface=proton-vpn action=change-mss new-mss=1380 passthrough=yes \
comment="MSS para túnel España"
# WireGuard Marsella: MTU 1380 -> MSS 1340
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn \
out-interface=proton-vpn-marsella action=change-mss new-mss=1340 passthrough=yes \
comment="MSS para túnel Marsella"
mark-connection o mark-routing.
Además, es vital excluir las redes internas de los túneles (ej. 10.3.0.0/24)
en la lista lan-directa para evitar bucles.
# Ver reglas
/ip firewall nat print
/ip firewall nat print stats
# Masquerade general (salida por PPPoE)
/ip firewall nat add chain=srcnat action=masquerade src-address=192.168.88.0/24 \
out-interface=pppoe-o2 comment="NAT general por PPPoE"
# Masquerade para el túnel España (debe ir ANTES que la general)
/ip firewall nat add chain=srcnat action=masquerade src-address=192.168.88.0/24 \
out-interface=proton-vpn comment="NAT para ProtonVPN España"
# Masquerade para el túnel Marsella
/ip firewall nat add chain=srcnat action=masquerade src-address=192.168.88.0/24 \
out-interface=proton-vpn-marsella comment="NAT para ProtonVPN Marsella"
# Masquerade para acceder al HGU (activar solo cuando se necesite)
/ip firewall nat add chain=srcnat action=masquerade src-address=192.168.88.0/24 \
out-interface=ether1 disabled=yes comment="NAT para entrar al HGU O2"
# Ver todas las listas
/ip firewall address-list print
# Añadir red a la lista "lan-directa" (Para evitar que vaya por la VPN)
/ip firewall address-list add list=lan-directa address=192.168.88.0/24 \
comment="LAN principal"
/ip firewall address-list add list=lan-directa address=10.2.0.0/24 \
comment="Red interna VPN España"
/ip firewall address-list add list=lan-directa address=10.3.0.0/24 \
comment="Red interna VPN Marsella"
# Añadir dispositivos a las listas de VPN
/ip firewall address-list add list=vpn-marsella address=192.168.88.100 comment="Dispositivo 1"
/ip firewall address-list add list=vpn-barcelona address=192.168.88.201 comment="Dispositivo 2"
# Ver todas las rutas
/ip route print
# Crear una tabla de enrutamiento personalizada (RouterOS v7 requiere FIB)
/routing table add name=via-vpn-marsella fib
# Salida por ProtonVPN Marsella
/ip route add dst-address=0.0.0.0/0 gateway=proton-vpn-marsella routing-table=via-vpn-marsella \
distance=1 comment="Salida por Marsella"
# Kill switch: blackhole si el túnel cae (Sintaxis correcta en v7)
/ip route add dst-address=0.0.0.0/0 blackhole=yes routing-table=via-vpn-marsella \
distance=2 comment="Kill switch Marsella"
type=blackhole, en v7 es blackhole=yes).
# Ver red DHCP configurada /ip dhcp-server network print # Forzar DNS a Pi-Hole /ip dhcp-server network set [find] dns-server=192.168.88.244 # Fijar las IPs de los dispositivos (CRUCIAL para que las Address Lists no fallen) /ip dhcp-server lease make-static [find] # Ver cliente PPPoE /interface pppoe-client print detail # Asegurar que PPPoE añade ruta por defecto /interface pppoe-client set [find name=pppoe-o2] add-default-route=yes # DHCP client de ether1 sin añadir ruta (evita doble NAT) /ip dhcp-client set [find interface=ether1] add-default-route=no
ether1 debe tener siempre add-default-route=no. Además, si usas Address Lists para enrutar por VPN, las IPs deben ser estáticas (reservas DHCP) para que el router siempre reconozca al dispositivo.
# Ver configuración DNS del router /ip dns print # Desactivar el resolver del router (los clientes usan Pi-Hole) /ip dns set allow-remote-requests=no
192.168.88.244) →
Unbound (192.168.88.160) → resolución recursiva. El router no participa.
Por eso allow-remote-requests debe estar en no.
# Ver interfaces WireGuard /interface wireguard print # Ver peers (comprobar que el Last-Handshake es reciente) /interface wireguard peers print detail # Ping por el túnel (desde el propio router) /ping 10.2.0.1 count=3 interface=proton-vpn # Ping a Internet usando la interfaz del túnel /ping 1.1.1.1 interface=proton-vpn-marsella count=3
# Ver interfaces activas y sus MTU /interface print # Ver direcciones IP asignadas (¡comprueba que no haya ninguna 'unknown'!) /ip address print # Ver conexiones activas con marca VPN /ip firewall connection print where connection-mark~"vpn" # Ver conexiones de un dispositivo concreto /ip firewall connection print where src-address~"192.168.88.100" # Ver logs de PPPoE o Firewall /log print where topics~"pppoe" /log print where message~"DROP" # Ver contadores de mangle (las reglas de Arriba deben sumar paquetes) /ip firewall mangle print stats # --- RESOLUCIÓN DE PROBLEMAS --- # Eliminar un peer WireGuard fantasma que rompe el túnel /interface wireguard peers remove [find name="peerX"] # Limpiar la interfaz 'unknown' si falla una importación de WireGuard /ip address remove [find interface=unknown] # Resetear las conexiones de una IP tras cambiar de VPN /ip firewall connection remove [find src-address~"192.168.88.100"] # Activar Safe Mode (revierte cambios si se pierde la sesión) /system safe-mode
# Generar par de claves ed25519 ssh-keygen -t ed25519 -f ~/.ssh/mikrotik_axe -C "carlos@mikrotik-ax3" # Ver fingerprint de una clave pública ssh-keygen -lf ~/.ssh/mikrotik_axe.pub # Limpiar entrada antigua de known_hosts ssh-keygen -R 192.168.88.1 # Subir clave pública al router scp ~/.ssh/mikrotik_axe.pub carlos@192.168.88.1:/mikrotik_axe.pub # Conectar con clave específica ssh -i ~/.ssh/mikrotik_axe carlos@192.168.88.1 # Descargar backups scp carlos@192.168.88.1:/ax3-2026-10-25-dual-vpn-OK.backup . scp carlos@192.168.88.1:/ax3-2026-10-25-dual-vpn-OK.rsc . # Ver IP pública actual y ubicación geográfica curl -s ifconfig.me curl -s ipinfo.io/city # Probar fugas DNS nslookup whoami.akamai.net nslookup dnsleaktest.com
Host mikrotik-ax3
HostName 192.168.88.1
User carlos
IdentityFile ~/.ssh/mikrotik_axe
IdentitiesOnly yes
Host mikrotik-admin
HostName 192.168.88.1
User admin
Con eso:
ssh mikrotik-ax3 scp archivo.bin mikrotik-ax3:/
| Elemento | Valor correcto |
|---|---|
strong-crypto | yes |
password-authentication | yes-if-no-key (tras importar claves) |
| Fasttrack | Deshabilitado (rompe policy routing) |
allow-remote-requests (DNS) | no |
DHCP client de ether1 | add-default-route=no |
| PPPoE client | add-default-route=yes |
| Kill switch VPN | Ruta blackhole en tabla via-vpn |
| Regla de exclusión LAN | Primera en prerouting |
| MSS | MTU - 40 (Ej: 1452 PPPoE, 1380 España, 1340 Marsella) |
| Backups | .backup + .rsc, copia externa en tormenta |
| DHCP Leases | Hacer estáticas (make-static) para que no cambien de IP |
O2 / Internet
│
Fibra óptica
│
┌──────────────────────────┐
│ MitraStar GPT-2541GNAC │
│ MONOPUESTO │
│ VoIP: teléfono fijo │
└────────────┬─────────────┘
│ Ethernet / PPPoE
▼
┌──────────────────────────┐
│ hAP ax³ │
│ PPPoE + NAT + Firewall │
│ WireGuard + ProtonVPN │
│ Policy routing │
└────────────┬─────────────┘
│
192.168.88.0/24
│
├── tormenta .160 FreeBSD 14.5 (Unbound, NFSv4, Kerberos, ZFS, Samba)
├── solaris .50 FreeBSD 14.5
├── raspberry .244 Raspberry Pi 3B + Pi-Hole
└── demás dispositivos
Cadena DNS: clientes → Pi-Hole (.244) → Unbound (.160) → recursivo
Cheatsheet de Proyecto ax³. Última actualización: 2026-10-25.
FreeBSD es genial!.Durante los próximos tres artículos documento la sustitución del router principal de casa —un MikroTik hAP ac²— por un MikroTik hAP ax³, aprovechando la ocasión para reorganizar por completo la red: eliminar el doble NAT, montar WireGuard con ProtonVPN, montar policy routing por dispositivo y dejar el DNS en manos de Pi-Hole y Unbound.
La serie está pensada como una guía reproducible. El hilo conductor es sencillo: nada se toca hasta que lo nuevo está probado. El hAP ac² sigue funcionando exactamente igual durante todo el proceso y solo se apaga cuando el ax³ ya está listo para entrar en producción.
192.168.50.0/24,
configuración base, firewall y backups.O2 / Internet
│
Fibra óptica
│
┌──────────────────────────────────┐
│ MitraStar GPT-2541GNAC │
│ MONOPUESTO │
│ SIN NAT │
│ Teléfono ─── VoIP │
└────────────┬─────────────────────┘
│ Ethernet / PPPoE
▼
┌──────────────────────────────────┐
│ hAP ax³ │
│ PPPoE + NAT + Firewall │
│ WireGuard + ProtonVPN │
│ Policy routing │
└────────────┬─────────────────────┘
│
192.168.88.0/24
│
├── tormenta 192.168.88.160 FreeBSD 14.5 (Unbound, NFSv4, Kerberos, ZFS, Samba)
├── solaris 192.168.88.51 FreeBSD 14.5
├── raspberry 192.168.88.244 Raspberry Pi 3B + Pi-Hole
└── demás dispositivos
raspberry.casa.lan) → Unbound (tormenta.casa.lan).mark-connection + mark-routing y kill switch por blackhole.Filosofía de la serie: el objetivo no es solo migrar, sino poder volver atrás si algo falla. Esa garantía es lo que convierte un cambio de router en un proyecto controlado y no en una tarde de emergencia.
En la Parte 1 definimos el objetivo, la comparativa y la arquitectura.
En la Parte 2 dejamos el hAP ax³ completamente preparado en la red
aislada 192.168.50.0/24, con RouterOS y firmware actualizados, DHCP
funcionando, Wi-Fi 6 configurado, firewall básico y backups en orden.
En esta tercera y última parte se hace el corte real: configurar el PPPoE de O2,
poner el MitraStar en monopuesto, integrar WireGuard con ProtonVPN, montar el policy
routing, cerrar el DNS con Pi-Hole y Unbound, migrar a 192.168.88.0/24
y apagar el hAP ac².
El objetivo de esta fase es que el hAP ax³ reciba directamente la IP pública por PPPoE, eliminando el doble NAT que hoy existe entre el MitraStar y el router. Para ello, el MitraStar pasa a modo monopuesto.
O2 / Internet
│
Fibra óptica
│
┌──────────────────────────────────┐
│ MitraStar GPT-2541GNAC │
│ MONOPUESTO │
│ SIN NAT │
│ Teléfono ─── VoIP │
└────────────┬─────────────────────┘
│ Ethernet / PPPoE
▼
┌──────────────────────────────────┐
│ hAP ax³ │
│ PPPoE + NAT + Firewall │
│ WireGuard + ProtonVPN │
│ Policy routing │
└────────────┬─────────────────────┘
│
192.168.88.0/24
│
├── tormenta 192.168.88.160 FreeBSD 14.5 (Unbound, NFSv4, Kerberos, ZFS, Samba)
├── solaris 192.168.88.51 FreeBSD 14.5
├── raspberry 192.168.88.244 Raspberry Pi 3B + Pi-Hole
└── demás dispositivos
Usuario: adslppp@telefonicanetpa Contraseña: adslppp
Este HGU tiene un comportamiento específico que conviene documentar antes de tocarlo. En monopuesto, delega la conexión de Internet al router neutro mediante PPPoE, pero sigue gestionando la VoIP del teléfono fijo. Es exactamente lo que queremos.
| Modelo / Board ID | GPT-2541GNAC |
| Firmware | ES_g7.12_100VNJ0b73 |
| Build | 230705_2059 → 5 de julio de 2023 |
| Bootloader | 1.0.41-117.134 |
| Wireless driver | 6.37.14.4803.cpe4.14L04Apatch1.0 |
Enable IGMP Multicast Proxy
y Enable IGMP Multicast Source. No dar el cambio por bueno hasta que
hayan pasado al menos 48 horas sin incidencias.
ether1 del ax³.PPP → Interface → + → PPPoE Client.pppoe-o2ether1adslppp@telefonicanetpaadslpppComprobar que la sesión levanta:
/interface pppoe-client monitor [find] once /log print where topics~"pppoe"
ether1 para obtener una IP en la LAN del HGU
(192.168.1.0/24), lo que permite acceder a la interfaz web del MitraStar
si hace falta. Pero ese cliente debe tener add-default-route=no. Si lo
activamos, RouterOS añade una ruta 0.0.0.0/0 via 192.168.1.1 que
reintroduce el doble NAT que acabamos de eliminar.
/ip dhcp-client set [find interface=ether1] add-default-route=no /interface pppoe-client set [find name=pppoe-o2] add-default-route=yes
Verificar que la única ruta por defecto es la del PPPoE:
/ip route print where dst-address=0.0.0.0/0
Debe aparecer una sola ruta por defecto en la tabla main:
DAv 0.0.0.0/0 gateway=pppoe-o2 distance=1
Con Internet funcionando en el ax³, ya se puede montar el resto de la infraestructura: WireGuard, ProtonVPN, policy routing, kill switch y DNS definitivo. Esta fase es la más delicada del proyecto, porque cualquier error aquí no rompe la red entera, pero sí deja dispositivos sin Internet de forma difícil de diagnosticar.
ProtonVPN ofrece configuración WireGuard lista para importar. Desde el panel de ProtonVPN se genera un archivo con clave privada, clave pública del servidor, endpoint y AllowedIPs. Se importa directamente en RouterOS:
WireGuard → Interface → + → Import from file
Comprobar que el túnel levanta:
/interface wireguard print /interface wireguard peers print /ping 10.2.0.1 count=3 interface=proton-vpn
AllowedIPs
del peer incluye 0.0.0.0/0. Si solo incluye rangos parciales, algunos
destinos no pasarán por la VPN aunque los marques con routing-mark.
El objetivo es que cada dispositivo pueda salir por WAN normal o por ProtonVPN según una política definida. En RouterOS esto se hace combinando tres piezas:
prerouting).routing-mark en
prerouting sin marcar antes la conexión. Funciona en el 90% de los casos,
pero falla con NAT, con retorno asimétrico y cuando una conexión se reutiliza. El
patrón robusto es siempre primero marcar conexión, después marcar routing.
0 No marcar tráfico LAN dst-address-list=lan-directa 1-2 Dummy (dinámicas) 3 change-mss 1452 out-interface=pppoe-o2 4 Marcar conexión de xiaomi src-address=192.168.88.252 5 Marcar conexión de solaris src-address=192.168.88.51 6 Enrutar xiaomi por VPN connection-mark=xiaomi-vpn 7 Enrutar solaris por VPN connection-mark=solaris-vpn 8 change-mss 1380 out-interface=proton-vpn
Antes de cualquier regla de marcado, hay que excluir el tráfico destinado a la propia
LAN. Si no, el tráfico hacia Pi-Hole, Unbound o cualquier host local se marca con
via-vpn, y como la tabla via-vpn no tiene ruta a
192.168.88.0/24, esas consultas se van por el túnel en lugar de entregarse
localmente. El síntoma es desconcertante: parece que "no hay Internet", pero el ping
por IP funciona.
/ip firewall address-list add list=lan-directa address=192.168.88.0/24 comment="LAN principal" add list=lan-directa address=192.168.1.0/24 comment="LAN del HGU O2" add list=lan-directa address=10.2.0.0/24 comment="Red interna ProtonVPN"
Y la regla de exclusión, al principio de prerouting:
/ip firewall mangle
add chain=prerouting dst-address-list=lan-directa action=return \
comment="No marcar tráfico LAN"
place-before=0 falla (RouterOS no acepta referencias
a reglas dinámicas), añade la regla al final y muévela después con
move [find comment~"No marcar"] destination=[find comment~"Marcar conexin de xiaomi"].
Lo importante es que esté antes de cualquier mark-connection
o mark-routing.
/ip firewall mangle
add chain=prerouting src-address=192.168.88.252 in-interface=bridge \
action=mark-connection new-connection-mark=xiaomi-vpn passthrough=yes \
comment="Marcar conexión de xiaomi"
add chain=prerouting src-address=192.168.88.51 in-interface=bridge \
action=mark-connection new-connection-mark=solaris-vpn passthrough=yes \
comment="Marcar conexión de solaris"
El passthrough=yes es importante: después de marcar la conexión, el paquete
sigue evaluándose contra las reglas siguientes, que serán las que lean esa marca.
/ip firewall mangle
add chain=prerouting connection-mark=xiaomi-vpn \
action=mark-routing new-routing-mark=via-vpn passthrough=no \
comment="Enrutar xiaomi por VPN"
add chain=prerouting connection-mark=solaris-vpn \
action=mark-routing new-routing-mark=via-vpn passthrough=no \
comment="Enrutar solaris por VPN"
El passthrough=no ahorra ciclos de CPU: una vez marcado el routing, no hace
falta seguir evaluando más reglas de mangle.
La tabla via-vpn debe tener dos rutas: una activa por el túnel y otra
blackhole de respaldo. Si el túnel cae, la activa desaparece y entra la
blackhole, que descarta el tráfico marcado. Es un kill switch a nivel de routing, sin
necesidad de reglas de firewall adicionales.
/ip route
add dst-address=0.0.0.0/0 gateway=proton-vpn routing-table=via-vpn distance=1 \
comment="Salida por ProtonVPN"
add dst-address=0.0.0.0/0 type=blackhole routing-table=via-vpn distance=2 \
comment="Kill switch: descartar si el túnel cae"
El MSS (Maximum Segment Size) es el tamaño máximo de payload TCP. Si se configura mal, se produce fragmentación o drops silenciosos: algunas webs cargan, otras se quedan colgadas, y parece que "no hay Internet" cuando en realidad es un problema de MTU.
/ip firewall mangle
add chain=forward protocol=tcp tcp-flags=syn out-interface=pppoe-o2 \
action=change-mss new-mss=1452 passthrough=yes \
comment="MSS para PPPoE (MTU 1492)"
add chain=forward protocol=tcp tcp-flags=syn out-interface=proton-vpn \
action=change-mss new-mss=1380 passthrough=yes \
comment="MSS para túnel WireGuard (MTU 1420)"
| Interfaz | MTU | MSS | Fórmula |
|---|---|---|---|
pppoe-o2 |
1492 | 1452 | 1492 − 40 (IP+TCP) |
proton-vpn |
1420 | 1380 | 1420 − 40 (IP+TCP) |
bridge (LAN) |
1500 | 1460 | 1500 − 40 (IP+TCP) |
El firewall del ax³ tiene una regla que acepta el tráfico de LAN hacia WAN, pero el
túnel proton-vpn normalmente no está en la lista WAN.
Sin una regla específica, el tráfico que sale por el túnel cae en el
Drop todo lo demás y se descarta.
/ip firewall filter
add chain=forward in-interface-list=LAN out-interface=proton-vpn \
action=accept comment="Permitir LAN a VPN" \
place-before=[find comment="Drop todo lo dems"]
Clientes de la LAN │ ▼ Pi-Hole (raspberry.casa.lan / 192.168.88.244) │ ▼ Unbound (tormenta.casa.lan / 192.168.88.160) │ ▼ Resolución recursiva directa (sin DNS externos)
En el ax³, dos ajustes complementarios:
# 1. El DHCP entrega solo Pi-Hole como DNS /ip dhcp-server network set [find] dns-server=192.168.88.244 # 2. El router no actúa como resolver DNS /ip dns set allow-remote-requests=no
192.168.88.1:53 que se salta Pi-Hole y Unbound. Eso
rompe el filtrado y puede filtrar metadatos al ISP si el router reenvía al DNS del
operador.
/ip firewall mangle print stats
| Regla | Debe tener paquetes | Comentario |
|---|---|---|
| No marcar tráfico LAN | ✅ | Ping a Pi-Hole, Unbound, etc. |
| Marcar conexión de xiaomi | ✅ | Primer paquete de cada conexión |
| Marcar conexión de solaris | ✅ | Primer paquete de cada conexión |
| Enrutar xiaomi por VPN | ✅ | Todos los paquetes de la conexión |
| Enrutar solaris por VPN | ✅ | Todos los paquetes de la conexión |
| MSS túnel WireGuard | ✅ | Solo paquetes SYN que salen por el túnel |
# Desde solaris ping -c 3 192.168.88.244 # Pi-Hole (debe funcionar) ping -c 3 1.1.1.1 # Internet por IP (por el túnel) ping -c 3 google.com # DNS (por Pi-Hole) curl -s ifconfig.me # IP pública (debe ser de ProtonVPN)
curl ifconfig.me devuelve una IP
distinta a la de O2 (que es la que devolverá desde cualquier dispositivo que NO esté
en la lista de clientes VPN).
/interface wireguard disable proton-vpn
ping -c 3 1.1.1.1
ping -c 3 192.168.88.244
/interface wireguard enable proton-vpn
curl -s ifconfig.me
Llegados a este punto, el ax³ funciona en 192.168.50.0/24 con Internet,
PPPoE, VPN, policy routing y DNS completo. Solo falta el cambio final: apagar el ac²
y migrar el ax³ a 192.168.88.0/24.
O2 monopuesto
│
▼
hAP ax³
│
192.168.88.0/24
│
tormenta + solaris + raspberry + resto de LAN
192.168.50.1/24 a 192.168.88.1/24.192.168.88.0/24.192.168.88.10-192.168.88.254.192.168.88.1.# Desde un cliente de la LAN curl -s ifconfig.me # Debe devolver la IP pública de O2 # Desde el ax³ /ip route print where dst-address=0.0.0.0/0 /interface pppoe-client monitor [find] once /ip firewall mangle print stats
| Punto de no retorno | Síntoma | Acción de reversión |
|---|---|---|
| Antes de monopuesto | Todo funciona con doble NAT | Nada que revertir. Seguir probando. |
| Tras activar monopuesto | VoIP deja de funcionar | Volver a modo router en el MitraStar |
| Tras activar monopuesto | El ax³ no levanta PPPoE | Volver a modo router en el MitraStar |
| Tras el corte final | Fallo grave en el ax³ | Reenchufar el ac² tal cual estaba |
| Tras el corte final | Fugas DNS o kill switch roto | Volver al ac² y revisar reglas |
ES_g7.12_100VNJ0b73.
Alternativa si se quiere insistir en monopuesto:
Enable IGMP Multicast Proxy y Enable IGMP Multicast Source.Diagnóstico rápido:
/interface pppoe-client monitor [find] once /log print where topics~"pppoe"
Comprobaciones:
Usuario: adslppp@telefonicanetpa Contraseña: adslppp
ether1.ether1.ether1 no esté dentro del bridge.ether1 del ax³.# Fuga DNS nslookup whoami.akamai.net nslookup dnsleaktest.com # Kill switch (con el túnel caído) ping 1.1.1.1 curl ifconfig.me
Reversión inmediata:
Reglas preventivas:
/system safe-mode
Si aun así queda inaccesible:
Filosofía del plan: el objetivo no es que no falle nada, sino que si falla algo, en menos de 10 minutos todo el mundo esté navegando como antes. La migración se hace cuando se puede permitir el lujo de fallar; no cuando no hay margen.
192.168.88.0/24 para
tormenta, solaris y raspberry.address-list=vpn-clients
cuando la lista de dispositivos VPN crezca.192.168.50.1/24.192.168.50.0/24.192.168.50.10-192.168.50.254.192.168.50.254.adslppp@telefonicanetpa / adslppp.mark-connection + mark-routing.lan-directa) al principio del mangle.allow-remote-requests=no en /ip dns.192.168.88.244 como DNS.192.168.88.0/24.curl ifconfig.me).Serie: este artículo cierra Proyecto ax³. Viene de la Parte 1 — Qué cambia y por qué y de la Parte 2 — Preparar el ax³ sin tocar la red.FreeBSD es genial!.
Volver al índice de la serie · Cheatsheet RouterOS
En la Parte 1 vimos el objetivo, la comparativa entre el hAP ac² y el
hAP ax³ y la arquitectura final del proyecto. En esta segunda parte entramos en materia:
cómo preparar el hAP ax³ completamente aislado de la red de producción,
sobre una red temporal 192.168.50.0/24, sin tocar en ningún momento el
hAP ac² ni el MitraStar.
La idea es sencilla: durante toda esta fase, el ax³ no tiene salida a Internet y no
conoce la red 192.168.88.0/24. Es un laboratorio cerrado, con un único
portátil conectado por cable, donde se construye el router desde cero.
Antes de tocar nada del ax³, hay que garantizar que la red de producción queda intacta. Esto implica tres reglas que no se negocian.
192.168.88.0/24.hAP ac² ─── RED ACTUAL 192.168.88.0/24 ─── TODO NORMAL hAP ax³ ─── portátil ─── SIN WAN
192.168.88.0/24) en el mismo segmento, se producirán conflictos de DHCP
y de puerta de enlace difíciles de diagnosticar.
Sacamos el ax³ de la caja, lo conectamos a un portátil por cable y comprobamos su estado de fábrica. Nada más. Sin configuración, sin cambios.
Comprobar la IP que ha recibido el portátil:
# Windows ipconfig # FreeBSD / Linux ifconfig route -n get default
Entrar por WinBox o WebFig:
WebFig: http://192.168.88.1 WinBox: Neighbors → seleccionar el ax³ → Connect
Hacer el primer backup desde WinBox:
Files → Backup → nombre: ax3-inicial.backup
Y descargarlo al portátil antes de continuar:
Files → seleccionar el .backup → Download
En este proyecto, RouterOS ya estaba actualizado a 7.21.5, pero el firmware
del RouterBOARD seguía en 7.20.8. Hay que igualarlos: RouterOS y firmware
deben coincidir para evitar comportamientos extraños.
System → Packages → Check For Updates → Download & Install System → Reboot
System → RouterBOARD → Upgrade → Confirmar System → Reboot
Tras el reinicio, volver a System → RouterBOARD y comprobar:
Current Firmware: 7.21.5 Upgrade Firmware: 7.21.5
Después de actualizar, hacer un nuevo backup y descargarlo:
Files → Backup → nombre: ax3-post-upgrade.backup
El ax³ sale de fábrica con 192.168.88.1/24, exactamente la misma red que
la red de producción. Para evitar cualquier confusión, lo movemos temporalmente a
192.168.50.0/24.
LAN laboratorio: 192.168.50.0/24 hAP ax³: 192.168.50.1 PC: 192.168.50.254
MAC del ax³ en este equipo:
D0:EA:11:DF:9B:80
IP → Addresses.192.168.88.1/24.192.168.50.1/24.bridge).WinBox puede perder momentáneamente la conexión IP. No cerrar la ventana.
En Windows 10, configurar manualmente:
IP: 192.168.50.254 Máscara: 255.255.255.0 Puerta enlace: (vacía) DNS: (vacío)
Reconectar WinBox por MAC y comprobar que el router sigue accesible.
El ax³ trae de fábrica una red DHCP en 192.168.88.0/24 que ya no tiene
sentido. Hay que moverla a la nueva red del laboratorio.
IP → DHCP Server → Networks:
Address: 192.168.50.0/24 Gateway: 192.168.50.1 DNS: 192.168.50.1
IP → Pool, editar default-dhcp:
192.168.50.10-192.168.50.254
Comprobar en IP → DHCP Server → DHCP que el servidor DHCP está asociado
al bridge y activo.
192.168.50.0/24,
el portátil tiene IP fija 192.168.50.254, y WinBox se conecta por MAC.
Todavía no hay Internet, no hay firewall, no hay Wi-Fi configurado.
Con el laboratorio en marcha, ya se puede construir el router pieza a pieza. Todo esto se hace sin WAN, sin Internet, sin conexión al MitraStar. Es preparación pura.
admin o usuario nuevo).192.168.50.0/24.ether1 como WAN, resto en bridge LAN.ether1 → WAN (sin bridge) ether2..ether5 → LAN (dentro del bridge) wlan1 / wlan2 → LAN (dentro del bridge)
ether1.Reglas mínimas que deben quedar activas antes de la Parte 3:
input: - accept established,related - accept ICMP desde LAN - accept WinBox desde LAN - drop all from WAN - drop all invalid forward: - accept established,related - accept LAN → WAN - drop all invalid nat: - masquerade out-interface=ether1
/system safe-modeSi se pierde la sesión por una regla mal puesta, RouterOS revierte los cambios automáticamente al reiniciar.
Files → Backup → nombre: ax3-base-192.168.50.backup
Descargarlo al portátil. Guardarlo junto al resto de backups de la serie.
Durante la Parte 2, la red de producción no corre ningún riesgo: el ax³ está aislado. El único escenario de reversión posible es perder el acceso al ax³ mientras se configura.
D0:EA:11:DF:9B:80).Reset durante el
arranque para volver a configuración de fábrica y restaurar el último backup.Files → seleccionar el .backup → Restore → RebootY volver a aplicar la IP
192.168.50.1/24 si hiciera falta.
Con el ax³ actualizado, en 192.168.50.1/24, con DHCP funcionando, Wi-Fi 6
configurado, firewall básico y backups en orden, la Parte 3 entra en el terreno delicado.
192.168.88.0/24 y pruebas de producción.Idea clave: al terminar la Parte 2, el ax³ está listo para entrar en producción, pero todavía no ha visto Internet. El único riesgo real empieza en la Parte 3, y es ahí donde el plan de reversión deja de ser teoría.
Serie: este artículo es la Parte 2 de Proyecto ax³. Viene de la Parte 1 — Qué cambia y por qué y continúa en la Parte 3 — Monopuesto, VPN y corte final.FreeBSD es genial!.
Volver al índice de la serie · Cheatsheet RouterOS
Este es el primero de una serie de tres artículos en los que documento la sustitución del router principal de casa —un MikroTik hAP ac²— por un MikroTik hAP ax³, aprovechando la ocasión para reorganizar por completo la red: separar servicios, eliminar el doble NAT, integrar VPN por WireGuard con ProtonVPN y dejar el DNS en manos de Pi-Hole y Unbound.
La serie está pensada como una guía reproducible, no como un simple “cambio de router”. El hilo conductor es sencillo: nada se toca hasta que lo nuevo está probado. El hAP ac² permanece funcionando exactamente igual durante todo el proceso y solo se desconecta cuando el ax³ ya está listo para entrar en producción.
192.168.50.0/24.192.168.88.0/24.tormenta.192.168.50.0/24).
Solo se produce el corte cuando todo está probado y hay un plan de reversión ensayado.
Antes de justificar la migración, conviene ver qué cambia realmente entre los dos equipos. La diferencia no es solo Wi-Fi 6: hay un salto generacional claro en CPU, RAM, almacenamiento y en la licencia de RouterOS.
| Característica | MikroTik hAP ac² | MikroTik hAP ax³ |
|---|---|---|
| Estándar Wi-Fi | Wi-Fi 5 (802.11a/b/g/n/ac) | Wi-Fi 6 (802.11a/b/g/n/ac/ax) |
| Velocidad inalámbrica | AC1200 (300 + 867 Mbps) | AX1800 (574 + 1200 Mbps) |
| Antenas | Internas (2.5 dBi) | Externas alta ganancia (3.3 / 5.5 dBi) |
| CPU | IPQ-4018, 4 núcleos 716 MHz, 32-bit | IPQ-6010, 4 núcleos hasta 1.8 GHz, 64-bit |
| RAM | 128 MB | 1 GB |
| Almacenamiento | 16 MB Flash | 128 MB NAND |
| Ethernet | 5 × Gigabit | 4 × Gigabit + 1 × 2.5 Gigabit |
| USB | 1 × USB 2.0 tipo A | 1 × USB 3.0 tipo A |
| PoE-out | No | Sí, en Ether1, Passive PoE |
| Licencia RouterOS | Nivel 4 | Nivel 6 (completa) |
| Diseño | Compacto vertical / horizontal | Sobremesa con antenas externas |
Los puntos decisivos para este proyecto son tres: la CPU de 64 bits (necesaria para WireGuard y policy routing sin ahogos), la RAM de 1 GB (imprescindible si se manejan muchas reglas y listas) y la licencia RouterOS Nivel 6, que desbloquea funciones avanzadas que el ac² no tiene.
Hoy todo depende del hAP ac², que hace de router, firewall, DHCP y punto de acceso.
Detrás, en la misma red 192.168.88.0/24, conviven los equipos de casa:
tormenta (FreeBSD 14.5, con Unbound, NFSv4, Kerberos, ZFS y Samba),
solaris (también FreeBSD 14.5) y la Raspberry Pi con Pi-Hole.
INTERNET │ Router o2 (MitraStar GPT-2541GNAC) │ hAP ac² │ 192.168.88.0/24 │ ├── tormenta 192.168.88.160 FreeBSD 14.5 (Unbound, NFSv4, Kerberos, ZFS, Samba) ├── solaris 192.168.88.51 FreeBSD 14.5 ├── raspberry 192.168.88.244 Raspberry Pi 3B + Pi-Hole └── demás dispositivos
El MitraStar pasa a modo monopuesto: delega la conexión de Internet al router neutro mediante PPPoE y se queda únicamente gestionando la VoIP del teléfono fijo. El hAP ax³ pasa a ser el router real de la casa, con IP pública, firewall, NAT, WireGuard, ProtonVPN y policy routing. El DNS se delega en Pi-Hole y Unbound.
o2 / Internet
│
Fibra óptica
│
┌─────────────────────────┐
│ MitraStar GPT-2541GNAC │
│ MONOPUESTO │
│ SIN NAT │
│ Teléfono ─── VoIP │
└────────────┬────────────┘
│ Ethernet / PPPoE
▼
┌─────────────────────────┐
│ hAP ax³ │
│ PPPoE + NAT + Firewall │
│ WireGuard + ProtonVPN │
│ Policy routing │
└────────────┬────────────┘
│
192.168.88.0/24
│
├── tormenta 192.168.88.160 FreeBSD 14.5 (Unbound, NFSv4, Kerberos, ZFS, Samba)
├── solaris 192.168.88.51 FreeBSD 14.5
├── raspberry 192.168.88.244 Raspberry Pi 3B + Pi-Hole
└── demás dispositivos
El reparto de responsabilidades es deliberado: el router se queda con lo que debe ser
siempre del router (red, firewall, NAT, VPN), la Raspberry Pi se encarga del filtrado
DNS con Pi-Hole, y tormenta se queda con lo que se beneficia de un sistema
operativo completo (DNS recursivo con Unbound, almacenamiento, autenticación).
| Servicio | hAP ax³ | tormenta |
|---|---|---|
| Router / NAT | ✅ | |
| Firewall | ✅ | |
| DHCP | ✅ | |
| Unbound | ❌ | ✅ |
| WireGuard | ✅ | |
| ProtonVPN | ✅ | |
| Policy routing | ✅ | |
| NFSv4 | ✅ | |
| Kerberos | ✅ | |
| ZFS | ✅ | |
| Samba | ✅ |
Servicios adicionales que no viven en el hAP ax³ ni en tormenta:
| Servicio | Host | IP | Sistema |
|---|---|---|---|
| Pi-Hole | raspberry.casa.lan |
192.168.88.244 |
Raspberry Pi 3B |
Inventario de la red:
tormenta.casa.lan → 192.168.88.160 — FreeBSD 14.5. Unbound, NFSv4, Kerberos, ZFS, Samba.solaris.casa.lan → 192.168.88.51 — FreeBSD 14.5. Cliente de la red.raspberry.casa.lan → 192.168.88.244 — Raspberry Pi 3B con Pi-Hole.raspberry.casa.lan), y Pi-Hole reenvía a Unbound
(tormenta.casa.lan), que resuelve de forma recursiva. Así se combina el
filtrado de Pi-Hole con la resolución recursiva de Unbound, sin depender de DNS externos.
Con el objetivo y la arquitectura ya claros, la Parte 2 entra en materia: cómo preparar
el hAP ax³ completamente aislado de la red actual, en
192.168.50.0/24, sin tocar nada del hAP ac² ni del MitraStar.
192.168.50.0/24.Filosofía de la serie: el objetivo no es solo migrar, sino poder volver atrás en menos de 10 minutos si algo falla. Esa garantía es lo que convierte un cambio de router en un proyecto controlado.
Serie: este artículo es la Parte 1 de Proyecto ax³. Continúa en la Parte 2 — Preparar el ax³ sin tocar la red.FreeBSD es genial!.
Volver al índice de la serie · Cheatsheet RouterOS