Cattura dei pacchetti su Windows in pratica — scegliere tra pktmon, netsh trace e Wireshark

· · Windows, Cattura di pacchetti, pktmon, netsh, Wireshark, Rete, Diagnostica, TCP/IP

«La comunicazione server dell’applicazione di business fallisce alcune volte al mese. Il log dell’app dice solo “timeout”. Nel log lato server a quell’ora non c’è un errore corrispondente. Non sappiamo come riprodurlo» — nelle consulenze di indagine sui difetti questa forma torna di continuo.

Un log applicativo conserva solo ciò che l’app «ha deciso di scrivere». Vedete che il risultato era un timeout, ma se la richiesta di connessione (SYN) non ha avuto risposta, se la connessione si è stabilita e poi il server è rimasto in silenzio, se è stata tagliata con un RST, o se il pacchetto è arrivato a destinazione, vive uno strato sotto il log — nei pacchetti che sono realmente passati sul filo. Se Process Monitor è il modo di scendere di uno strato su file e registro, la cattura di pacchetti è il modo di scendere di uno strato sulla conversazione.

I pacchetti uno strato sotto il log dell'appUn log applicativo conserva solo ciò che l'app ha deciso di scrivere; se il SYN non ha avuto risposta, se c'è stato silenzio dopo il connect, se un RST ha tagliato o se il pacchetto è arrivato vive solo nei pacchetti realmente passati sul filoscendere di uno stratoLog dell'appResta solo ciò che l'app ha deciso di scrivereIl risultato è un timeout di una parolaPacchetti realmente passati sul filoNessuna risposta al SYN?Silenzio dopo il connect?Tagliato con RST?È arrivato a destinazione?

Figura 1: Il log conserva solo il risultato; il dettaglio di un timeout vive solo nei pacchetti uno strato più in basso.

Il punto tipico in cui ci si blocca è il vincolo «non possiamo installare Wireshark sul server del cliente». I siti in cui il controllo delle modifiche o una policy di sicurezza non approvano software extra per un’indagine non sono rari. Windows, però, fornisce già due strumenti di cattura pacchetti: pktmon e netsh trace. Catturare con gli strumenti in dotazione del sistema, portare il file sul proprio PC e leggerlo in Wireshark — con questa divisione si vedono i pacchetti anche su un sito che vieta le installazioni.

Questo articolo è rivolto al personale IT di PMI e agli sviluppatori di app Windows. Organizza come scegliere tra pktmon, netsh trace e Wireshark e la procedura pratica di ciascuno. Trappole del traffico di loopback, se catturare sul client o sul server, come convivere con il TLS che nasconde il payload e la correlazione della cattura con il log dell’app sono trattati da fonti primarie aggiornate ad agosto 2026.

1. Prima la conclusione

  • «Catturare con lo strumento in dotazione, leggere con Wireshark» è la divisione di base sul campo. Anche se non potete installare software sul server del cliente, pktmon e netsh trace sono in Windows. Convertite il log catturato in pcapng e analizzatelo in Wireshark sulla vostra macchina.12
  • pktmon è lo strumento di cattura pacchetti in Windows 10 / Windows Server 2019 e successivi. Si usa in quattro passi — registrare un filtro, avviare, fermare, convertire — e il suo punto di forza è vedere quale componente dello stack di rete ha scartato il pacchetto (il motivo del drop).34
  • netsh trace è lo strumento in dotazione più vecchio; può attivare un insieme di provider ETW come «scenario». Oltre ai pacchetti tiene eventi interni ai componenti Windows, e con persistent=yes la cattura può sopravvivere a un riavvio.56
  • Entrambi gli strumenti scrivono ETL, che Wireshark non apre così com’è. Convertite in pcapng con pktmon etl2pcap per pktmon e con etl2pcapng, open source di Microsoft, per netsh trace.12
  • Microsoft stesso indica «prima pktmon, poi netsh trace se non basta, e Wireshark per l’analisi di protocollo». La divisione di questo articolo segue quella raccomandazione ufficiale.7
  • Di default pktmon registra solo i primi 128 byte di ogni pacchetto. Se intendete leggere il payload in Wireshark, non dimenticate --pkt-size 0 (registrare l’intero pacchetto) all’avvio.8
  • Il traffico verso localhost non compare in una cattura normale. Non passa da una NIC. Usate l’adattatore di loopback Npcap in Wireshark, o la cattura nello stack di pktmon con gli strumenti in dotazione.9
  • Anche quando TLS nasconde il payload si impara molto. Stabilimento della connessione, se l’handshake TLS è riuscito, RST e quale lato è rimasto in silenzio restano visibili anche cifrati. La decifrazione via SSLKEYLOGFILE è una tecnica solo per l’ambiente di sviluppo.10
  • Una cattura contiene la comunicazione stessa. Partite dal fatto che può includere credenziali e dati personali, e inserite nella procedura la cattura minima necessaria e il restringimento prima della consegna.

2. I tre strumenti di cattura e come scegliere

Prima, una tabella unica dei ruoli dei tre strumenti.

  pktmon netsh trace Wireshark
Come si ottiene In Windows 10 / Windows Server 2019 e successivi3 In Windows da tempo (usabile anche su OS precedenti a pktmon) Installazione separata richiesta
Ruolo principale Cattura pacchetti, rilevamento drop, contatori Cattura pacchetti + eventi ETW dei componenti Windows Analisi dei dati catturati (la destinazione vera)
Formato di uscita ETL (conversione in pcapng con etl2pcap)1 ETL+.cab (conversione in pcapng con etl2pcapng)62 pcapng
Punto di forza Punto e motivo del drop nello stack4 Raggruppare i provider per scenario, cattura attraverso i riavvii5 Filtri di visualizzazione, analisi TCP, statistiche, GUI
Diritti Amministratore Amministratore Equivalente amministratore per catturare (non serve per sola analisi)

In una frase, pktmon e netsh trace sono gli strumenti per «catturare», Wireshark è lo strumento per «leggere». Wireshark può anche catturare, ma non lo usate dove non potete installarlo. Al contrario, potete convertire l’ETL degli strumenti in dotazione in testo e leggerlo, ma fissarlo senza filtro di visualizzazione né analisi TCP è una pena. «Catturare sul posto con lo strumento in dotazione, convertire in pcapng e leggere in Wireshark sulla propria macchina» è il percorso più corto su un sito vincolato.

