Engineering Investigation Déconnexion Wi-Fi

Root Cause Analysis : Déconnexions Wi‑Fi
Terminaux industriels

Analyse factuelle d'un incident de déconnexions Wi‑Fi : corrélation logs, captures Wireshark et volumétrie radio (Omnipeek) pour identifier la cause racine.

Domaine

Wi‑Fi / 802.11

Outils

Wireshark

Omnipeek

Données

Logs terminaux

Logs AP

Objectif

Cause racine

01. Contexte & Symptômes

Des terminaux mobiles industriels subissaient des déconnexions Wi‑Fi intermittentes lors de déplacements dans une zone précise. Le symptôme principal était une perte de connectivité des terminaux au réseau Wi-Fi.

Plusieurs investigations avaient déjà été menées sans conclusion formelle. J'ai été mandaté pour identifier la cause racine en m'appuyant sur des éléments vérifiables : logs, captures réseau et mesures radio.

02. Méthodologie

  • Wireshark : capture des trames et des événements de déconnexion / retransmissions.
  • Logs terminaux : événements Wi‑Fi (désassociation, reachability, reconnexion).
  • Omnipeek : volumétrie radio par point d'accès (comparaison J0 vs J+1).

Objectif : corréler les traces techniques et isoler le composant en défaut (terminal, réseau, AP).

03. Corrélation logs ↔ capture réseau (déconnexion)

La capture met en évidence des déconnexions côté Wi‑Fi. Les logs des terminaux, sur la même fenêtre temporelle, confirment des événements de désassociation et de perte de reachability IP.

Déconnexion observée dans Wireshark et corrélation avec les logs

Point clé : la coupure est observable dans les trames et corroborée par les logs — ce n'est donc pas un symptôme applicatif.

04. Analyse de l'authentification Wi‑Fi (WPA / EAPOL)

L'étape suivante consiste à vérifier si les déconnexions proviennent d'un problème d'authentification. Les captures montrent des échanges EAPOL et des retransmissions, indiquant une authentification qui n'aboutit pas systématiquement.

Suivi des événements WLAN_STA_DISCONNECT dans les logs AP

Les logs AP permettent de quantifier les occurrences d'événements WLAN_STA_DISCONNECT sur la journée, et de positionner la première déconnexion sur un AP précis.

Logs terminaux : reconnexion et key nonce WPA

Côté terminal, la tentative de reconnexion est immédiate. La key nonce observée correspond à l'authentification en cours, ce qui confirme que le terminal initie correctement le handshake.

Wireshark : retransmissions et progression des messages EAPOL

Les retransmissions répétées et l'absence de validation finale orientent vers un comportement anormal côté infrastructure (AP) plutôt qu'un défaut terminal.

05. Mesure radio : volumétrie anormale sur certains AP

Pour confirmer l'hypothèse « AP dégradés », une capture Omnipeek est utilisée pour comparer la volumétrie par point d'accès. L'objectif est d'identifier des AP dont le trafic est anormalement faible (symptôme d'un service radio/traitement perturbé).

Omnipeek : comparaison volumétrie AP entre J0 et J+1

À J0, plusieurs AP présentent un volume significativement inférieur aux autres. À J+1, après mise à jour, la répartition redevient homogène. La disparition des déconnexions est concomitante à cette normalisation.

Point Bonus : Pour obtenir ces résultats, j'ai réalisé un script PowerShell permettant de convertir une capture TCPDump en fichier CSV afin de facilité la lecture avec PowerBi.

PcapToCSV
# PcapToCSV 
# Tybbow v1
# Lecture des fichiers Pcap
# En extraire les données
# Parser les données
# insertion fichier csv

Param(
    [parameter(Mandatory=$true)][string]$capture
)

$tshark = "C:\Program Files\Wireshark\tshark.exe"
$header = "Number;time;wlansa;wlanda;proto;len;type;reason;info;ssid"

$testPath = Test-Path $capture -PathType Leaf
$testTshark = Test-Path $tshark -PathType Leaf

if (!$testPath)
{
    Write-Host "[-]" -ForegroundColor Red -NoNewline
    Write-Host " Fichier introuvable : $capture"
    throw "Error: file not found"
}

if (!$testTshark)
{
    Write-Host "[-]" -ForegroundColor Red -NoNewline
    Write-Host " Fichier introuvable : $tshark"
    throw "Error: file not found"
}

Write-Host "[+]" -ForegroundColor Green -NoNewline; 
Write-Host " Lecture du fichier capture" $capture
Write-Host ""

function ParsePcapLines($contents) 
{
    $lines = $contents -split "[\r\n]+"
    $count = $lines.Count
    $tabPcap = @($null) * $count
    $i = 0

    foreach ($line in $lines) 
    {
        if ($i % 1000 -eq 0) 
        {
            Write-Host "  Paquets traités : $i"
        }

        $v = $line.Split(';')
        $time = $v[1] -replace ' Paris, Madrid', '' -replace " \(heure d'été\)", ''
        $tabPcap[$i] = '{0};{1};{2};{3};{4};{5};{6};{7};{8};{9}' -f `
            $v[0], $time, $v[2], $v[3], $v[4], $v[5], $v[8], $v[9], $v[6], $v[7]
        $i++
    }

    return $tabPcap
}

function Main()
{
    Write-Host "[+]" -ForegroundColor Green -NoNewline; 
    Write-Host " Extraction tshark en cours..."
    $ParsePcapRaw = $null

    $contents = & $tshark @(
        '-r', $capture,
        '-T', 'fields',
        '-e', 'frame.number',
        '-e', 'frame.time',
        '-e', 'wlan.sa',
        '-e', 'wlan.da',
        '-e', '_ws.col.Protocol',
        '-e', '_ws.col.Length',
        '-e', '_ws.col.Info',
        '-e', 'wlan.ssid',
        '-e', 'wlan.fc.type_subtype',
        '-e', 'wlan.fixed.reason_code',
        '-E', 'separator=;'
    )

    $ParsePcapRaw = ParsePcapLines $contents

    if (!$ParsePcapRaw.Count)
    {
        Write-Host "[!]" -ForegroundColor Yellow -NoNewline; Write-Host " Pas de données"
        return;
    }

    $date = Get-Date -Format "yyyyMMdd"
    $baseName = $capture.Split("\\")[-1] -replace "\.pcap", ""
    $outDir  = ".\$date"
    $outFile = ".\$($date)\$($baseName).csv" 

    Write-Host "[+]" -ForegroundColor Green -NoNewline; 
    Write-Host " Génération des données - Nombre de paquets : $($countPaquets)  - fichier: $($outFile)"

    New-Item -ItemType Directory -Force -Path $outDir | Out-Null
    Set-Content -path $outFile -Value $header
    $ParsePcapRaw | Add-Content -path $outFile

    Write-Host "[+]" -ForegroundColor Green -NoNewline
    Write-Host " Terminé — $($countPaquets) paquets exportés dans : $outFile"

    Read-Host "Appuyer sur une touche pour quitter"
}

Main
    

06. Conclusion : cause racine

Les éléments convergent vers un défaut côté points d'accès :

Cause racine : dysfonctionnement logiciel (firmware) sur plusieurs points d'accès, entraînant une dégradation intermittente du traitement radio/802.11 et des échanges d'authentification lors du déplacement des utilisateurs, provoquant les déconnexions.

07.Résultats & Impact