Wyłączenie jednego hosta z domyślnej trasy VPN w Windows
Profil z pełnym tunelem posiada trasę domyślną. Jeden host wymaga węższego prefiksu na interfejsie fizycznym, dodawanego ponownie po każdym połączeniu.
Laptop łączy się z firmowym VPN i wszystko idzie za nim, łącznie ze stroną internetową drukarki i jednym intranetem, który odpowiada tylko w sieci lokalnej. Ręcznie zrobiona trasa naprawia to na godzinę, potem połączenie pada, wraca, a wyjątek znika. Z tunelu nic nie jest zepsute: Windows prowadzi jedną tablicę routingu, a adapter VPN przy każdym połączeniu przepisuje swoją część tej tablicy. Przetrwa tylko to, co znajduje się poza własnymi wpisami adaptera.
Który wpis przejmuje tunel
Zapisz tablicę dwa razy, raz z tunelem wyłączonym, a raz włączonym, i porównaj wiersze domyślne. Gdy profil zajmuje prefiks domyślny, wpis adaptera jest najszerszym wierszem w tablicy, więc każdy wyjątek musi być od niego węższy. To arytmetyka długości prefiksu, a nie stwierdzenie o zaufaniu czy polityce. Określa też, który interfejs musi wskazać wyjątek.
Zapisz indeks interfejsu i lokalną bramę, zanim przejdziesz dalej, bo oba zmieniają się, gdy maszyna dołączy do innej sieci. Poniższe polecenia czytają je z maszyny, a nie z pamięci.
route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.30
Drugie polecenie podaje interfejs i następny skok, których ten jeden adres użyłby teraz, co jest lepsze niż czytanie czterdziestu wierszy i zgadywanie. Uruchom je przed i po połączeniu, a będziesz mieć parę wartą dołączenia do zapisu zmiany. Oba wyjścia dostarczają liczb używanych w dalszej części tej strony.
Trasa do hosta wygrywa dzięki szczegółowości
Dopasowanie najdłuższego prefiksu decyduje o zwycięzcy, więc /32 przez fizyczną bramę bije trasę domyślną przez tunel, nie dotykając tunelu. Ruch do tego adresu wychodzi przez lokalny interfejs, a wszystko inne zachowuje dotychczasową drogę. Tunel nadal niesie trasę domyślną i po prostu przestaje być jedynym kandydatem dla tego celu. Długość prefiksu to jedyna dźwignia, jaką daje tablica, i do tego zadania wystarcza.
Szczegółowość wyklucza też oczywisty skrót polegający na wyłączeniu nazwy domeny, bo tablica dopasowuje adresy, a jedna nazwa może się rozwiązać na kilka. Najpierw rozwiąż hosta, potem zdecyduj, który z jego adresów zasługuje na wyjątek.
Dla wszystkiego poniżej przyjmij połączenie o nazwie Office, bramę lokalną 10.0.0.1 na interfejsie 7 i cel pod adresem 198.51.100.30. To placeholdery, a nie wartości domyślne, a powyższe polecenia dają wartości, których twoja maszyna naprawdę używa. Zachowaj tę notatkę o podstawieniu razem ze zmianą, żeby następny czytelnik nie skopiował liczb.
Spraw, by trasa przetrwała następne ponowne połączenie
Windows nie oferuje żadnej instrukcji wykluczenia na połączeniu VPN, więc wyjątek musi żyć na interfejsie fizycznym, gdzie adapter go nie przepisze. Polecenie, które wygląda jak odpowiedź, robi odwrotnie: Add-VpnConnectionRoute przenosi prefiks do tunelu, a to jest przypadek lustrzany, w którym podzielony profil ma nieść jeden cel, a resztę zostawić lokalnie. Sięganie po nie tutaj gwarantuje, że ruch, który chciałeś trzymać na zewnątrz, wejdzie do środka.
Forma ręczna to jedno polecenie. Jej słabością jest zmiana sieci, a nie ponowne połączenie.
route -p add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
To przetrwa restart dzięki -p i wysyła jeden adres przez interfejs 7, podczas gdy tunel niesie wszystko inne. Przenieś laptop do innej sieci, a brama i indeks staną się nieaktualne, więc wpis po cichu zawiedzie. Zapisz, kto jest właścicielem wpisu i kiedy należy go usunąć.
Skrypt połączenia to wersja solidniejsza, bo dodaje wyjątek ponownie po każdym połączeniu, zamiast liczyć na to, że wpis przetrwał. Dwie linie poniżej należą do tego, co uruchamia tunel, a nie do skryptu logowania.
rasdial Office
route add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
Cokolwiek podnosi tunel, jest właściwym miejscem dla drugiej linii, a rasdial wraca dopiero po nawiązaniu połączenia, więc trasa ląduje za własnymi wpisami adaptera. Uruchom ją ponownie po wybudzeniu, bo uśpienie może zrzucić trasę i zostawić tunel podniesiony. Jeśli zadanie jest odwrotne, wepchnąć jeden prefiks do tunelu, a resztę zostawić lokalnie, to Add-VpnConnectionRoute jest właściwym narzędziem.
Routing nie może wybrać procesu
Czasem wymaganie jest węższe niż cel: jeden program ma iść drogą lokalną, a wszystko inne zostaje w tunelu. Routing nie potrafi tego wyrazić, bo dopasowuje adresy, a nie procesy. Działający wzorzec wpycha problem do launchera.
Trzymaj profil z dala od trasy domyślnej i uruchom ten jeden program związany z adresem interfejsu lokalnego, wtedy wyjątkiem staje się polecenie startowe, a tunel zachowuje to, co już obsługiwał. W tablicy routingu nic się nie zmienia i dlatego to przetrwa ponowne połączenia. To znaczy też, że tunel nie może posiadać trasy domyślnej od początku, więc jest to inny projekt, a nie łatka na poprzedni.
Jego słabość jest operacyjna, a nie techniczna. Program musi zawsze startować przez opakowanie, a jeśli po wybudzeniu brakuje powiązania, po cichu bierze dowolną drogę, jaką daje tablica. To do przyjęcia dla przeglądarki, którą otwierasz świadomie, i nie do przyjęcia dla czegokolwiek, co nigdy nie powinno opuścić tunelu.
Połączenia dla poszczególnych użytkowników też tego nie rozwiązują. Windows może ograniczyć połączenie do konta, podczas gdy tablica routingu pozostaje dla całej maszyny, więc połączenie przypisane do konta i trzymające trasę domyślną nadal przekierowuje każdy proces na maszynie, łącznie z innymi sesjami. Zakres staje się realny dopiero wtedy, gdy zakres trasy pasuje do konta. Dwie osoby dzielące jeden laptop dzielą więc jedną tablicę, a druga dziedziczy tunel, który uruchomiła pierwsza.
Potwierdź, że wyjątek przetrwał ponowne połączenie
Przetestuj zmianę tak, jak zawiedzie: rozłącz, połącz ponownie, otwórz nową aplikację, a potem poproś o jeden adres, który ma zostać lokalny, i jeden, który ma korzystać z tunelu. Porównaj oba z Find-NetRoute w stanie połączonym.
Jeśli prefiksu brakuje w tablicy po ponownym połączeniu, żyje on w złym obiekcie, a nie w złym formacie. Przenieś go na interfejs fizyczny i powtórz test. Zachowaj oba wyjścia poleceń przy zapisie zmiany, bo zrzut działającego stanu odpowiada później na więcej pytań niż akapit wyjaśnienia. Następna osoba będzie chciała wiedzieć, co wytworzyło połączenie, a nie co zamierzałeś wytworzyć.