Catturare con lo strumento in dotazione, leggere con WiresharkSul posto si cattura ETL con pktmon o netsh trace, si converte ciascuno in pcapng con il proprio strumento e si analizza in Wireshark sulla propria macchinapktmon etl2pcapetl2pcapngpktmon (in dotazione)File ETLnetsh trace (in dotazione)ETL+.cabpcapngAnalizzare in Wireshark sulla propria macchina

Figura 2: Sul posto si cattura ETL con gli strumenti in dotazione, si converte in pcapng e si legge in Wireshark sulla propria macchina.

La guida Microsoft sull’indagine della perdita di pacchetti ha la stessa forma: catturare e isolare la causa prima con pktmon, poi passare a tracce a livello di componente come netsh trace start scenario=InternetClient se non basta, e analizzare il comportamento di protocollo in Wireshark.7

Come premessa per leggere ciò che un pacchetto mostra davvero, aiuta anche un’immagine degli strati impilati — Ethernet, IP, TCP, dati applicativi. L’anatomia degli strati è illustrata in «Capire davvero il modello OSI».

3. pktmon in pratica — Filtro, avvio, stop, conversione

Il flusso di base di pktmon è in quattro passi. Eseguiteli in un terminale con privilegi elevati.

:: 1. Registrare prima un filtro per restringere il bersaglio (TCP 8443 sul server 192.168.10.20)
pktmon filter add App8443 -i 192.168.10.20 -t tcp -p 8443
pktmon filter list

:: 2. Avviare la cattura. Registrare i pacchetti interi, sovrascrivere in un buffer circolare da 1 GB
pktmon start --capture --pkt-size 0 --file-name C:\temp\app-timeout.etl --file-size 1024 --log-mode circular

:: 3. Riprodurre l'incidente. Nell'attesa si possono controllare volume e scarti con counters
pktmon counters --drop-reason

:: 4. Fermare, poi convertire in pcapng per Wireshark
pktmon stop
pktmon etl2pcap C:\temp\app-timeout.etl --out C:\temp\app-timeout.pcapng

:: 5. Pulire il filtro registrato (i filtri restano finché non si rimuovono esplicitamente).
::    Nota: filter remove non accetta un nome; elimina «tutti» i filtri registrati.
::    Su una macchina che può ancora avere filtri di un'altra indagine, controllare prima con pktmon filter list
pktmon filter remove
Procedura di base di pktmonRestringere il bersaglio con un filtro, avviare la cattura, riprodurre l'incidente, fermare, convertire in pcapng con etl2pcap e infine togliere il filtro registrato1. Restringere il bersaglio con filter add2. Avviare la cattura con start --capture3. Riprodurre l'incidenteControllare volume e drop con counters4. FermareConvertire in pcapng con etl2pcap5. Pulire con filter remove

Figura 3: pktmon parte dalla registrazione del filtro, poi cattura, stop e conversione, e il filtro si toglie esplicitamente alla fine.

Punti da tenere a mente:

  • Registrate i filtri prima di avviare la cattura. Anche la documentazione Microsoft raccomanda con forza di applicare un filtro prima di avviare, perché catturare tutto il traffico è troppo rumoroso. I filtri possono specificare indirizzo IP, porta, indirizzo MAC, protocollo, ID VLAN e così via, e se ne possono registrare fino a 32. Più filtri sono un OR: un pacchetto viene registrato se corrisponde a uno qualsiasi.3
  • Un filtro pktmon non distingue origine e destinazione. -i 192.168.10.20 significa «pacchetti in cui questo indirizzo è origine o destinazione». Restringete la direzione dopo con un filtro di visualizzazione Wireshark dopo la conversione.3
  • La dimensione predefinita del pacchetto è 128 byte. Basta per l’analisi delle intestazioni, ma se volete anche i dati applicativi registrate l’intero pacchetto con --pkt-size 0.8
  • Il log è di default in modalità circular (buffer ad anello), dimensione predefinita 512 MB. Potete cambiare il tetto con --file-size, e --log-mode real-time stampa a schermo in tempo reale e non crea un file di log. Confermate prima in tempo reale di vedere davvero il traffico che vi interessa, poi impostate la cattura di produzione, e evitate una ripresa vuota.8
Come agiscono i filtri pktmonPiù filtri registrati registrano su corrispondenza OR, l'indirizzo specificato non distingue origine e destinazione, e la direzione si restringe dopo con un filtro di visualizzazione Wireshark dopo la conversioneFiltro 1Registra se uno corrispondeFiltro 2Filtro 3 (fino a 32)Registrato nel log di cattura (OR)Origine e destinazione non distinteRestringere la direzione in Wireshark dopo la conversione

Figura 4: Più filtri funzionano come OR, e se un host è origine o destinazione si restringe in Wireshark dopo la conversione.

3.1. Ciò che solo pktmon può fare — vedere dove un pacchetto è stato scartato

Il valore distintivo di pktmon rispetto a Wireshark è che cattura un pacchetto in più punti dentro lo stack di rete, non su una sola NIC, e può riferire dove e perché è stato scartato (dropped). Poiché vedete quale componente un pacchetto ha raggiunto e dove è scomparso, motivi di drop come «disallineamento MTU» o «filtro VLAN» vi portano alla causa senza una ricerca a forza bruta.4

pktmon cattura in più punti nello stackpktmon cattura un pacchetto in più punti nello stack di rete anziché su una sola NIC, quindi può riferire con un motivo quale componente il pacchetto ha raggiunto e dove è stato scartatoPacchettoCatturato al punto 1Catturato al punto 2Scartato al punto 3Riferisce luogo e motivo del dropes. disallineamento MTU o filtro VLAN

Figura 5: Catturare in più punti nello stack dice fino a dove è arrivato un pacchetto e dove è stato droppato, con un motivo.

  • pktmon list mostra i componenti di rete monitorabili (NIC, stack di protocollo, driver di filtro e così via) e i loro ID.
  • pktmon counters --drop-reason elenca i contatori di passaggio/drop per componente e il motivo di drop più recente. Comodo come primo taglio prima di analizzare il log.11
  • Convertite in testo con pktmon etl2txt e i pacchetti scartati escono con drop e un dropReason.3

