Excluir um host da rota padrão de uma VPN do Windows
Um perfil de túnel completo possui a rota padrão. Um host precisa de um prefixo mais estreito na interface física, que é adicionado novamente após cada conexão.
O portátil liga-se à VPN do escritório e tudo a segue, incluindo a página web de uma impressora e uma intranet que só responde na rede local. Uma rota feita à mão resolve isso por uma hora, depois a ligação cai, volta, e a exceção desapareceu. Não há nada de errado com o túnel: o Windows mantém uma única tabela de encaminhamento, e o adaptador VPN reescreve a sua parte dessa tabela em cada ligação. O que sobrevive é tudo o que vive fora das entradas do próprio adaptador.
Que entrada o túnel assume
Registe a tabela duas vezes, uma com o túnel desligado e outra com ele ligado, e compare as linhas padrão. Quando o perfil reclama o prefixo padrão, a entrada do adaptador é a linha mais larga da tabela, por isso qualquer exceção tem de ser mais estreita do que ela. Isto é aritmética sobre o comprimento do prefixo e não uma afirmação sobre confiança ou política. Também fixa qual interface a exceção tem de nomear.
Anote o índice da interface e o gateway local antes de avançar, porque ambos mudam quando a máquina se junta a outra rede. Os comandos abaixo leem-nos da máquina e não da memória.
route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.30
O segundo comando indica a interface e o salto seguinte que esse único endereço usaria agora, o que é melhor do que ler quarenta linhas e adivinhar. Execute-o antes e depois de ligar e terá o par que vale a pena juntar a um registo de alteração. Ambas as saídas fornecem os números usados no resto desta página.
Uma rota de host ganha por especificidade
A correspondência do prefixo mais longo decide o vencedor, por isso um /32 pelo gateway físico bate a rota padrão pelo túnel sem tocar no túnel. O tráfego para esse endereço sai pela interface local enquanto tudo o resto mantém o caminho atual. O túnel continua a transportar a rota padrão e simplesmente deixa de ser o único candidato para esse destino. O comprimento do prefixo é a única alavanca que a tabela expõe, e para esta tarefa chega.
A especificidade também descarta o atalho óbvio de excluir um nome de domínio, porque a tabela compara endereços e um nome pode resolver-se em vários. Resolva primeiro o host e depois decida qual dos seus endereços merece a exceção.
Para tudo o que segue, suponha uma ligação chamada Office, um gateway local 10.0.0.1 na interface 7, e um destino em 198.51.100.30. São marcadores de posição e não valores padrão, e os comandos acima produzem os valores que a sua máquina usa realmente. Guarde essa nota de substituição com a alteração para que o leitor seguinte não copie os números.
Faça a rota sobreviver à próxima reconexão
O Windows não oferece qualquer instrução de exclusão numa ligação VPN, por isso a exceção tem de viver na interface física, onde o adaptador não a reescreverá. O cmdlet que parece a resposta faz o contrário: Add-VpnConnectionRoute move um prefixo para dentro do túnel, e isso é o caso espelho em que um perfil dividido deve transportar um destino e deixar o resto em local. Recorrer a ele aqui garante que o tráfego que queria manter fora entra.
A forma manual é um único comando. A sua fraqueza é a mudança de rede e não a reconexão.
route -p add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
Isso sobrevive a um reinício graças a -p e envia um endereço pela interface 7 enquanto o túnel transporta tudo o resto. Mude o portátil para outra rede e tanto o gateway como o índice ficam desatualizados, por isso a entrada falha em silêncio. Registe quem é o dono e quando deve ser removida.
Um script de ligação é a versão mais robusta, porque volta a adicionar a exceção após cada ligação em vez de esperar que a entrada tenha sobrevivido. As duas linhas abaixo pertencem ao que inicia o túnel, não a um script de início de sessão.
rasdial Office
route add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
O que quer que levante o túnel é o local certo para a segunda linha, e rasdial só regressa depois de a ligação estar estabelecida, por isso a rota aterra atrás das entradas do próprio adaptador. Execute-o de novo após uma retoma, porque uma suspensão pode largar a rota e deixar o túnel levantado. Se a tarefa for a inversa, empurrar um único prefixo para dentro do túnel enquanto o resto fica em local, então Add-VpnConnectionRoute é a ferramenta certa.
O encaminhamento não consegue escolher um processo
Por vezes o requisito é mais estreito do que um destino: um programa deve seguir o caminho local enquanto tudo o resto fica dentro do túnel. O encaminhamento não consegue exprimir isso, porque compara endereços e não processos. O padrão viável empurra o problema para o lançador.
Mantenha o perfil fora da rota padrão e arranque esse único programa ligado ao endereço da interface local, assim a exceção passa a ser o comando de arranque e o túnel conserva o que já tratava. Nada muda na tabela de encaminhamento, e é por isso que isto sobrevive às reconexões. Também significa que o túnel não deve possuir a rota padrão desde o início, por isso é um desenho diferente e não um remendo no anterior.
A sua fraqueza é operacional e não técnica. O programa tem de arrancar sempre através do invólucro, e se a ligação faltar após uma retoma, toma em silêncio qualquer caminho que a tabela ofereça. Isso é tolerável para um navegador que abre de propósito e inaceitável para qualquer coisa que nunca deva sair do túnel.
As ligações por utilizador também não resolvem isto. O Windows pode limitar uma ligação a uma conta enquanto a tabela de encaminhamento continua a ser de toda a máquina, por isso uma ligação limitada a uma conta que detenha uma rota padrão ainda redireciona todos os processos da máquina, incluindo outras sessões. O âmbito só se torna real quando o âmbito da rota coincide com a conta. Duas pessoas que partilham um portátil partilham, portanto, uma tabela, e a segunda herda o túnel que a primeira tiver iniciado.
Confirme que a exceção sobreviveu a uma reconexão
Teste a alteração tal como vai falhar: desligue, volte a ligar, abra uma aplicação nova e depois peça um endereço que deva ficar local e outro que deva usar o túnel. Compare ambos com Find-NetRoute no estado ligado.
Se o prefixo faltar da tabela após uma reconexão, vive no objeto errado e não no formato errado. Mova-o para a interface física e repita o teste. Guarde ambas as saídas dos comandos com o registo de alteração, porque um instantâneo do estado que funciona responde mais tarde a mais perguntas do que um parágrafo de explicação. A pessoa seguinte vai querer saber o que a ligação produziu, não o que pretendia produzir.