Wyzwalacz VPN dla aplikacji w Windows a tunelowanie dzielone: co izoluje
Profil VPN Windows uruchamiany przez aplikację tylko otwiera tunel. Rutowane tunelowanie dzielone decyduje, co do niego wchodzi, a każde z nich zawodzi inaczej dla jednej aplikacji.
Dwie konfiguracje Windows wyglądają w Ustawieniach tak samo i zachowują się zupełnie inaczej. Jedna to skopiowany profil VPN z wyzwalaczem aplikacji, więc uruchomienie jednego pliku wykonywalnego podnosi tunel. Druga to profil z tunelowaniem dzielonym, którego lista tras przypadkiem obejmuje to, z czym rozmawia ta aplikacja. Pierwsza odpowiada, kiedy tunel istnieje. Druga odpowiada, które pakiety do niego wchodzą, i tylko druga zostawia resztę maszyny na łączu fizycznym, gdy aplikacja pozostaje połączona.
Wyzwalacz to reguła cyklu życia, nie reguła routingu
Add-VpnConnectionTriggerApplication wiąże ścieżkę pliku wykonywalnego z nazwą profilu. Gdy ten proces się rozpocznie, Menedżer połączeń dostępu zdalnego wybiera profil, a gdy warunek wyzwalacza się skończy, połączenie może się zerwać. Nic w tej wymianie nie sprawdza gniazd. Polecenie wymaga podniesionej powłoki, pełnej ścieżki do pliku binarnego i -Force gdy zastępujesz istniejący wpis. Potwierdź, że skojarzenie przetrwało, za pomocą Get-VpnConnectionTrigger zamiast ufać monitowi; dokumentacja Add-VpnConnectionTriggerApplication wymienia parametry i przykłady.
Dwie granice wyjaśniają większość zgłoszeń, że „wyzwalacz nic nie robi”. Wyzwalacze są zbudowane wokół profili dla wszystkich użytkowników, więc zakres profilu to pierwsza rzecz do ustalenia, a ścieżka aplikacji musi odpowiadać plikowi binarnemu, który naprawdę działa, a nie skrótowi ani launcherowi tworzącemu drugi proces. Druga granica jest zamierzona: w sieci, którą Windows klasyfikuje jako zaufaną, wyzwalacz pozostaje bezczynny, bo profil jest przeznaczony do pracy poza biurem.
Add-VpnConnectionTriggerApplication -Name "APP_VPN" -ApplicationID "C:\Program Files\Vendor\app.exe" -Force
Get-VpnConnectionTrigger -Name "APP_VPN" | Format-List *
Get-VpnConnection -Name "APP_VPN" | Format-List Name,ConnectionStatus,SplitTunneling,AllUserConnection
Tunelowanie dzielone decyduje, co przekracza tunel
Przy wyłączonym tunelowaniu dzielonym Windows instaluje trasę domyślną opartą na klasie z niską metryką na interfejsie VPN. Każde gniazdo za nią podąża, łącznie z przeglądarką i usługą aktualizacji, więc wyzwalacz w tej konfiguracji przenosi całą maszynę, dopóki profil jest połączony. Wyzwalacz nadal jest tylko regułą cyklu życia; promień rażenia pochodził z trasy.
Przy włączonym tunelowaniu dzielonym profil niesie tylko prefiksy, które wypycha brama lub które dodasz do interfejsu VPN. Wszystko inne nadal korzysta z fizycznej trasy domyślnej. To układ, który ludzie zwykle mają na myśli, mówiąc „jedna aplikacja przez osobne wyjście”, i jest to decyzja routingu od początku do końca.
Set-VpnConnection -Name "APP_VPN" -SplitTunneling $true
Get-VpnConnection -Name "APP_VPN" | Select-Object SplitTunneling
Get-NetRoute -InterfaceAlias "APP_VPN" | Sort-Object DestinationPrefix
Gdzie rutowany podział przestaje izolować Twoją aplikację
Częsta awaria to cel, który nigdy nie pojawia się na liście tras tunelu. Aplikacja, która loguje się pod jeden adres, a potem streamuje z CDN, albo rozwiązuje tuzin rotujących punktów końcowych, umieści część połączeń na interfejsie VPN, a resztę w Wi-Fi. IPv6 to osobna tabela, więc profil wypychający tylko prefiksy IPv4 może wyglądać poprawnie, podczas gdy ruch IPv6 aplikacji pozostaje lokalny.
Dwa mniejsze efekty znaczą tyle samo. Wygrywa najdłuższe dopasowanie prefiksu, więc bardziej szczegółowa trasa on-link, /32 wypchnięty dla hosta zarządzającego albo podsieć drugiego adaptera mogą pobić tunel dokładnie dla adresu, na którym Ci zależy. Rozwiązywanie nazw odbywa się też przed routingiem: jeśli serwery DNS profilu lub reguła NRPT nie obejmują nazwy, aplikacja może rozwiązać ją przez adapter fizyczny, a potem wybrać adres, który nigdy nie był w tunelowanych prefiksach.
Trzy kształty i co każdy daje
Tabela to część, którą przykleiłbym do ściany, bo decyzja dotyczy promienia rażenia, a nie funkcji. Jeśli cele aplikacji to stabilne prefiksy, które możesz wypisać, rutowany podział daje izolację przy najmniejszym śladzie. Jeśli nie, profil z trasą domyślną za VM lub drugim urządzeniem utrzymuje rozdział uczciwie kosztem przenoszenia więcej niż jednego procesu.
| Shape | What starts the tunnel | What enters it | Pick it when |
|---|---|---|---|
| Trigger plus routed split | Process start | Only pushed or added prefixes | The app's endpoints are stable prefixes and the host should stay direct |
| Trigger plus default route | Process start | Everything, machine-wide | You need one exit for all traffic and accept the wider scope |
| Separate VM or device | Guest boot or login | Everything inside that guest | The app's destinations rotate, or the host must keep its own public address |
Czego żadna z tych opcji nie daje, to powiązanie na poziomie gniazda na hoście. Klasyczny klient VPN Windows nie ma reguły, że ten proces musi używać tego adaptera; wyzwalacze i filtry tras żyją w różnych warstwach, a warstwą wybierającą interfejs jest tabela routingu. Jeśli poradnik obiecuje wymuszanie dla poszczególnych aplikacji wyłącznie ze skopiowanego profilu, zapytaj, która trasa lub który filtr wykonuje pracę.
Sprawdź parę w jednym przebiegu
Testuj cykl życia i routing osobno, w tej kolejności. Zamknij aplikację, potwierdź, że profil pokazuje Disconnected, potem uruchom aplikację i sprawdź, czy stan się zmienił. Dopiero gdy tunel jest podniesiony, pytaj, dokąd idzie konkretny cel, i używaj adresu, który aplikacja naprawdę wybiera, a nie domysłu.
$app = Get-Process app | Select-Object -First 1
Get-VpnConnection -Name "APP_VPN" | Select-Object ConnectionStatus
Get-NetTCPConnection -OwningProcess $app.Id -State Established | Select-Object RemoteAddress,RemotePort
Find-NetRoute -RemoteIPAddress 203.0.113.10
Find-NetRoute nazywa interfejs i następny skok, który przeniósłby ten cel. Fizyczny alias w tym miejscu oznacza, że tunel jest podniesiony i nieistotny dla tego przepływu: sprawdź wypchnięte prefiksy, potem bardziej szczegółowe trasy, potem IPv6. Jeśli stan w ogóle się nie zmienia, wyzwalacz nie zadziałał, a ścieżka pliku wykonywalnego, zakres profilu i dziennik operacyjny klienta VPN to trzy miejsca do sprawdzenia.
Posprzątaj porządnie, żeby następny test był uczciwy
Usuwaj w odwrotnej kolejności do budowy: najpierw wyzwalacz aplikacji, potem profil. Usunięcie profilu przy pozostawionym wyzwalaczu zostawia wiszące skojarzenie, które myli następną próbę, a Remove-VpnConnection -Force nie zawsze czyści wpisu książki telefonicznej utworzonego poza poleceniami cmdlet.
Wpisy dla poszczególnych użytkowników są w rasphone.pbk użytkownika w profilu Roaming; wpisy dla wszystkich użytkowników są w ProgramData. Sprawdź magazyn odpowiedni do zakresu profilu, połącz ponownie profil, który zachowałeś, i potwierdź, że jego trasy i DNS nadal działają, aby późniejszy test mierzył wprowadzoną zmianę, a nie pozostały stan.
- Tunel startuje przy starcie procesu, nie przy logowaniu.
- Na interfejsie VPN pojawiają się tylko zamierzone prefiksy.
- Rzeczywisty adres zdalny aplikacji rozwiązuje się na alias VPN.
- Po usunięciu profilu nie zostaje żaden wiszący wyzwalacz.