Il sospetto che «qualcosa nel sistema sta droppando questo prima che raggiunga l’app» non si chiude fissando solo Wireshark. Questa capacità aiuta, per esempio, a isolare un caso in cui il firewall droppa perché manca una regola in ingresso («Il firewall di Windows e le applicazioni di business»).

Un avvertimento. pktmon registra lo stesso pacchetto in più punti dello stack, quindi convertire così com’è in pcapng può far comparire lo stesso pacchetto più di una volta. pcapng non porta «quale componente ha catturato questo», quindi se leggete in Wireshark la mossa standard è convertire con --component-id per scegliere un punto (o mettere i drop da soli in un file separato con --drop-only).1

Perché lo stesso pacchetto può comparire due volte dopo la conversione pcapngpktmon registra lo stesso pacchetto in più punti dello stack, pcapng non tiene quale componente l'ha catturato quindi possono comparire duplicati, e la mossa standard è convertire dopo aver ristretto il punto con component-id o messo i drop da soli in un file drop-onlyStesso pacchetto registrato in più puntiConvertire in pcapng così com'èL'informazione del punto di cattura non viene portataLo stesso pacchetto compare più di una voltaRestringere il punto con --component-idFile separato con --drop-only

Figura 6: L’informazione del punto di cattura non passa in pcapng, quindi la mossa standard è restringere il punto prima di convertire.

4. netsh trace in pratica — Scenari, ETL e catture che sopravvivono a un riavvio

netsh trace è il meccanismo di traccia presente in Windows da prima di pktmon. La sua caratteristica è che come «scenario» può attivare in una volta l’intero insieme di provider ETW legati a quel problema.6

:: List available scenarios and inspect the providers in a scenario
netsh trace show scenarios
netsh trace show scenario netconnection

:: Start the capture. Packet capture included, 1GB circular buffer
netsh trace start scenario=netconnection capture=yes tracefile=C:\temp\nettrace.etl maxSize=1024 filemode=circular

:: Reproduce the incident, then stop (the merge takes a little time)
netsh trace stop
  • Aggiungete capture=yes per abilitare la cattura di pacchetti e restringete il bersaglio con un filtro di cattura come ipv4.address=192.168.10.20. L’elenco dei filtri è in netsh trace show capturefilterHelp.6
  • Fermando si ottiene un file .cab oltre all’ETL. Il .cab contiene informazioni di sistema come configurazione degli adattatori e build del sistema, quindi serve anche da raccolta ambiente.6
  • Può girare una sola sessione di traccia alla volta. Prima di avviare un’altra cattura, controllate con netsh trace show status che non sia rimasta una sessione in esecuzione.6
  • Aggiungete persistent=yes e la sessione sopravvive a un riavvio. Catturare «la comunicazione fallisce per un attimo subito dopo il riavvio» o «la connessione del servizio all’avvio fallisce» — incidenti che non si riesce ad avviare in tempo a mano — è il terreno unico di netsh trace.5
Catturare uno scenario netsh traceAvviare con uno scenario abilita un insieme di provider ETW, capture=yes cattura anche i pacchetti, e fermare produce un file ETL e un file .cabcapture=yesAvviare con uno scenarioAbilitare l'insieme di providerVengono catturati anche i pacchettiRiprodurre l'incidenteFermareFile ETL.cab (informazioni di sistema)

Figura 7: Avviare con uno scenario abilita un insieme di provider, e fermare produce ETL e un .cab.

4.1. Rendere l’ETL leggibile in Wireshark — etl2pcapng

L’ETL di netsh trace non si apre così com’è in Wireshark. etl2pcapng, lo strumento open source che Microsoft pubblica su GitHub, converte in pcapng i pacchetti di un ETL catturato con netsh trace start capture=yes.2

etl2pcapng.exe C:\temp\nettrace.etl C:\temp\nettrace.pcapng

In conversione etl2pcapng scrive l’ID di processo coinvolto con ciascun pacchetto come commento del pacchetto. Potere vedere in Wireshark «di quale processo è questo traffico» aiuta quando più app sullo stesso server comunicano.2

Il lato eventi ETW (eventi interni Windows registrati dai provider dello scenario) non viene convertito in pcapng. Se volete anche gli eventi, convertite in testo o simile con netsh trace convert input=C:\temp\nettrace.etl, oppure aprite l’ETL in Windows Performance Analyzer.57

Leggere l'ETL di netsh trace si divide in due percorsiI pacchetti nell'ETL si convertono in pcapng con etl2pcapng e si leggono in Wireshark; gli eventi ETW non si convertono in pcapng, quindi si leggono con netsh trace convert o Windows Performance Analyzeretl2pcapngETL netsh tracePacchettiEventi ETWConvertire in pcapngLeggere in WiresharkL'ID di processo resta come commentoNon convertito in pcapngLeggere con convert o WPA

Figura 8: Dell’ETL i pacchetti si convertono in pcapng per essere letti; gli eventi ETW si leggono in un altro modo.

5. Un primo sguardo alla lettura in Wireshark — Filtri di visualizzazione e analisi TCP

Aperto il pcapng, prima tagliate il rumore con un filtro di visualizzazione. Quelli comuni sono in tabella.1213

Filtro di visualizzazione Significato
ip.addr == 192.168.10.20 Pacchetti in cui questo IP è origine o destinazione
tcp.port == 8443 Pacchetti che coinvolgono questa porta TCP
dns Solo query e risposte DNS
tcp.flags.syn == 1 && tcp.flags.ack == 0 Solo SYN di connessione
tcp.flags.reset == 1 Solo RST (taglio forzato)
tcp.analysis.retransmission Pacchetti che Wireshark ha giudicato ritrasmissioni
tcp.analysis.zero_window Finestra di ricezione 0 (il ricevitore non può prendere altro)
tcp.analysis.flags Ogni pacchetto in cui è stato rilevato un problema

tcp.analysis.* sono flag di analisi che Wireshark assegna seguendo i numeri di sequenza TCP. Ritrasmissioni, ACK duplicati, fuori ordine, ZeroWindow e simili vengono presi in modo meccanico, quindi il modo standard di iniziare a leggere è digitare prima tcp.analysis.flags e elencare i punti «che sembrano un problema».13

