Para me conectar à rede corporativa do meu cliente, tenho usado o Cisco AnyConnect Secure Mobility Client, e isso funciona bem, mas não parece me permitir usar o tunelamento dividido (apesar do fato de que a própria VPN, de acordo com a guia Estatísticas do aplicativo, tem Modo Túnel (IPv4): Split Include, o que, no meu entender, significa que posso). (Sim, entendo por que o túnel dividido pode ser perigoso, mas o bloqueio da VPN está interferindo no meu trabalho e o departamento de TI do meu cliente não está interessado em abrir exceções para um contratante – e como eu disse, a configuraçãoparece quepermitir.)
Tentando encontrar uma maneira de fazer o túnel dividido funcionar, instalei o OpenConnect e ele se conecta perfeitamente – ele aceita minhas credenciais, vejo a mensagem “banner” da empresa no log, funciona. Mas nenhum dos destinos que posso acessar apenas através da VPN funciona.
Suspeito que o problema esteja nas rotas. Tanto o AnyConnect quanto o OpenConnect adicionam diversas rotas para destinos de rede específicos (os mesmos), mas têm valores diferentes para Gateway e Interface. Por exemplo,
AnyConnect
===========================================================================
Interface List
14...00 05 9a 3c 7a 00 ......Cisco AnyConnect Secure Mobility Client Virtual Miniport Adapter for Windows x64
[...]
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.151 35
[...]
a.b.c.x 255.255.255.255 On-link a.b.c.d 2
a.b.c.y 255.255.255.255 On-link a.b.c.d 2
a.b.c.z 255.255.255.255 On-link a.b.c.d 2
[...]
192.168.1.1 255.255.255.255 On-link 192.168.1.151 36
[...]
224.0.0.0 240.0.0.0 On-link a.b.c.d 10000
[...]
255.255.255.255 255.255.255.255 On-link a.b.c.d 10000
OpenConnect
Interface List
[...]
63...00 ff 8d 2a 8a 57 ......TAP-Windows Adapter V9
[...]
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.151 36
[...]
a.b.c.x 255.255.255.255 a.b.c.(d+1) 192.168.1.151 36
a.b.c.y 255.255.255.255 a.b.c.(d+1) 192.168.1.151 36
a.b.c.z 255.255.255.255 a.b.c.(d+1) 192.168.1.151 36
[...]
224.0.0.0 240.0.0.0 On-link a.b.c.d 291
[...]
255.255.255.255 255.255.255.255 On-link a.b.c.d 291
Além da 0.0.0.0
rota, todas essas rotas são adicionadas conectando-se à VPN. Para 0.0.0.0
, o OpenConnect altera a métrica da rota 0.0.0.0
para 36 (os valores mostrados na tabela AnyConnect também são os mesmos de quando estou totalmente desconectado). (Para constar, o AnyConnect também remove várias rotas IPv6, que o OpenConnect deixa de lado - não acho que isso importe?)
Para contrastar explicitamente as adições, o AnyConnect usa “On-link” para o Gateway, enquanto o OpenConnect usa um endereço IP que é quase o mesmo que o AnyConnect usa para a Interface. Para Interface, OpenConnect usa um endereço IP privado. Os endereços IP usados para a interface do AnyConnect e o gateway do OpenConnect estão em um intervalo de propriedade do cliente.
As métricas também são diferentes – AnyConnect usa 2, que tem prioridade mais alta do que minha 0.0.0.0
rota (definida como 35 quando desconectado ou conectado via AnyConnect), enquanto OpenConnect usa 36 – e também altera minha 0.0.0.0
rota para usar 36, então a prioridade é a mesma ( todas as outras rotas em meu sistema usam uma métrica superior a 36, para registro).
AnyConnect também adiciona uma rota para 192.168.1.1
, para 192.168.1.151
, que é o que o OpenConnect usa para a interface. Este é o único caminho que um tem e falta ao outro.
Ambos também adicionam rotas para 224.0.0.0
e 255.255.255.255
, mas o AnyConnect usa uma métrica de 10.000 (maior que qualquer outra rota), enquanto o OpenConnect usa 291 (maior que qualquer outra adição, mas menor que algumas outras rotas existentes que eu tinha antes de me conectar). Curiosamente, o OpenConnect usa o mesmo gateway e interface que o AnyConnect usa para essas duas rotas, apesar de usar valores diferentes para todas as outras rotas.
Isso está em uma máquina Windows 10 Pro x64. Cisco AnyConnect é a versão 4.5.03040; GUI do OpenConnect é “Versão1.5.3(32 bits) [...] Baseado em OpenConnect v7.08.”
Eu realmente não sei muito sobre roteamento ou VPNs; mesmo obter tanta informação exigiu muita pesquisa e leitura. Eu nem conhecia o termo “túnel dividido” antes de começar isso. Muitas das informações disponíveis também estão desatualizadas - o Windows 10 não oferece a opção “Usar gateway padrão na rede remota” para desmarcar, pois muitas outras respostas aqui e em outros lugares recomendam o tunelamento dividido no AnyConnect. Não sei se há outros detalhes pertinentes que posso fornecer, mas certamente ficarei feliz se precisar de mais alguma coisa. Obviamente, tenho tentado mascarar os endereços IP dos meus clientes, mas não acho que o endereço específico deva importar muito aqui (não sei se há algum motivo para mascará-los também, mas não é minha informação compartilhar, então Eu não sou).
Responder1
Com base na resposta de KRyan, modifiquei meu script openconnect (vpnc-script.js na pasta openconnect gui!) Assim e isso me ajudou em uma situação semelhante:
for (var i = 0 ; i < parseInt(env("CISCO_SPLIT_INC")); i++) {
var network = env("CISCO_SPLIT_INC_" + i + "_ADDR");
var netmask = env("CISCO_SPLIT_INC_" + i + "_MASK");
var netmasklen = env("CISCO_SPLIT_INC_" + i + "_MASKLEN");
exec("route add " + network + " mask " + netmask);
}
=>
for (var i = 0 ; i < parseInt(env("CISCO_SPLIT_INC")); i++) {
var network = env("CISCO_SPLIT_INC_" + i + "_ADDR");
var netmask = env("CISCO_SPLIT_INC_" + i + "_MASK");
var netmasklen = env("CISCO_SPLIT_INC_" + i + "_MASKLEN");
exec("route add " + network + " mask " + netmask + " " + internal_gw+" metric 2 if "+env("TUNIDX"));
}
(linha 175)
O bug na minha opinião está aqui:
// Calculate the first usable address in subnet
var internal_gw_array = new Array(
address_array[0] & netmask_array[0],
address_array[1] & netmask_array[1],
address_array[2] & netmask_array[2],
(address_array[3] & netmask_array[3]) + 1
);
var internal_gw = internal_gw_array.join(".");
Com uma máscara de rede de 255.255.255.255 para meu IP interno passado por var netmask_array = env("INTERNAL_IP4_NETMASK").split(".");
, esse truque de gateway (em última análise, uma rota vai para uma interface, o IP do gateway é inútil aqui) parece falhar
Responder2
Eu estava certo ao dizer que as rotas eram o problema. Foram necessárias muitas tentativas e erros para acertar, mas eventualmente atualizar as rotas manualmente após a conexão funcionou.
Estranhamente, route CHANGE
não funcionou; Eu tive que usar route ADD
, embora, pelo que sei, essas rotas já existissem depois que me conectei. Usei o mesmo destino, máscara e gateway e, em seguida, METRIC 2 IF 17
(já que a interface “TAP-Windows Adapter V9” estava usando 17 - suspeito que mudará a cada reinicialização? desconectar e reconectar parece usar 17 consistentemente por enquanto, mas como você pode ver na pergunta que estava usando 63 então). Depois de fazer isso, havia duas entradas listadas route PRINT
para esse destino (a adicionada pelo OpenConnect e a que eu adicionei) e isso me permitiu conectar.
O que considero absolutamente bizarro, porém, é que minha rota recém-adicionada tem uma métrica de 37 – não a 2 que coloquei no route ADD
comando, e maior que a 36 que a entrada existente tinha. Mas seja o que for, funciona.
Felizmente, nosso projeto mantém um hosts
arquivo (para os desenvolvedores copiarem em seus próprios hosts
arquivos quando começarem a trabalhar nele e que nossas ferramentas de construção verifiquem), então consegui escrever um script em lote para ajustar as rotas. Para o bem de qualquer pessoa que queira fazer isso, meu script em lote se parece com isto
FOR /F "tokens=1" %%i IN (\path\to\our\development\hosts) DO (
route ADD %%i MASK 255.255.255.255 a.b.c.d METRIC 2 IF 17
)
O hosts
formato do arquivo é o mesmo do arquivo do sistema: a.b.c.d URL
. Este script não suporta comentários (embora eu imagine que eles route ADD
simplesmente falharão) e não sei se as linhas em branco serão um problema ou não (mas, novamente, provavelmente apenas um failed route ADD
).
Provavelmente terei que ajustá-lo para esses 17, pois suspeito que não será constante; quando isso acontecer, examinarei como determinar o que é e, em vez disso, usarei uma variável para isso. (E atualizarei esta resposta também.)
Responder3
Não que você ainda não tenha descoberto algo que funcione, mas parece não entender como as métricas de rota são usadas.Eles são realmente apenas um desempate em uma circunstância muito específica. Citando a resposta vinculada:
A seleção de rota no Windows envolve:
- Encontrar as rotas mais específicas para o destino
- Selecionando a rota mais específica com a métrica mais baixa.
E se quiser tornar seu script menos frágil, você podedeterminar programaticamente o número da interface.