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à.
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ù.
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:
/tool/sniffer/print
/tool/sniffer/start interface=ether1
/tool/sniffer/stop
tool/sniffer/save file-name=/flash/test.pcap
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.
/tool/sniffer set streaming-server=172.31.255.29 set streaming-enabled=yes set filter-interface=ether1 start
/tool/sniffer/print
sul Mikrotik)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.
Durante lo sniffamento, o anche dopo la fine del medesimo (fino a che non ne iniziamo un altro) possiamo vedere delle statistiche divise per:
/tool/sniffer/connection/print
/tool/sniffer/host/print
/tool/sniffer/packet/print
/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.
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.
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:
In alcuni casi è possibile, anche temporaneamente, disabilitare l'offload per permettere di sniffare. In altri casi può essere impossibile perché si affogherebbe la CPU.