In un’indagine di timeout cercate le forme seguenti in ordine.

  1. L’handshake a tre vie è completo? Ci sono tutti e tre i pacchetti SYN → SYN/ACK → ACK? Se il SYN si ripete senza risposta, non è mai arrivato al peer, o è stato scartato in silenzio in mezzo (il tipico schema del firewall).
  2. Quale lato ha inviato l’RST? Un RST immediato al SYN significa che nessuno ascolta sulla porta di destinazione; un RST dopo la connessione stabilita significa che un lato ha forzato il taglio. L’IP di origine dell’RST è la prova diretta di «chi ha tagliato».
  3. Le ritrasmissioni continuano? La ritrasmissione ripetuta dello stesso segmento è il segno che l’acknowledgement (ACK) non sta tornando al mittente. Se i dati in uscita sono andati persi o è andato perso l’ACK di ritorno non si chiude da una cattura unilaterale (per questo nel capitolo successivo conta «catturare su entrambi i lati»). Ritrasmissioni e timeout sono approfonditi in «Perché le ritrasmissioni TCP bloccano la comunicazione con telecamere industriali».
  4. C’è ZeroWindow? È il segno che l’app ricevente non sta leggendo dal socket e il buffer di ricezione è pieno. È motivo di sospettare il progetto dell’app ricevente («L’equivoco che TCP permetta di ricevere nelle stesse unità in cui si invia») piuttosto che la rete.
Ordine delle forme da cercare in un'indagine di timeoutConfermare il completamento dell'handshake a tre vie, presenza e origine dell'RST, ritrasmissioni che continuano, poi ZeroWindow, per mettere un primo segno sulla causanononoIl SYN ha avuto risposta?Non è mai arrivato(Firewall tipico)C'è un RST?L'origine dell'RST ha tagliatoLe ritrasmissioni continuano?L'ACK non sta tornandoC'è ZeroWindow?Il ricevitore non sta leggendo

Figura 9: Cercare handshake, RST, ritrasmissione, poi ZeroWindow in quest’ordine restringe dove guardare dopo.

Prima di leggere i pacchetti uno per uno, aiuta anche prendere il quadro con le funzioni di statistica. [Statistics] → [Conversations] è un elenco di «quale coppia IP / porta ha parlato, da quando a quando, quanto», così identificate la conversazione che vi interessa e filtrate solo quella. [Statistics] → [I/O Graph] è un grafico di volume nel tempo; forme come «da quest’ora un verso è rimasto in silenzio» saltano all’occhio. Clic destro sulla conversazione TCP di interesse e [Follow] → [TCP Stream] per leggere lo scambio di quella connessione in chiaro.

Prendere il quadro con le statistiche, poi restringere a una conversazioneElencare quali conversazioni hanno parlato quando e quanto in Conversations, prendere l'intervallo di silenzio dall'I/O Graph, filtrare la conversazione di interesse e leggerla come flusso TCPPrendere il quadro intero con le statisticheElenco conversazioni in ConversationsVedere il volume sull'I/O GraphFiltrare la conversazione di interesseL'intervallo di silenzio diventa visibileLeggere come flusso TCP

Figura 10: Prima di leggere pacchetto per pacchetto, prendete il quadro con le statistiche, restringete alla conversazione di interesse, poi leggetela tutta.

6. La trappola del loopback — il traffico verso localhost non passa mai da una NIC

Cercare di indagare la comunicazione tra app sullo stesso PC — per esempio un’app di business che si collega a un servizio intermedio su localhost:8080 — e bloccarsi su «in Wireshark non compare nulla» è una trappola classica.

La causa è chiara. Il traffico verso localhost (127.0.0.1) non passa mai da una NIC fisica; viene girato sul percorso di loopback interno del sistema. Una cattura normale che punta a un adattatore fisico quindi non lo vede.9

Perché il traffico verso localhost non compare in una catturaIl traffico verso localhost non passa mai da una NIC fisica e viene girato sul percorso di loopback interno del sistema, quindi non compare in una cattura normale che punta a un adattatore fisicoesternolocalhostAppStack di reteNIC fisicaVisto in una cattura normaleGirato nel sistemaNon in una cattura normaleLoopback Npcap o pktmon

Figura 11: Il traffico verso localhost viene girato prima della NIC, una cattura sull’adattatore fisico non lo vede.

Ci sono due modi di affrontarlo.

  • Quando catturate in Wireshark: Scegliete l’«Adapter for loopback traffic capture» di Npcap come bersaglio di cattura. L’installer Windows di Wireshark (3.0 e successivi) include Npcap, quindi se Wireshark è già installato lo usate senza lavoro extra.9
  • Quando catturate con gli strumenti in dotazione: pktmon cattura in più punti dentro lo stack di rete anziché fuori dalla NIC4, quindi può osservare anche il traffico di loopback. Per essere sicuri, prima di impostare un’attesa di riproduzione in produzione, confermate su quella macchina con la visualizzazione in tempo reale pktmon start -c -m real-time che il traffico di loopback che vi interessa è davvero visibile.

Attenzione anche a due scambi.

  • «localhost» può risolversi in IPv6 ::1. L’app si collega a IPv6 ::1, ma l’investigatore guarda solo 127.0.0.1 (IPv4) e conclude a torto «non c’è traffico». Allargate il filtro di visualizzazione a entrambi, come in ip.addr == 127.0.0.1 || ipv6.addr == ::1, oppure rendete l’impostazione di destinazione dell’app un indirizzo esplicito.9
  • Anche il traffico verso il proprio IP reale non va sul filo. Quando lo stesso PC si collega da 192.168.10.5 a 192.168.10.5, la destinazione è un IP reale ma il sistema lo gira comunque internamente. Ricordate che «ho specificato un IP reale, quindi passa dalla NIC» non è garantito.
Lo scambio quando localhost si risolve in IPv6Il localhost di un'app può risolversi in IPv6 ::1, e se l'investigatore guarda solo 127.0.0.1 conclude a torto che non c'è traffico, quindi allargate il filtro di visualizzazione a entrambi gli indirizzi o confermate la destinazione come indirizzo esplicitoL'app si collega a localhostIn realtà si risolve in ::1 (IPv6)L'investigatore guarda solo 127.0.0.1Niente compare sullo schermoAllargare il filtro a entrambi gli indirizziRendere la destinazione un indirizzo esplicito

