El Refugio Collado está a 2.000 metros y, de noviembre a mayo, no sube nadie. Su hEX tiene que arreglárselas solo: en ether1 llega la fibra; en ether2, un router 4G de respaldo; en ether3, el PC del guarda; y en ether4, la wifi de los huéspedes. Lo que hasta ahora hacías en Winbox, aquí lo hace el router por su cuenta: scripts, el scheduler (a su hora) y netwatch (cuando algo cae). Todo empieza en la consola.
La consola: where y find
En la consola te mueves por los menús como por carpetas (/ip route, .. para subir, / para
la raíz), Tab completa y F1 dice lo que puede ir. print enseña una lista; con where,
solo lo que cumple una condición: =, !=, ~ (lleva), <, >, con and, or, ! y
paréntesis.
[admin@R-Collado] > /ip route print where gateway=203.0.113.1 Flags: A - ACTIVE; s - STATIC Columns: DST-ADDRESS, GATEWAY, ROUTING-TABLE, DISTANCE # DST-ADDRESS GATEWAY ROUTING-TABLE DISTANCE ;;; Fibra 0 As 0.0.0.0/0 203.0.113.1 main 1 ;;; Vigia 1 As 1.1.1.1/32 203.0.113.1 main 1
find busca lo mismo, pero no enseña nada: devuelve las filas, para hacerles algo a todas de una vez. Va entre corchetes, como argumento de otra orden.
[admin@R-Collado] > /ip route disable [find gateway=192.168.8.1]
print count-only dice cuántas hay; print terse, una fila por línea, todo junto; y
print proplist=name,running, solo esas columnas.
Ejercicio
Las rutas del 4G, de una vez
El operador del 4G avisa de que corta el servicio esta semana. Apaga todas las rutas que van por el 4G (gateway 192.168.8.1): son varias, y con find y where se apagan de una vez. Las de la fibra se quedan como están.
Encendiendo el router…
export e import: la copia en texto
export escribe la configuración como las órdenes que la crean: se lee, se compara y se pega en
otro router. Sin nada, todo; desde un menú, solo lo suyo (/ip address export). Con file=, en
vez de enseñarlo, lo guarda en un archivo .rsc (en Winbox, en Files).
[admin@R-Collado] > /export file=refugio
[admin@R-Collado] > /file print Columns: NAME, TYPE, SIZE, LAST-MODIFIED # NAME TYPE SIZE LAST-MODIFIED 0 skins directory 2026-10-19 09:00:00 1 refugio.rsc script 782 2026-10-19 09:00:00
import hace lo que lleva el archivo, línea a línea, como si lo escribieras tú.
[admin@R-Collado] > /import file-name=refugio.rsc Script Error: failure: already have such address (/ip/address/add; line 9)
Ejercicio
La copia, en un archivo
Antes de que suba el último guarda, deja una copia de toda la configuración en un archivo del router: refugio.rsc. Es texto: se puede leer, y con import vuelve.
Encendiendo el router…
El lenguaje de scripts
Lo que empieza por dos puntos es del lenguaje: :put enseña algo, :log lo apunta en el log,
:local y :global guardan valores. Las cuentas van entre paréntesis, y lo que devuelve una
orden, entre corchetes.
[admin@R-Collado] > :put ("altura: " . 2000) altura: 2000
[admin@R-Collado] > :put [/ip address get [find interface=ether3] address] 192.168.88.1/24
[admin@R-Collado] > :foreach i in=[/interface find] do={ :put [/interface get $i name] } ether1 ether2 ether3 ether4 ether5 lo
Hay :if (…) do={…} else={…}, :for i from=1 to=3 do={…}, :len (cuánto mide algo), :pick
(un trozo), :delay 2s (esperar) y :do {…} on-error={…} (si falla, hacer otra cosa).
Los scripts del router
Un script con nombre se guarda en /system script (en Winbox, System ▸ Scripts) y se hace con
run (o con Run Script). Cada vez cuenta una más y apunta cuándo.
[admin@R-Collado] > /system script add name=estado source=":log info (\"Refugio: \" . [/system identity get name] . \" en marcha\")"
[admin@R-Collado] > /system script run estado
[admin@R-Collado] > /log print where topics~"script" 2026-10-19 09:05:40 script,info Refugio: R-Collado en marcha
Ejercicio
El parte en el log
Crea un script, parte, que deje en el log cuántas interfaces tienen enlace, así: «Refugio: 5 interfaces con enlace». Que lo cuente él cada vez (si cae un cable, que diga uno menos), no que lleve el número escrito.
Encendiendo el router…
El scheduler: a su hora
/system scheduler (System ▸ Scheduler) hace algo a una hora (start-time) y luego cada
interval. on-event es el nombre de un script o el código mismo. Con start-time=startup, al
arrancar el router.
[admin@R-Collado] > /system scheduler add name=copia-noche start-time=03:00:00 interval=1d on-event=copia
[admin@R-Collado] > /system scheduler print Columns: NAME, START-DATE, START-TIME, INTERVAL, ON-EVENT, RUN-COUNT # NAME START-DATE START-TIME INTERVAL ON-EVENT R 0 copia-noche 2026-10-19 03:00:00 1d copia 0
Ejercicio
El silencio nocturno
En el refugio, de 23:00 a 07:00 hay silencio: la wifi de los huéspedes (ether4) se apaga a las 23:00 y vuelve a las 07:00, cada día. Con el scheduler, sin que nadie tenga que acordarse.
Encendiendo el router…
netwatch: cuando algo cae
/tool netwatch (Tools ▸ Netwatch) mira a un host cada interval: si deja de contestar, hace su
down-script; si vuelve, su up-script. Con él, el refugio pasa al 4G solo. Cada uno puede llevar
varias órdenes, separadas por punto y coma: desactivar la ruta y, además, apuntarlo con
:log warning "…" (o :log info "…"). El refugio sale por la ruta por defecto activa con menos
distance: la de la fibra (1) y, si está desactivada, la del 4G (2); si la desactivas a mano para
probar, se queda así hasta que alguien la vuelva a activar.
La trampa: si vigilas 8.8.8.8 y apagas la ruta de la fibra, 8.8.8.8 vuelve a contestar… por el
4G, y netwatch cree que la fibra ha vuelto. Por eso se vigila un host al que solo se llega por
la fibra: una ruta propia, 1.1.1.1/32 por la fibra, la vigía.
[admin@R-Collado] > /tool netwatch add host=1.1.1.1 interval=10s down-script="/ip route disable [find comment=Fibra]" up-script="/ip route enable [find comment=Fibra]"
[admin@R-Collado] > /tool netwatch print Columns: TYPE, HOST, TIMEOUT, INTERVAL, STATUS # TYPE HOST TIMEOUT INTERVAL STATUS ;;; Warning: probe waiting startup-delay=5m; 5m remaining 0 simple 1.1.1.1 10s unknown
Ejercicio
Si cae la fibra, el 4G
Cuando la fibra se queda muda, el enlace sigue arriba: el router no se entera y lo sigue mandando todo por ella. Vigila 1.1.1.1 (solo se llega por la fibra: ya tiene su ruta) con netwatch: si deja de contestar, desactiva la ruta de la fibra (comment=Fibra); si vuelve, actívala.
Encendiendo el router…
Cuando un script falla
Un script que falla para en la orden que falla, y lo apunta en el log (script,error): si lo
lanzó el scheduler, con su nombre y la línea.
[admin@R-Collado] > /log print where topics~"error" 2026-10-19 08:55:02 script,error executing script 2026-10-19 08:55:02 script,error,debug (scheduler:arranque) no such item (/interface/enable; line 1)
Ejercicio
El arranque que falla
Tras el último corte de luz, la wifi de los huéspedes no volvió: el instalador dejó un script que la enciende al arrancar (el scheduler lo lanza en startup), pero falla. Mira el log, arregla el script y comprueba que, al arrancar, la wifi vuelve y el log dice «Refugio en marcha».
Encendiendo el router…
Lo del tema, en Winbox
| Para | En la consola | En Winbox |
|---|---|---|
| Lo que cumple algo | /ip route print where gateway=… |
El buscador (Find) de cada lista |
| La copia en texto | /export file=refugio |
New Terminal (y Files para verla) |
| Un script | /system script add name=… source=… |
System ▸ Scripts ▸ + |
| Hacerlo | /system script run estado |
Run Script |
| A su hora | /system scheduler add start-time=… interval=… on-event=… |
System ▸ Scheduler ▸ + |
| Si algo cae | /tool netwatch add host=… down-script=… up-script=… |
Tools ▸ Netwatch ▸ + |
| Lo que pasó | /log print where … |
Log |