Podłączyłem klienta VPN na laptopie z Windows 11, kafelek przeszedł w stan Connected, otworzył się wewnętrzny udział plików, a publiczna witryna nadal ładowała się bezpośrednio z Wi-Fi biura. Ta mieszanka wygląda jak zepsuty tunel. To normalne wyjście profilu, który część ruchu wysyła przez VPN, a resztę zostawia na karcie fizycznej. Wymuszone tunelowanie zmienia to, której trasie domyślnej Windows daje pierwszeństwo; nie usuwa bardziej szczegółowych tras i nie obiecuje, że ruch zatrzyma się po zerwaniu połączenia. Poniżej przedstawiam kolejność, którą przechodzę, gdy klient twierdzi, że ma pokrycie: stan klienta, zapisany profil, zastosowane trasy, resolver, a potem rzeczywiste przepływy.

Zacznij od klienta, a potem przestań mu ufać

Klient jest właściwym miejscem na start tylko dlatego, że mówi, który profil jest aktywny. Otwórz właściwości połączenia i zanotuj dokładną nazwę profilu, czy utworzono go dla bieżącego użytkownika, czy dla wszystkich na maszynie, i która karta pojawia się w ncpa.cpl po połączeniu. Na moim testowym laptopie karta nosiła nazwę profilu, co ułatwiało czytanie wyjścia tras. Na innych maszynach pojawia się jako wpis WAN Miniport, a nazwa nic ci nie mówi.

Tego, czego klient nie może ci powiedzieć, to pokrycie. Podłączony kafelek opisuje stan tunelu, a nie spis celów. Klienci firm trzecich również trzymają własną konfigurację, więc natywny profil Windows i każda właściwość, którą z niego odczytasz, mogą nie mieć nic wspólnego z tym, co zainstalował ten klient. Jeśli VPN przyszedł przez AnyConnect, OpenVPN GUI, WireGuard lub agenta dostawcy, poniższe kontrole PowerShell w większości nie mają zastosowania i zamiast tego powinieneś przeczytać własne ustawienia split-tunnelu i routingu tego klienta.

Czytaj zapisany profil, nie kafelek

Dla natywnego profilu Windows (IKEv2, L2TP, SSTP lub profilu wypychanego przez MDM) zapisana decyzja o split-tunnelu to jedna właściwość:

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

Dodaj -AllUserConnection, gdy profil utworzono dla wszystkich na urządzeniu. Bez tego czytasz listę bieżącego użytkownika, która może być pusta lub zawierać inny wpis o podobnej nazwie. Wartość False w SplitTunneling oznacza, że profil zapisano jako pełny tunel: Windows instaluje trasę domyślną przez kartę VPN. True oznacza split tunnel, a pokrycie zależy wtedy wyłącznie od tras i reguł rozwiązywania nazw, które wypycha ten profil.

Traktuj tę wartość jako konfigurację, nie jako obserwację. Zapisuje, o co profil prosił w momencie połączenia. Windows może skończyć z innymi zastosowanymi trasami z powodu bardziej szczegółowej trasy innego interfejsu, ustawienia zasad lub resztki z poprzedniego połączenia, więc wartość logiczna nigdy nie rozstrzyga sprawy sama.

Porównaj zapisaną wartość z zastosowaną tabelą tras

Po połączeniu wylistuj trasy na karcie tunelu zamiast przewijać całą tabelę:

$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 to użyteczna połowa. Odpowiada na pytanie, na które klient nigdy nie odpowiada: dla tego celu, którego interfejsu i którego adresu źródłowego Windows naprawdę użyje? Uruchom go dla hosta wewnętrznego, hosta publicznego i wszystkiego, co uważasz za celowy wyjątek. Profil pełnego tunelu powinien pokazać interfejs tunelu dla adresu publicznego. Profil split tunnel zwykle pokazuje tam kartę fizyczną, podczas gdy prefiksy wewnętrzne nadal rozwiązują się przez VPN.