Figura 12: Attenzione allo scambio in cui localhost si risolve in ::1 e guardare solo 127.0.0.1 porta a «non c’è traffico».

7. Dove catturare — un lato, entrambi i lati e sincronizzazione degli orologi

Il valore di una cattura lo decide «dove avete catturato». La regola empirica è la seguente.

Luogo di cattura Cosa imparate Quando sta bene
Solo lato client Cosa avete inviato e cosa è tornato Prima, per il quadro d’insieme. Quando non potete toccare il server
Solo lato server Se la richiesta è arrivata e se è stata inviata una risposta Quando i client sono molti, o non ne identificate uno
Entrambi i lati insieme Dove sul percorso è scomparso un pacchetto, quale lato è rimasto in silenzio Quando dovete chiudere il confine di responsabilità

Una cattura unilaterale dice solo «i fatti visti dalla mia posizione». Ritrasmissioni che continuano sul client non distinguono se il pacchetto inviato è scomparso sul percorso, o è arrivato al server e la risposta è scomparsa. Catturare su entrambi i lati e allinearli chiude «il client l’ha inviato / il server non l’ha mai ricevuto» — quale lato è rimasto in silenzio. Quando dovete chiudere il confine di responsabilità (l’app, il sistema, un dispositivo di rete o l’altra estremità), vale la pena allestire da subito una cattura su entrambi i lati.

Cosa dicono le catture unilaterale e bilateraleUna cattura unilaterale non distingue se è scomparso il pacchetto in uscita o la risposta di ritorno; catturare su entrambi i lati e allinearli chiude quale lato è rimasto in silenzioCatturare su un latoFatti dal vostro latoIn uscita o di ritorno?Catturare su entrambi i latiAllinearliQuale lato è rimasto in silenzioServe sincronizzazione degli orologi

Figura 13: Un solo lato mostra i fatti che avete visto; allineare entrambi i lati è ciò che per primo chiude il confine di responsabilità.

7.1. La premessa della correlazione è la sincronizzazione degli orologi

Per allineare catture da entrambi i lati, gli orologi delle due macchine devono concordare. Prima di avviare la cattura, controllate e annotate lo scostamento di orologio.

:: Check time-sync status (sync source, last sync time)
w32tm /query /status

:: Measure the offset against the peer server (5 samples)
w32tm /stripchart /computer:sv-app01 /dataonly /samples:5

w32tm /stripchart è il comando che mostra lo scostamento di tempo tra voi e il computer peer, e diventa il fondamento di una correzione come «l’orologio del server era a +0,8 secondi» quando allineate le catture.14 In un ambiente con uno scostamento grande, sistemare prima la sincronizzazione del tempo e poi catturare è il percorso più corto alla fine.

Procedura per controllare lo scostamento di orologio prima della correlazioneConfermare il proprio stato di sincronizzazione con w32tm, misurare e annotare lo scostamento rispetto al server peer con stripchart, usare quello scostamento come fondamento di correzione all'allineamento, e se lo scostamento è grande sistemare prima la sincronizzazione e poi catturareControllare lo stato di sync con queryMisurare lo scostamento con stripchartAnnotare lo scostamentoFondamento di correzione al momento della correlazioneSe lo scostamento è grande, sistemare prima la sync

Figura 14: Misurate e annotate lo scostamento di orologio prima di catturare, e usatelo come fondamento di correzione quando allineate le catture.

7.2. Per «non sappiamo quando succederà» — un buffer ad anello

Per un incidente le cui condizioni di riproduzione sono sconosciute, la mossa di base è lasciare un buffer ad anello in esecuzione e fermarlo quando l’incidente avviene.

  • pktmon: Il default è la modalità circular. Impostate il tetto (MB) con --file-size; i pacchetti più vecchi vengono sovrascritti.8
  • netsh trace: Specificatelo come maxSize=1024 filemode=circular.5
  • Wireshark: In [Capture] → [Options] → [Output] potete configurare «più file + buffer ad anello». Ruota per dimensione file o tempo e tiene solo gli ultimi N file, quindi potete girare a lungo con un tetto di uso disco.15

In ogni caso, condividete con la persona sul posto la regola che quando l’incidente avviene, «annotate prima l’ora, poi» fermate la cattura. Un buffer ad anello cancella il passato più aspettate, quindi se il percorso dall’occorrenza allo stop è lungo, l’intervallo che vi interessa viene sovrascritto.

Attendere con una cattura a buffer ad anelloPer un incidente le cui condizioni di riproduzione sono sconosciute, lasciare un buffer ad anello in esecuzione e, quando l'incidente avviene, annotare l'ora e fermare in fretta; uno stop tardivo sovrascrive i pacchetti più vecchi e l'intervallo di interesse scompareAvviare una cattura a buffer ad anelloLasciarla girare e attendereL'incidente avvieneAnnotare l'oraFermare in frettaI pacchetti più vecchi vengono sovrascrittiUno stop tardivo cancella l'intervallo di interesse

Figura 15: Un buffer ad anello cancella il passato più aspettate, quindi una volta annotata l’ora fermate in fretta.

8. Il problema che TLS nasconde il payload — ciò che si vede ancora

Gran parte del traffico di business oggi è TLS (HTTPS). Si tende a pensare «se è cifrato, catturare non serve», ma gran parte di ciò che volete in un’indagine di timeout resta visibile con la cifratura lasciata al suo posto.

  • Se la connessione TCP si è stabilita (handshake a tre vie)
  • Fino a dove è arrivato l’handshake TLS — se ServerHello è tornato a ClientHello, se è stato tagliato con un RST o un alert durante l’handshake
  • Il nome host di destinazione su ClientHello (SNI) e la versione TLS negoziata
  • Dopo la connessione in piedi, quale lato ha smesso di inviare. Il luogo del silenzio, ritrasmissioni, RST, o una chiusura pulita (FIN)

In altre parole, isolare «non si connette», «si interrompe a metà» e «non torna nessuna risposta» quasi mai richiede la decifrazione del payload. Ciò che la cifratura perde è «cosa hanno detto»; «chi è rimasto in silenzio, e quando» resta.

