Table of Contents
Sniffer su ROS
Per sniffare il traffico su ROS usiamo principalmente la funzione /tool/sniffer
che ha un sacco di usi possibili. Possiamo sniffare in tempo reale con output (limitato) a video, oppure sniffare salvando in un buffer in RAM oppure in un file (compatibile con Wireshark) oppure ancora possiamo mandare i pacchetti via UDP a una macchina remota per essere visualizzati in realtime con Wireshark.
In ogni caso c'è un limite: non possiamo aprire due sessioni assieme, cioè non possiamo, per esempio, lanciare due sniffer distinti in due finestre uno che sniffa la ether1 e l'altro che sniffa la ether2. Questo qualche volta rende non banale l'analisi di certi problemi. Forse c'è un modo furbo per farlo, ma io su Linux ho sempre lanciato enne volte wireshark assieme senza problemi, qui devo imparare come si può aggirare il limite.
Per gli amanti dell'interfaccia grafica, le funzioni dello sniffer sono sotto il menù "Tools / Packet Sniffer". Notare che la funzione "quick" non credo che sia disponibile in questa modalità.
Sniffer quick (in tempo reale)
Per sniffare il traffico in tempo reale possiamo usare /tool/sniffer/quick
con una serie di parametri che definiscono cosa visualizzare e come. Si può filtrare per indirizzo, porte, interfacce, ecc. Il numero di righe visualizzato è basso ma possiamo alzarlo con rows=80
. Le colonne sono sempre troppo poche, allargate per quanto possibile la finestra della console per vederne di più.
Sniffer con salvataggio in RAM o su file
Possiamo sniffare il traffico e salvare i dati in RAM e/o su un file per poter poi esportare il tutto e per esempio aprirlo con Wireshark (il formato è il medesimo). Per usare questa funzione forse è più comoda l'interfaccia grafica perché possiamo vedere al volo tutti i parametri impostati, quali filtri, dimensione massima del buffer in RAM, dimensione massima del file (occhio a non riempire il disco), ecc. In ogni caso in command line abbiamo tutti i comandi necessari, dei quali riporto un piccolissimo esempio qui sotto:
- Per vedere le impostazioni attuali:
/tool/sniffer/print
- Per lanciare una sessione:
/tool/sniffer/start interface=ether1
- Per fermare una sessione:
/tool/sniffer/stop
- Per salvare il buffer in RAM su file:
tool/sniffer/save file-name=/flash/test.pcap
Sniffer con trasmissione in tempo reale verso un host remoto
Questo è un trucco che amo perché mi permette di usare wireshark in tempo reale. In pratica lo sniffer applica il filtro che gli imposti localmente (se lo imposti) e manda il traffico dopo il filtro a un host remoto che lo riceve e analizza in tempo reale.
- Lato Mikrotik definiamo una configurazione per la cattura e avviamo la cattura. In questo esempio mando i dati al mio pc che è 172.31.255.29. Notare che se voglio sniffare sulla stessa interfaccia dalla quale parlo con il mio PC, dovrò applicare dei filtri per non "vedere" anche il traffico UDP che viene dal Mikrotik e va verso il mio PC. In questo esempio non è così, io sniffo la WAN (ether1) e parlo con il mio PC in LAN (ether2).
/tool/sniffer set streaming-server=172.31.255.29 set streaming-enabled=yes set filter-interface=ether1 start
- Lato PC lanciamo Wireshark (anche non da root, sto raccogliendo dati che entrano su una porta non privilegiata) dicendogli che voglio usare l'interfaccia "udpdump" con il formato "ztsp". È importante altrimenti vedo i pacchetti così come mi arrivano, ovvero incapsulati in UDP e non "decapsulati". Ho cercato un modo per impostare wireshark da command line per questo tipo di cattura ma non ci sono riuscito, per cui dovrete usare l'interfaccia grafica per farlo. Come potete vedere, dovete:
- Selezionare l'interfaccia "udpdump" (se non l'avete, avete wireshark compilato senza delle funzioni)
- Cliccare l'ingranaggio a sinistra (indicato dalla enorme freccia rossa)
- Nella finestra che si apre dobbiamo impostare la porta (37008 è il default del Mikrotik, e potete vedere quale sia questo default usando il comando
/tool/sniffer/print
sul Mikrotik) - E soprattutto dobbiamo impostare il formato
tzsp
(non c'è un drop-down, va scritto a mano senza sbagliarsi)
Se va tutto bene, vedremo su Wireshark il traffico "come se fosse locale" cioè vedremo il traffico già "decapsulato", anche se guardando i dettagli dei pacchetti vedremo che sono in realtà incapsulati.
Statistiche
Durante lo sniffamento, o anche dopo la fine del medesimo (fino a che non ne iniziamo un altro) possiamo vedere delle statistiche divise per:
- Connessioni
/tool/sniffer/connection/print
- Host
/tool/sniffer/host/print
- Pacchetti (questo non ho capito bene che utilità abbia)
/tool/sniffer/packet/print
- Protocolli
/tool/sniffer/protocol/print
Ci sono una marea di opzioni per questi comandi, per scegliere cosa e come vedere, ed esiste anche il comando find
per applicare un filtro. Se volete approfondire, cosa che dovrò fare anche io più avanti, giocateci un poco.
Sniffare dalle regole di firewall
Nel firewall è possibile creare delle regole nella sezione "Mangle" che hanno come Action "Sniff TZSP". In questo modo possiamo creare una configurazione che, senza bisogno di sniffare tutto quanto, manda i pacchetti direttamente dal firewall verso il nostro Wireshark in tempo reale.
Limiti dello sniffer
Lo sniffer non "sente" tutto il traffico. Ci sono casi nei quali il traffico non attraversa la CPU del Mikrotik e in questi casi non viene sniffato. Alcuni casi sono:
- Il traffico che passa per il fasttrack
- Il traffico che passa fra due client WIFI se è abilitata l'opzione per consentire il traffico fra i client (di fatto è un offload e il traffico non passa per il kernel)
- Il traffico che passa per qualsiasi tipo di offload hardware (switch, bridge, ecc)
In alcuni casi è possibile, anche temporaneamente, disabilitare l'offload per permettere di sniffare. In altri casi può essere impossibile perché si affogherebbe la CPU.