Che cos’è il lease-script?

È un campo del server DHCP (/ip dhcp-server) dove scrivi un piccolo script RouterOS. Il router lo esegue in due momenti:

  • quando assegna un indirizzo a un client (lease “bound”);
  • quando il lease viene liberato, perché il client l’ha rilasciato o perché è scaduto.

E quando il client rinnova? Niente: l’ho provato in laboratorio con un lease da 2 minuti, il client rinnovava ogni minuto e lo script è rimasto zitto. Ottima notizia: un avviso non ti arriva a ogni rinnovo, ma solo quando un dispositivo entra o esce davvero.

Dentro lo script trovi già pronte queste variabili:

  • $leaseBound: vale 1 quando l’indirizzo viene assegnato, 0 quando viene liberato o scade;
  • $leaseServerName: il nome del server DHCP;
  • $leaseActMAC: il MAC address del client;
  • $leaseActIP: l’indirizzo IP del lease;
  • $"lease-hostname": il nome che il client ha dichiarato, se l’ha dichiarato (il trattino obbliga a scriverlo fra virgolette);
  • $"lease-options": le opzioni DHCP mandate al client, indicizzate per numero di opzione;
  • $"lease-agent-circuit-id" e $"lease-agent-remote-id": switch e porta da cui arriva il client, quando la richiesta passa da un relay o da uno switch con Option 82.

L’elenco completo delle proprietà del server, lease-script compreso, è nel manuale MikroTik: DHCP Server Properties.

Schema: dispositivo che chiede un indirizzo al DHCP server del MikroTik, il lease-script che manda un avviso e aggiorna una address list
A ogni nuova assegnazione il server DHCP lancia lo script: può avvisarti, o dare al client un accesso a tempo.

Passo 1: su quale server DHCP lavoro?

Lo script si attacca a un server DHCP preciso. Guarda come si chiamano i tuoi:

/ip dhcp-server print

Negli esempi il server si chiama dhcp-lan: sostituisci il nome con il tuo. Se hai più server (LAN, ospiti, telecamere), ognuno ha il suo lease-script.

Passo 2: come lo provo senza fare danni?

Con uno script che si limita a scrivere nel log. È il “prova microfono” del lease-script:

/ip dhcp-server set [find name=dhcp-lan] lease-script={
    :if ($leaseBound = 1) do={
        :log info ("DHCP " . $leaseServerName . ": assegnato " . $leaseActIP . " a " . $leaseActMAC . " (" . $"lease-hostname" . ")")
    } else={
        :log info ("DHCP " . $leaseServerName . ": liberato " . $leaseActIP . " da " . $leaseActMAC)
    }
}

Scollega e ricollega un dispositivo, poi guarda il log:

/log print where topics~"script"

In laboratorio, staccando e riattaccando un PC Linux, è uscito questo:

script,info DHCP dhcp-lan: liberato 192.168.88.199 da 50:00:00:1E:00:00
script,info DHCP dhcp-lan: assegnato 192.168.88.199 a 50:00:00:1E:00:00 (pc7a)

Passo 3: come ricevo un avviso quando entra un dispositivo nuovo?

L’idea: i dispositivi che conosci hanno un lease statico, quelli che non conosci no. Lo script avvisa solo per i secondi. Prima però il router deve saper mandare la posta: c’è un howto dedicato a inviare email da MikroTik con Gmail.

/ip dhcp-server set [find name=dhcp-lan] lease-script={
    :if ($leaseBound = 1) do={
        :local noto [/ip dhcp-server lease find where mac-address=$leaseActMAC and dynamic=no]
        :if ([:len $noto] = 0) do={
            :log warning ("Dispositivo sconosciuto: " . $leaseActMAC . " " . $leaseActIP)
            /tool e-mail send to="admin@example.com" subject=("Nuovo dispositivo sulla LAN: " . $leaseActMAC) \
                body=("IP " . $leaseActIP . ", nome " . $"lease-hostname" . ", server " . $leaseServerName)
        }
    }
}

Cambia admin@example.com con il tuo indirizzo. La riga nel log resta anche se la mail non parte: è il tuo promemoria.

Passo 4: come rendo “noto” un dispositivo?

Trasformando il suo lease in statico. Da quel momento lo script lo riconosce e smette di segnalarlo:

/ip dhcp-server lease make-static [find where mac-address="AA:BB:CC:DD:EE:FF"]
/ip dhcp-server lease print where dynamic=no

Da WinBox è ancora più rapido: IP → DHCP Server → Leases, tasto destro sul lease e Make Static.

⚠️ Attenzione: molti smartphone usano un MAC address casuale per ogni rete WiFi. Di solito resta lo stesso finché il telefono si collega alla stessa rete, ma se l’utente lo rigenera dalle impostazioni, per il router è un dispositivo nuovo e lo script lo segnala di nuovo.

Passo 5: come do un accesso temporaneo a un client?

Era l’idea dell’articolo originale: aprire per qualche minuto un servizio a ogni nuovo client, per esempio un login social sull’hotspot. In RouterOS 7 lo strumento giusto è l’address list con timeout: l’indirizzo sparisce da solo allo scadere del tempo, senza un secondo script che lo tolga.

/ip dhcp-server set [find name=dhcp-ospiti] lease-script={
    :if ($leaseBound = 1) do={
        /ip firewall address-list add list=accesso-temporaneo address=$leaseActIP \
            timeout=10m comment=$leaseActMAC
    } else={
        /ip firewall address-list remove [find list=accesso-temporaneo address=$leaseActIP]
    }
}

Controlla che il client entri nella lista:

/ip firewall address-list print where list=accesso-temporaneo

Il client compare come voce dinamica, con il conto alla rovescia del timeout e il suo MAC nel commento. A quel punto una regola di firewall o di walled garden può usare src-address-list=accesso-temporaneo: nell’hotspot, per esempio, puoi aprire un sito ai soli client presenti nella lista.

Passo 6: come scopro se lo script ha un errore?

Gli errori del lease-script non compaiono a video: finiscono nel log. Per esempio, lo script del passo 3 su un router senza posta configurata lascia queste righe:

script,warning Dispositivo sconosciuto: 50:00:00:1E:00:00 192.168.88.199
e-mail,error Error sending e-mail <Nuovo dispositivo sulla LAN: 50:00:00:1E:00:00>: error connecting to server
script,error executing script from dhcp failed, please check it manually

Il comando per trovarli:

/log print where topics~"script" or topics~"e-mail"

Tre regole per non farsi male:

  • niente operazioni lente: lo script gira mentre il server sta gestendo il client;
  • prova sempre prima con :log, come al passo 2, e solo dopo aggiungi mail o firewall;
  • le variabili $lease… esistono solo dentro il lease-script: in un altro script sono vuote.

Passo 7: cosa controllo prima di metterlo in produzione?

Un lease-script che manda mail o tocca il firewall vive su un router che deve essere già protetto. Se non l’hai ancora fatto, segui l’Hardening di base di un router MikroTik: utente diverso da admin, servizi limitati, firewall verso internet.

Provato in laboratorio su PNETLab con CHR RouterOS 7.24.5 (stable) e un client Linux: script nel log, avviso per i MAC sconosciuti, make-static, address list con timeout, nessuna esecuzione ai rinnovi del lease.

Domande frequenti

Quando parte il lease-script del DHCP server MikroTik?

Quando il DHCP server assegna un indirizzo a un client e quando un lease viene liberato o scade. La variabile $leaseBound vale 1 nel primo caso e 0 nel secondo.

Il lease-script parte anche quando il client rinnova il lease?

No. In laboratorio, su RouterOS 7.24.5, con un lease da 2 minuti il client rinnovava ogni minuto e lo script non è mai partito: parte solo all’assegnazione e al rilascio o alla scadenza.

Come leggo il nome del dispositivo nel lease-script?

Il nome che il client dichiara è nella variabile $"lease-hostname", da scrivere fra virgolette per via del trattino. Può essere vuoto: non tutti i dispositivi lo inviano.

Posso mandare una email da un lease-script?

Sì, con /tool e-mail send, dopo aver configurato il server SMTP del router. Conviene filtrare i casi in cui inviarla, per esempio solo per i MAC sconosciuti; se la mail non parte, l’errore finisce nel log.

Come tolgo automaticamente un client dalla address list?

Aggiungendolo con un timeout, per esempio timeout=10m: allo scadere RouterOS rimuove la voce da solo, senza bisogno di altri script.

Questo howto aggiorna a RouterOS 7 un articolo del 2015 sul mio vecchio blog wirelessguru.it, ormai offline.