Cosa una cattura TLS può e non può mostrareLa cifratura nasconde solo il payload dei dati applicativi; stabilimento della connessione TCP, successo o fallimento dell'handshake TLS, SNI e versione TLS, RST, e quale lato è rimasto in silenzio restano visibili con la cifratura lasciata al suo postoCattura di traffico TLSVisibileNon visibileStabilimento connessione TCPEsito TLS e SNIRST / chi è rimasto in silenzioPayload dei dati applicativi

Figura 16: La cifratura perde solo il payload; lo scheletro della conversazione si legge ancora con TLS lasciato al suo posto.

Quando serve ancora il payload, Wireshark può decifrare TLS usando le chiavi di sessione scritte tramite la variabile d’ambiente SSLKEYLOGFILE. Il supporto è limitato ad alcune implementazioni come Firefox, Chrome, Edge basato su Chromium e librerie della famiglia OpenSSL; lo SChannel in dotazione di Windows (app che usano WinHTTP o WinINET) non supporta questo meccanismo.10 Poiché «la chiave di sessione è scritta su un file» significa che chi ha quel file può decifrare l’intera conversazione, non è una tecnica di produzione; trattatela come riproduzione e debug in un ambiente di sviluppo.

Come funziona la decifrazione SSLKEYLOGFILE e i suoi limitiLe chiavi di sessione scritte via SSLKEYLOGFILE permettono a Wireshark di decifrare TLS, ma solo alcune implementazioni come Firefox e la famiglia Chrome lo supportano e SChannel no; chi ha il file delle chiavi può decifrare la conversazione, quindi trattatela come tecnica solo per l'ambiente di sviluppoImpostare SSLKEYLOGFILEScrivere le chiavi di sessioneLeggere in WiresharkChi ha la chiave può decifrareSolo sviluppoSolo alcuni stack TLSSChannel: nessun supporto

Figura 17: Scrivere le chiavi di sessione può decifrare, ma le implementazioni supportate sono limitate, e la natura della chiave ne fa una tecnica solo per l’ambiente di sviluppo.

Quando il traffico passa da un proxy interno, la destinazione che compare nella cattura è il server proxy, e TLS scorre in un tunnel CONNECT. La domanda precedente di verso quale proxy sta andando l’app è organizzata nell’articolo compagno dello stesso giorno «Proxy aziendali e app Windows — mettere in ordine la risoluzione del proxy in WinINET, WinHTTP e .NET».

9. Correlare con il log dell’app — mettere il tempo sullo stesso asse

Una cattura da sola produce raramente la conclusione. La mossa decisiva in pratica è mettere una riga del log dell’app e un andata-e-ritorno di pacchetti sullo stesso asse temporale.

La procedura è questa.

  1. Identificate l’ora dell’incidente dal log dell’app (per esempio, un’eccezione di timeout alle 10:23:41). Se il valore di timeout è 30 secondi, l’inizio dovrebbe essere intorno alle 10:23:11.
  2. Passate la visualizzazione dell’ora di Wireshark a [View] → [Time Display Format] → [Date and Time of Day], e restringete l’intervallo con un filtro di visualizzazione (potete anche filtrare per ora, come in frame.time >= "2026-08-20 10:23:00" && frame.time <= "2026-08-20 10:24:00").
  3. In quell’intervallo confermate l’ordine del capitolo 5 (handshake → RST → ritrasmissione → ZeroWindow). Se riuscite ad allineare fino a «30 secondi prima dell’ora di timeout del log è stato inviato un SYN, e dopo solo ritrasmissioni di SYN», il «timeout» del log è sostituito dall’osservazione «a questo punto di cattura non è tornata nessuna risposta» (se il SYN non è mai arrivato al peer, o se il SYN/ACK di ritorno è andato perso sulla via del ritorno, non si chiude da questo solo punto di cattura. Se dovete chiuderlo, catturate sul server e allineatele).
  4. Correggete sempre lo scostamento tra ora di cattura e ora del log (lo scostamento di orologio misurato nella sezione 7.1 e la notazione del fuso del log). Qualche secondo di errore di correlazione inchioda la conversazione sbagliata come colpevole.
Procedura per allineare il log dell'app e i pacchettiIdentificare l'ora dell'incidente dal log dell'app, risalire l'ora di inizio dal valore di timeout, restringere l'intervallo in Wireshark con un filtro di visualizzazione, confermare le forme in ordine, correggere lo scostamento di orologio e metterli sullo stesso asse temporale1. Identificare l'ora dell'incidente dal logRisalire l'inizio dal valore di timeout2. Restringere l'intervallo con un filtro di visualizzazione3. Confermare le forme nell'ordine del capitolo 54. Correggere lo scostamento di orologioLa parola del log diventa un'osservazione

Figura 18: Restringete l’intervallo dall’ora del log, confermate la forma, correggete lo scostamento di orologio e metteteli sullo stesso asse.

Quando consegnate i risultati dell’indagine a terzi (un fornitore, un operatore, il personale di rete del cliente), tagliare il rumore con un filtro prima di consegnare è cortesia e misura di sicurezza. In Wireshark restringete alla conversazione di interesse con un filtro di visualizzazione e salvate «solo i pacchetti visualizzati» con [File] → [Export Specified Packets], e ottenete un pcapng piccolo solo dell’intervallo che vi serve.

Infine, una cautela di trattamento. Un file di cattura contiene la comunicazione stessa. Può includere credenziali di protocolli in chiaro, cookie HTTP e chiavi API, il contenuto di posta o report e dati personali. Decidete i tre punti seguenti come insieme con la procedura di cattura.

  • Cattura minima necessaria: Restringete il bersaglio con i filtri pre-cattura (capitoli 3 e 4) e tenete la finestra temporale il più breve possibile. Non fate «catturiamo tutto» su un ambiente cliente
  • Restringere prima di consegnare: Esportate solo la conversazione di interesse; non includete traffico di terzi non correlato. Se restano parti sensibili, accordatevi con il destinatario su mascheramento o un’altra via
  • Conservazione ed eliminazione: Decidete dove i file di cattura restano, per quanto e quando vengono eliminati, ed eliminate quando l’indagine è finita
