Jag anslöt VPN-klienten på en Windows 11-bärbar dator, brickan gick till Connected, en intern fildelning öppnades och en offentlig webbplats laddades fortfarande direkt från kontorets Wi-Fi. Den blandningen ser ut som en trasig tunnel. Det är den normala utdata från en profil som skickar en del trafik via VPN och lämnar resten på den fysiska adaptern. Tvingad tunnling ändrar vilken standardrutt Windows föredrar; den raderar inte mer specifika rutter och lovar inte att trafiken stoppas när anslutningen bryts. Följande är den ordning jag går igenom när en klient hävdar täckning: klienttillstånd, sparad profil, tillämpade rutter, resolver och sedan verkliga flöden.

Börja vid klienten och sluta sedan lita på den

Klienten är rätt plats att börja på bara för att den talar om vilken profil som är aktiv. Öppna anslutningens egenskaper och notera det exakta profilnamnet, om den skapades för den aktuella användaren eller för alla på datorn, och vilken adapter som visas i ncpa.cpl efter anslutning. På min testbärbara dator bar adaptern profilnamnet, vilket gjorde ruttutskriften lätt att läsa. På andra datorer visas den som en WAN Miniport-post och namnet säger dig ingenting.

Det klienten inte kan berätta är täckningen. En ansluten bricka beskriver tunnelns tillstånd, inte en förteckning över destinationer. Tredjepartsklienter håller också sin egen konfiguration, så den inbyggda Windows-profilen, och varje egenskap du läser ur den, kanske inte har något att göra med vad den klienten installerade. Om VPN kom via AnyConnect, OpenVPN GUI, WireGuard eller en leverantörsagent gäller PowerShell-kontrollerna nedan oftast inte, och du bör i stället läsa den klientens egna inställningar för delad tunnel och routning.

Läs den sparade profilen, inte brickan

För en inbyggd Windows-profil (IKEv2, L2TP, SSTP eller en som skjuts ut av MDM) är det sparade delad-tunnel-beslutet en enda egenskap:

Get-VpnConnection -Name 'Office' | Select-Object Name, ServerAddress, SplitTunneling, DnsSuffix

Lägg till -AllUserConnection när profilen skapades för alla på enheten. Utan det läser du den aktuella användarens lista, som kan vara tom eller innehålla en annan post med liknande namn. Värdet False i SplitTunneling betyder att profilen sparades som en full tunnel: Windows installerar en standardrutt genom VPN-adaptern. True betyder delad tunnel, och täckningen beror då helt på de rutter och namnupplösningsregler som profilen skjuter ut.

Behandla det värdet som konfiguration, inte som observation. Det registrerar vad profilen bad om vid anslutning. Windows kan hamna med avvikande tillämpade rutter på grund av en mer specifik rutt på ett annat gränssnitt, en principinställning eller en rest från en tidigare anslutning, så det booleska värdet avgör aldrig frågan självt.

Jämför det sparade värdet med den tillämpade rutttabellen

Efter anslutning, lista rutterna på tunneladaptern i stället för att rulla igenom hela tabellen:

$vpn = Get-NetAdapter | Where-Object InterfaceDescription -match 'VPN|WAN Miniport'
Get-NetRoute -InterfaceIndex $vpn.ifIndex | Sort-Object DestinationPrefix
Find-NetRoute -RemoteIPAddress 10.20.4.15 | Select-Object -First 1

Find-NetRoute är den användbara halvan. Den svarar på frågan som klienten aldrig svarar på: för den här destinationen, vilket gränssnitt och vilken källadress kommer Windows faktiskt att använda? Kör den för en intern värd, en offentlig värd och allt du anser är ett medvetet undantag. En fulltunnelprofil bör visa tunnelgränssnittet för den offentliga adressen. En delad-tunnelprofil visar vanligtvis den fysiska adaptern där, medan interna prefix fortfarande löses till VPN.