Dwie pułapki wyjaśniają większość zgłoszeń „trasuje w złą stronę”. Najbardziej szczegółowy prefiks zawsze wygrywa, więc /24 na karcie fizycznej bije trasę domyślną na VPN, niezależnie od tego, jak niska jest metryka tunelu. Metryka rozstrzyga tylko remisy między trasami dla tego samego prefiksu. A IPv4 i IPv6 są rozstrzygane osobno: profil obejmujący 0.0.0.0/0 może zostawić IPv6 na łączu lokalnym, przez co witryna dual-stack wygląda na wpół tunelowaną. Sprawdź Get-NetRoute -AddressFamily IPv6, zanim uznasz, że tunel jest w porządku.

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

Sprawdź rozwiązywanie nazw osobno za pomocą NRPT

Wewnętrzne nazwy, które zawodzą, gdy wewnętrzne adresy IP działają, wskazują na zasady resolvera, a nie na routing. Windows rozstrzyga DNS dla każdej przestrzeni nazw przez tabelę zasad rozwiązywania nazw, niezależną od tabeli tras:

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

Gdy reguła pasuje do *.corp.example, zapytania dla tej przestrzeni nazw idą do serwerów DNS tunelu, nawet jeśli ścieżka danych do tych serwerów w trybie split tunnel pozostaje na karcie fizycznej. Taki jest projekt i dlatego test przeglądarki otwierający publiczną witrynę nic nie mówi o nazwach wewnętrznych. Jeśli karta wymienia oczekiwane serwery, ale wyszukiwania nadal idą gdzie indziej, porównaj kolejność reguł NRPT i sprawdź, czy jako pierwsza pasuje bardziej szczegółowa przestrzeń nazw.

Zweryfikuj przepływy, a potem zdecyduj, o co naprawdę prosiłeś

Przejdź cele w ustalonej kolejności, aby wyniki były porównywalne między maszynami: adres publiczny, adres wewnętrzny, nazwa wewnętrzna i jeden celowy wyjątek, na przykład lokalna drukarka lub rozmowa wideo. Zanotuj interfejs i adres źródłowy, które Find-NetRoute zwraca dla każdego. Po każdej zmianie zasad połącz się ponownie i powtórz te same cztery kontrole; tabela tras po ponownym połączeniu jest jedynym dowodem, że nowy profil wszedł w życie.

Następnie oddziel routing od egzekwowania. Wymuszone tunelowanie preferuje tunel dla objętego ruchu, dopóki jest podniesiony. To nie jest kill switch. Jeśli wymaganiem jest, aby nic nie opuszczało maszyny, gdy tunel padnie, musi to pochodzić z projektu blokującego: profil zapory powiązany ze stanem tunelu, profil zawsze włączony z filtrami ruchu lub własna opcja zamknięcia przy awarii klienta dostawcy. Wymuszone tunelowanie musi też pozostawić adres samego serwera VPN osiągalny poza tunelem, a blokowanie go w imię „wymuszania wszystkiego” to pewny sposób, by odciąć się od połączenia, które próbujesz wyegzekwować.

Zanim cokolwiek zmienisz, przejdź tę listę. Każdy nieudany punkt zawęża, gdzie leży prawdziwy problem.

  • Nazwa i zakres profilu potwierdzone, z -AllUserConnection dla profili na poziomie maszyny.
  • SplitTunneling przeczytany i potraktowany jako konfiguracja, nie jako dowód pokrycia.
  • Trasy karty tunelu wylistowane osobno dla IPv4 i IPv6.
  • Find-NetRoute uruchomiony dla jednego celu publicznego, jednego wewnętrznego i jednego wyjątku.
  • Reguły NRPT sprawdzone, zanim trasy obwiniono o błąd nazwy.
  • Wymóg blokowania przeczytany ponownie: preferowany routing to nie to samo co wymuszone blokowanie.

Decyzja o pełnym lub dzielonym tunelu należy do właściciela profilu, a notatki Microsoftu dotyczące routingu opisują zachowanie, które Windows realizuje, gdy profil je ustawia. Microsoft: tunelowanie wymuszone i dzielone to źródło, które trzymam otwarte podczas czytania wyjścia.

Powiązane artykuły