Tre decisioni da prendere prima di consegnare un file di catturaUna cattura contiene la comunicazione stessa, quindi decidete come insieme con la procedura di cattura di restringere al minimo con filtri pre-cattura e una finestra temporale, estrarre solo la conversazione di interesse prima della consegna così il traffico non correlato non è incluso, e decidere luogo e durata di conservazione ed eliminare dopo l'indagineCattura = il trafficoCatturare il minimoEstrarre prima il bersaglioImpostare la conservazione, eliminareFiltrare ed esportare

Figura 19: Decidete cattura minima, restringimento prima della consegna, e conservazione ed eliminazione come insieme con la procedura di cattura.

10. Sintesi

  • Uno strato sotto il «timeout» del log dell’app c’è il fatto dei pacchetti realmente passati sul filo. Se il SYN non ha avuto risposta, un RST ha tagliato, le ritrasmissioni sono continuate o è comparso ZeroWindow cambia dove guardate dopo.
  • Anche su un sito dove non potete installare Wireshark potete catturare con pktmon e netsh trace in Windows. Catturare con lo strumento in dotazione, leggere con Wireshark sulla propria macchina — quella divisione è la forma di base.
  • pktmon è in quattro passi: registrare un filtro → pktmon start --capturepktmon stoppktmon etl2pcap. Di default è troncato a 128 byte, quindi se volete il payload non dimenticate --pkt-size 0. Vedere luogo e motivo del drop è un punto di forza che ha solo pktmon.
  • netsh trace cattura un insieme di provider ETW come scenario, e con persistent=yes può sopravvivere a un riavvio. Convertite l’ETL in pcapng con etl2pcapng per leggerlo.
  • In Wireshark partite da tcp.analysis.flags e cercate handshake, RST, ritrasmissione e ZeroWindow in quest’ordine. È più veloce se prima prendete il quadro con Conversations e l’I/O Graph, poi restringete.
  • Il traffico verso localhost non passa mai da una NIC, non lo catturate nel modo ordinario. Usate l’adattatore di loopback Npcap o la cattura nello stack di pktmon.
  • Catturare su entrambi i lati e allinearli chiude «quale lato è rimasto in silenzio». La premessa è la sincronizzazione degli orologi (w32tm). Per un incidente le cui condizioni di riproduzione sono sconosciute, attendete con un buffer ad anello.
  • Anche sotto TLS lo scheletro della conversazione è visibile. Trattate la decifrazione (SSLKEYLOGFILE) come tecnica solo per l’ambiente di sviluppo, e il file di cattura stesso come riservato: inserite cattura minima, restringimento ed eliminazione nell’esercizio.

La cattura di pacchetti è spesso pensata come «strumento dello specialista di rete», ma in pratica è uno strumento di indagine lato app che inizia a significare qualcosa solo quando lo allineate con il log dell’app. La prossima volta che un’indagine si ferma alla sola parola «timeout», andate a guardare uno strato più in basso.

Articoli correlati

Aree di consulenza correlate

KomuraSoft LLC gestisce indagini su difetti di origine comunicativa come «la comunicazione dell’app di business fallisce di tanto in tanto e non troviamo la causa» e «vogliamo isolare un errore di connessione che avviene solo sull’ambiente del cliente». Prendiamo la progettazione della cattura (dove, cosa e quanto catturare), l’analisi Wireshark, la correlazione con il log dell’app e la correzione lato app come un unico lavoro continuo.

Riferimenti

  1. Microsoft Learn, pktmon etl2pcap. Sulla conversione dei log ETL di pktmon in pcapng perché siano analizzabili in Wireshark e strumenti simili, e sul fatto che le informazioni di scarto e del punto di cattura nello stack si perdono in pcapng, quindi conviene prima restringere con –drop-only o –component-id prima di convertire.  2 3 4

  2. GitHub, microsoft/etl2pcapng. Sul fatto che etl2pcapng è lo strumento open source di Microsoft che converte in pcapng i pacchetti di un file ETL catturato con netsh trace start capture=yes e simili, conservando le informazioni di interfaccia e scrivendo l’ID di processo come commento del pacchetto.  2 3 4 5

  3. Microsoft Learn, Pktmon command formatting. Sul fatto che pktmon.exe è disponibile su Windows 10 e Windows Server 2019 (versione 1809) e successivi; la procedura di avvio rapido registrazione filtro → avvio → riproduzione → controllo contatori → stop e conversione; che i filtri sono al massimo 32, combinati in OR e non distinguono origine e destinazione; e che i pacchetti scartati nell’uscita testuale portano un dropReason.  2 3 4 5

  4. Microsoft Learn, Packet Monitor (Pktmon). Sul fatto che Packet Monitor è lo strumento di diagnostica inter-componente in dotazione di Windows; che cattura pacchetti in più punti nello stack di rete per visualizzare il percorso di un pacchetto; che riferisce gli scarti sui componenti supportati con un motivo di drop (MTU Mismatch, Filtered VLAN e così via); e che fornisce contatori di pacchetti per punto.  2 3 4

  5. Microsoft Learn, netsh trace. Sui parametri di netsh trace start come scenario, capture, tracefile, maxSize, fileMode (circular agisce da buffer ad anello) e persistent (mantenere la sessione attraverso un riavvio), e sulla conversione dell’ETL in testo e simili con netsh trace convert.  2 3 4 5

  6. Microsoft Learn, Using Netsh to manage traces. Sul fatto che uno scenario è un insieme predefinito di provider per la diagnostica; sull’ispezione con netsh trace show scenarios / show scenario; sul fatto che può girare una sola sessione di traccia alla volta; sui filtri di pacchetto come ipv4.address quando capture=yes; e sul fatto che fermare produce ETL e un .cab che include informazioni di sistema.  2 3 4 5 6

  7. Microsoft Learn, Diagnose packet loss. Sulla procedura ufficiale di indagine di catturare prima una traccia con pktmon e controllare motivi di drop locali e statistiche, combinarla con l’analisi a livello di protocollo in Wireshark, e se non basta passare a una traccia a livello di componente con uno scenario netsh trace.  2 3

  8. Microsoft Learn, pktmon start. Sull’avvio di una cattura con –capture; sul fatto che –pkt-size di default è 128 byte e 0 registra l’intero pacchetto; su –file-name e –file-size (default 512 MB); e sui valori di –log-mode (circular, multi-file, real-time, memory) con circular come default.  2 3 4

  9. Wireshark Wiki, CaptureSetup/Loopback. Sul fatto che una cattura normale che punta a una NIC fisica su Windows non può catturare il traffico di loopback verso 127.0.0.1; che l’«Adapter for loopback traffic capture» di Npcap rende possibile la cattura di loopback; e che Npcap è incluso nell’installer Windows da Wireshark 3.0 in poi.  2 3 4

  10. Wireshark Wiki, TLS. Sul fatto che Wireshark può decifrare TLS con chiavi di sessione scritte tramite la variabile d’ambiente SSLKEYLOGFILE; che il supporto copre Firefox, Chrome, Edge basato su Chromium, librerie della famiglia OpenSSL e simili; e che Microsoft SChannel non supporta questo meccanismo.  2

  11. Microsoft Learn, pktmon counters. Sul fatto che pktmon counters mostra i contatori di passaggio e drop per componente monitorato; che –drop-reason mostra il motivo di scarto più recente di ciascun contatore di drop; e sull’aggiornamento in tempo reale con –live. 

  12. Wireshark, Building Display Filter Expressions (Wireshark User’s Guide). Sulla sintassi dei filtri di visualizzazione, le specificazioni di campo come ip.addr e tcp.port, gli operatori di confronto e la loro combinazione con and/or/not. 

  13. Wireshark, TCP Analysis (Wireshark User’s Guide). Sull’elenco dei flag di analisi TCP di Wireshark (tcp.analysis.retransmission, tcp.analysis.duplicate_ack, tcp.analysis.out_of_order, tcp.analysis.zero_window e così via) e le condizioni in cui ciascuno viene assegnato.  2

  14. Microsoft Learn, Windows Time service tools and settings. Sul fatto che w32tm è lo strumento a riga di comando raccomandato per configurare, monitorare e diagnosticare W32Time, e che w32tm /stripchart mostra lo scostamento di tempo tra voi e un computer peer (opzioni come /dataonly e /samples). 

  15. Wireshark, Capture files and file modes (Wireshark User’s Guide). Sulle modalità di uscita dei file di cattura (file singolo, più file, buffer ad anello) e sul fatto che un buffer ad anello tiene solo i dati più recenti così potete mettere un tetto all’uso del disco. 