Två fällor förklarar de flesta rapporterna om att «den routar fel». Det mest specifika prefixet vinner alltid, så en /24 på den fysiska adaptern slår en standardrutt på VPN hur låg tunnelns metrik än är. Metriken avgör bara oavgjort mellan rutter för samma prefix. Och IPv4 och IPv6 avgörs var för sig: en profil som täcker 0.0.0.0/0 kan lämna IPv6 på den lokala länken, vilket får en dual-stack-webbplats att se halvt tunnlad ut. Kontrollera Get-NetRoute -AddressFamily IPv6 innan du drar slutsatsen att tunneln är okej.

What you seeMost likely causeCheck next
Public traffic leaves the physical adapter while SplitTunneling reads FalseA more specific route on that adapter wins over the tunnel defaultFind-NetRoute for the exact destination, then look for a /24 or host route on the physical interface
Internal name fails, internal IP worksNo NRPT rule for that namespace, or a broader rule matches firstGet-DnsClientNrptPolicy and the namespace order
A dual-stack site opens directly while IPv4 uses the tunnelThe profile covers only the IPv4 default routeThe IPv6 route table on both interfaces
Routes look right but one app still goes directThe app uses its own proxy, or the client keeps a per-app listThe app's proxy settings and the client's application list

Kontrollera namnupplösning separat med NRPT

Interna namn som misslyckas medan interna IP-adresser fungerar pekar på resolverprincip, inte på routning. Windows avgör DNS per namnområde genom tabellen för namnupplösningsprincip, som är oberoende av rutttabellen:

Get-DnsClientNrptPolicy -Effective | Select-Object Namespace, NameServers
Get-DnsClientServerAddress -InterfaceIndex $vpn.ifIndex

När en regel matchar *.corp.example går frågor för det namnområdet till tunnelns DNS-servrar även om datavägen till dessa servrar stannar på den fysiska adaptern i delad-tunnelläge. Det är designen, och därför säger ett webbläsartest som öppnar en offentlig webbplats ingenting om interna namn. Om adaptern listar de förväntade servrarna men sökningar ändå går någon annanstans, jämför ordningen på NRPT-reglerna och kontrollera om ett mer specifikt namnområde matchar först.

Verifiera flödena och avgör sedan vad du faktiskt bad om

Gå igenom destinationerna i fast ordning så att resultaten är jämförbara mellan datorer: en offentlig adress, en intern adress, ett internt namn och ett medvetet undantag som en lokal skrivare eller ett videosamtal. Notera gränssnittet och källadressen som Find-NetRoute returnerar för varje. Efter varje principändring, återanslut och upprepa samma fyra kontroller; rutttabellen efter återanslutningen är det enda beviset på att den nya profilen trädde i kraft.

Separera sedan routning från verkställighet. Tvingad tunnling föredrar tunneln för täckt trafik medan den är uppe. Det är ingen kill switch. Om kravet är att ingenting lämnar datorn när tunneln faller måste det komma från en blockerande design: en brandväggsprofil knuten till tunnelns tillstånd, en alltid-på-profil med trafikfilter eller leverantörsklientens egen stäng-vid-fel-inställning. Tvingad tunnling måste också lämna VPN-serverns egen adress nåbar utanför tunneln, och att blockera den i namn av «tvinga allt» är ett pålitligt sätt att låsa sig ute från anslutningen du försöker genomdriva.

Innan du ändrar något, gå igenom den här listan. Varje punkt som misslyckas ringar in var det verkliga problemet finns.

  • Profilnamn och omfång bekräftade, med -AllUserConnection för profiler för hela datorn.
  • SplitTunneling läst och behandlat som konfiguration, inte som bevis på täckning.
  • Tunneladapterns rutter listade separat för IPv4 och IPv6.
  • Find-NetRoute kört för en offentlig, en intern och en undantagsdestination.
  • NRPT-regler kontrollerade innan rutterna fick skulden för ett namnfel.
  • Blockeringskravet läst igen: föredragen routning är inte samma sak som genomdriven blockering.

Beslutet om full eller delad tunnel tillhör den som äger profilen, och Microsofts routningsanteckningar beskriver det beteende som Windows implementerar när en profil ställer in det. Microsoft: tvingad och delad tunnling är referensen jag håller öppen medan jag läser utdata.

Relaterade artiklar