Il portatile si connette alla VPN dell'ufficio e tutto la segue, compresa la pagina web di una stampante e un'intranet che risponde solo sulla rete locale. Una route fatta a mano sistema le cose per un'ora, poi la connessione cade, torna, e l'eccezione è sparita. Non c'è niente di sbagliato nel tunnel: Windows tiene un'unica tabella di routing, e l'adattatore VPN riscrive la sua parte di quella tabella a ogni connessione. Ciò che sopravvive è tutto quello che vive fuori dalle voci proprie dell'adattatore.

Quale voce prende il tunnel

Registra la tabella due volte, una con il tunnel abbassato e una con il tunnel alzato, e confronta le righe predefinite. Quando il profilo rivendica il prefisso predefinito, la voce dell'adattatore è la riga più larga della tabella, quindi ogni eccezione deve essere più stretta di essa. È aritmetica sulla lunghezza del prefisso, non un'affermazione su fiducia o policy. Fissa anche quale interfaccia l'eccezione deve nominare.

Annota l'indice dell'interfaccia e il gateway locale prima di proseguire, perché entrambi cambiano quando la macchina si unisce a un'altra rete. I comandi qui sotto li leggono dalla macchina, non dalla memoria.

route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.30

Il secondo comando riporta l'interfaccia e il salto successivo che quell'unico indirizzo userebbe adesso, il che è meglio che leggere quaranta righe e tirare a indovinare. Eseguilo prima e dopo la connessione e hai la coppia che vale la pena allegare a un record di modifica. Entrambi gli output forniscono i numeri usati nel resto di questa pagina.

Una route per host vince per specificità

La corrispondenza del prefisso più lungo decide il vincitore, quindi un /32 attraverso il gateway fisico batte la predefinita attraverso il tunnel senza toccare il tunnel. Il traffico verso quell'indirizzo esce dall'interfaccia locale mentre tutto il resto mantiene il suo percorso attuale. Il tunnel porta ancora la predefinita e semplicemente smette di essere l'unico candidato per quella destinazione. La lunghezza del prefisso è l'unica leva che la tabella espone, e per questo compito basta.

La specificità esclude anche la scorciatoia ovvia di escludere un nome di dominio, perché la tabella confronta indirizzi e un nome può risolversi in diversi. Risolvi prima l'host, poi decidi quale dei suoi indirizzi merita l'eccezione.

Per tutto quanto segue, supponi una connessione chiamata Office, un gateway locale 10.0.0.1 sull'interfaccia 7, e una destinazione su 198.51.100.30. Sono segnaposto e non valori predefiniti, e i comandi sopra producono i valori che la tua macchina usa davvero. Conserva questa nota di sostituzione con la modifica, così il prossimo lettore non copia i numeri.

Fai sopravvivere la route alla prossima riconnessione

Windows non offre alcuna istruzione di esclusione su una connessione VPN, quindi l'eccezione deve vivere sull'interfaccia fisica, dove l'adattatore non la riscriverà. Il cmdlet che sembra la risposta fa il contrario: Add-VpnConnectionRoute sposta un prefisso dentro il tunnel, e questo è il caso speculare in cui un profilo diviso dovrebbe portare una destinazione e lasciare il resto in locale. Ricorrervi qui garantisce che il traffico che volevi tenere fuori entri.

La forma manuale è un solo comando. La sua debolezza è il cambio di rete, non la riconnessione.

route -p add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7

Questo sopravvive a un riavvio grazie a -p e manda un indirizzo fuori dall'interfaccia 7 mentre il tunnel porta tutto il resto. Sposta il portatile su un'altra rete e sia il gateway sia l'indice diventano obsoleti, così la voce fallisce in silenzio. Annota chi la possiede e quando va rimossa.

Uno script di connessione è la versione più robusta, perché riaggiunge l'eccezione dopo ogni connessione invece di sperare che la voce sia sopravvissuta. Le due righe qui sotto appartengono a ciò che avvia il tunnel, non a uno script di accesso.

rasdial Office
route add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7

Qualunque cosa alzi il tunnel è il posto giusto per la seconda riga, e rasdial torna solo dopo che la connessione è stabilita, così la route atterra dietro le voci proprie dell'adattatore. Eseguilo di nuovo dopo una ripresa, perché una sospensione può far cadere la route e lasciare il tunnel alzato. Se il compito è quello inverso, spingere un solo prefisso dentro il tunnel mentre il resto resta locale, allora Add-VpnConnectionRoute è lo strumento giusto.

Il routing non può scegliere un processo

A volte il requisito è più stretto di una destinazione: un programma dovrebbe prendere il percorso locale mentre tutto il resto resta dentro il tunnel. Il routing non può esprimerlo, perché confronta indirizzi e non processi. Lo schema praticabile spinge il problema nel launcher.

Tieni il profilo fuori dalla route predefinita e avvia quell'unico programma legato all'indirizzo dell'interfaccia locale, così l'eccezione diventa il comando di avvio e il tunnel conserva ciò che già gestiva. Nulla cambia nella tabella di routing, ed è per questo che sopravvive alle riconnessioni. Significa anche che il tunnel non deve possedere la route predefinita fin dall'inizio, quindi è un progetto diverso e non una pezza su quello precedente.

La sua debolezza è operativa, non tecnica. Il programma deve sempre avviarsi tramite il wrapper, e se il binding manca dopo una ripresa prende in silenzio qualunque percorso offra la tabella. È tollerabile per un browser che apri di proposito e inaccettabile per qualsiasi cosa che non debba mai lasciare il tunnel.

Le connessioni per utente non risolvono nemmeno questo. Windows può limitare una connessione a un account mentre la tabella di routing resta a livello di macchina, quindi una connessione limitata a un account che tiene una route predefinita reindirizza comunque ogni processo della macchina, comprese le altre sessioni. L'ambito diventa reale solo quando l'ambito della route coincide con l'account. Due persone che condividono un portatile condividono quindi una tabella, e la seconda eredita qualunque tunnel abbia avviato la prima.

Conferma che l'eccezione è sopravvissuta a una riconnessione

Prova la modifica come fallirà: disconnetti, riconnetti, apri un'applicazione nuova, poi richiedi un indirizzo che deve restare locale e uno che deve usare il tunnel. Confronta entrambi con Find-NetRoute nello stato connesso.

Se il prefisso manca dalla tabella dopo una riconnessione, vive nell'oggetto sbagliato e non nel formato sbagliato. Spostalo sull'interfaccia fisica e ripeti il test. Conserva entrambi gli output dei comandi con il record di modifica, perché un'istantanea dello stato funzionante risponde più avanti a più domande di un paragrafo di spiegazione. La prossima persona vorrà sapere che cosa ha prodotto la connessione, non che cosa intendevi produrre.

Articoli correlati