Para conectarme a la red corporativa de mi cliente, he estado usando Cisco AnyConnect Secure Mobility Client, y esto funciona bien pero no parece permitirme usar túnel dividido (a pesar de que la VPN en sí, según la pestaña Estadísticas de la aplicación, tiene modo túnel (IPv4): inclusión dividida, lo que, según tengo entendido, debería significar que puedo). (Sí, entiendo por qué el túnel dividido puede ser peligroso, pero el bloqueo de la VPN está interfiriendo con mi trabajo y el departamento de TI de mi cliente no está interesado en hacer excepciones para un contratista y, como dije, la configuraciónparece serPermitelo.)
Al tratar de encontrar una manera de hacer que funcione el túnel dividido, instalé OpenConnect y se conecta perfectamente: acepta mis credenciales, veo el mensaje "banner" de la empresa en el registro, funciona. Pero ninguno de los destinos a los que puedo acceder sólo a través de la VPN funciona.
Sospecho que el problema está en las rutas. Tanto AnyConnect como OpenConnect agregan una serie de rutas a destinos de red particulares (los mismos), pero tienen valores diferentes para Puerta de enlace e Interfaz. Para un ejemplo,
Cualquier conexión
===========================================================================
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
Conexión abierta
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
Aparte de la 0.0.0.0
ruta, todas estas rutas se agregan conectándose a la VPN. Para 0.0.0.0
, OpenConnect cambia la métrica de la ruta 0.0.0.0
a 36 (los valores que se muestran en la tabla AnyConnect también son los mismos que cuando estoy completamente desconectado). (Para que conste, AnyConnect también elimina varias rutas IPv6, que OpenConnect deja en paz. ¿No creo que esto importe?)
Para contrastar explícitamente las adiciones, AnyConnect usa "On-link" para la puerta de enlace, mientras que OpenConnect usa una dirección IP que es casi la misma que usa AnyConnect para la interfaz. Para Interface, OpenConnect utiliza una dirección IP privada. Las direcciones IP utilizadas para la interfaz de AnyConnect y la puerta de enlace de OpenConnect están en un rango que pertenece al cliente.
Las métricas también son diferentes: AnyConnect usa 2, que tiene mayor prioridad que mi 0.0.0.0
ruta (establecida en 35 cuando estoy desconectado o conectado a través de AnyConnect), mientras que OpenConnect usa 36, y también cambia mi 0.0.0.0
ruta para usar 36, por lo que la prioridad es la misma ( todas las demás rutas en mi sistema usan una métrica superior a 36, para que conste).
AnyConnect también agrega una ruta para 192.168.1.1
, a 192.168.1.151
, que es lo que OpenConnect usa para la interfaz. Esta es la única ruta que uno tiene y al otro le falta.
Ambos también agregan rutas para 224.0.0.0
y 255.255.255.255
, pero AnyConnect usa una métrica de 10000 (más alta que cualquier otra ruta), mientras que OpenConnect usa 291 (más alta que cualquier otra adición pero más baja que otras rutas existentes que tenía antes de conectarme). Curiosamente, OpenConnect utiliza la misma puerta de enlace e interfaz que AnyConnect para esas dos rutas, a pesar de utilizar valores diferentes para todas las demás rutas.
Esto está en una máquina con Windows 10 Pro x64. Cisco AnyConnect es la versión 4.5.03040; La GUI de OpenConnect es “Versión1.5.3(32 bits) [...] Basado en OpenConnect v7.08.”
Realmente no sé mucho sobre enrutamiento o VPN; Incluso conseguir tanta información requirió mucha búsqueda y lectura. Ni siquiera conocía el término "túnel dividido" antes de empezar con esto. Mucha de la información que existe también está desactualizada: Windows 10 no ofrece la opción "Usar puerta de enlace predeterminada en una red remota" para desmarcarla, como recomiendan muchas otras respuestas aquí y en otros lugares para el túnel dividido en AnyConnect. No sé si hay otros detalles pertinentes que pueda proporcionar, pero ciertamente estaré encantado de hacerlo si se necesita algo más. Obviamente, he estado tratando de enmascarar las direcciones IP de mi cliente, pero no creo que la dirección específica deba importar mucho aquí (no sé si hay alguna razón para enmascararlas tampoco, pero no es mi información para compartir, así que No soy).
Respuesta1
Basándome en la respuesta de KRyan, modifiqué mi script openconnect (vpnc-script.js en la carpeta openconnect gui!) de esta manera y me ayudó en una situación similar:
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"));
}
(línea 175)
El error en mi opinión está aquí:
// 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(".");
Con una máscara de red de 255.255.255.255 para mi IP interna pasada por var netmask_array = env("INTERNAL_IP4_NETMASK").split(".");
, este truco de puerta de enlace (en última instancia, una ruta va a una interfaz, la IP de puerta de enlace no tiene sentido aquí) parece fallar
Respuesta2
Tenía razón en que las rutas eran el problema. Fue necesario mucho ensayo y error para hacerlo bien, pero finalmente actualizar las rutas manualmente después de conectarse funcionó.
Curiosamente, route CHANGE
no funcionó; Tuve que usar route ADD
, aunque hasta donde sé, estas rutas ya existían después de que me conecté. Utilicé el mismo destino, máscara y puerta de enlace, y luego METRIC 2 IF 17
(dado que la interfaz “TAP-Adaptador de Windows V9” estaba usando 17, ¿sospecho que cambiará con cada reinicio? Desconectar y volver a conectar parece usar 17 de manera constante por ahora, pero como usted Puede ver en la pregunta que estaba usando 63 entonces). Después de hacer esto, aparecieron dos entradas route PRINT
para ese destino (la agregada por OpenConnect y la que agregué yo), y me permitió conectarme.
Sin embargo, lo que considero absolutamente extraño es que mi ruta recién agregada tiene una métrica de 37, no la 2 que puse en el route ADD
comando, y mayor que la 36 que tenía la entrada existente. Pero da igual, funciona.
Afortunadamente, nuestro proyecto mantiene un hosts
archivo (para que los desarrolladores lo copien en su propio hosts
archivo cuando comiencen a trabajar en él, y que nuestras herramientas de compilación cotejen), así que pude escribir un script por lotes para ajustar las rutas. Por el bien de cualquiera que quiera hacer esto, mi secuencia de comandos por lotes se ve así
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
)
El hosts
formato del archivo es el mismo que el del archivo del sistema: a.b.c.d URL
. Este script no admite comentarios (aunque imagino que route ADD
simplemente fallará) y no sé si las líneas en blanco serán un problema o no (pero nuevamente, probablemente solo sea un error route ADD
).
Probablemente tendré que ajustarlo para ese 17 ya que sospecho que no será constante; cuando surja eso, buscaré cómo determinar qué es y usaré una variable para ello. (Y también actualizaré esta respuesta).
Respuesta3
No es que aún no hayas descubierto algo que funcione, pero parece que no entiendes cómo se utilizan las métricas de ruta.En realidad son sólo un desempate en una circunstancia muy específica.. Citando la respuesta vinculada:
La selección de ruta en windows, implica:
- Encontrar las rutas más específicas al destino
- Seleccionando la ruta más específica con la métrica más baja.
Y si quieres que tu guión sea menos frágil, puedesdeterminar mediante programación el número de interfaz.