Articoli recenti con gli stessi tag per approfondire argomenti vicini.

Queste pagine collocano l’argomento in un contesto più ampio di servizi e decisioni.

L’articolo è direttamente collegato ai servizi seguenti.

Domande frequenti

Domande che ricorrono nelle consulenze sull’argomento dell’articolo.

Come catturo i pacchetti su un server del cliente dove non posso installare Wireshark?
Usate gli strumenti già in Windows, pktmon o netsh trace, e catturate senza installare altro software. Con pktmon, registrate un filtro in un terminale con privilegi elevati, avviate la cattura con pktmon start --capture e fermate con pktmon stop. Il file ETL ottenuto si converte in pcapng con pktmon etl2pcap, così l'analisi torna su Wireshark sulla vostra macchina. «Catturare con lo strumento in dotazione, leggere con Wireshark» è la divisione di base sui siti che limitano le installazioni.
Devo usare pktmon o netsh trace?
Se il sistema ha pktmon (Windows 10 / Windows Server 2019 e successivi), partite da pktmon. I comandi sono semplici, vedete quale componente dello stack di rete ha scartato il pacchetto (il motivo del drop) e la conversione pcapng è autonoma. netsh trace è la scelta migliore quando catturate su un OS più vecchio senza pktmon, quando volete raccogliere eventi ETW dei componenti Windows come scenario, o quando volete che la cattura sopravviva a un riavvio con persistent=yes. Anche il materiale di diagnostica di Microsoft indica quest'ordine: prima pktmon, poi netsh trace se non basta.
Perché il traffico verso localhost (127.0.0.1) non compare in Wireshark?
Il traffico verso localhost non passa mai da una NIC fisica: viene girato sul percorso di loopback interno del sistema. Una cattura normale che punta a un adattatore fisico quindi non lo vede. In Wireshark scegliete l'«Adapter for loopback traffic capture» di Npcap e potete catturare il traffico di loopback. pktmon cattura dentro lo stack di rete, quindi può osservare anche il loopback. Un altro scambio frequente è che «localhost» si risolve in IPv6 ::1, così uno schermo fisso su 127.0.0.1 non mostra nulla — confermate specificando l'indirizzo in modo esplicito.
Posso vedere il contenuto del traffico HTTPS (TLS) in una cattura di pacchetti?
Il payload dei dati applicativi è cifrato e non è visibile. Lo «scheletro» della conversazione — connessione e disconnessione TCP, se l'handshake TLS è riuscito, un taglio con RST, quale lato ha smesso di rispondere — resta visibile anche cifrato, quindi gran parte delle indagini di timeout procede con TLS lasciato cifrato. Se serve il payload esiste la decifrazione via SSLKEYLOGFILE, ma è supportata solo da alcune implementazioni TLS come Firefox e la famiglia Chrome; lo SChannel in dotazione di Windows non è supportato. Il meccanismo scrive materiale di chiave segreta, trattatelo come opzione solo per l'ambiente di sviluppo.
È sicuro inviare un file di cattura a un supporto esterno?
Inviarlo così com'è è pericoloso. Una cattura contiene la comunicazione stessa e può includere credenziali di protocolli in chiaro, cookie, chiavi API e dati personali. Prima, al momento della cattura, restringete filtro e finestra temporale al minimo necessario, e prima di consegnarlo estraete solo la conversazione obiettivo con un filtro di visualizzazione Wireshark ed esportatela. Per ciò che resta, accordatevi con il destinatario su come trattare le parti sensibili (mascherarle o consegnarle per un'altra via) prima di inviare. Decidete in anticipo quanto a lungo i file di cattura restano e quando vengono eliminati.

Profilo dell’autore

Pagina di presentazione dell’autore dell’articolo.

Go Komura

Rappresentante di KomuraSoft LLC

Specializzato nello sviluppo di software Windows, nella consulenza tecnica e nell’analisi dei malfunzionamenti, soprattutto nei progetti con sistemi esistenti e guasti difficili da riprodurre.

Torna al blog