OpenConnect kann VPN-only-Ziele nicht erreichen

OpenConnect kann VPN-only-Ziele nicht erreichen

Um eine Verbindung zum Unternehmensnetzwerk meines Kunden herzustellen, verwende ich den Cisco AnyConnect Secure Mobility Client. Dieser funktioniert einwandfrei, erlaubt mir aber anscheinend nicht, Split Tunneling zu verwenden (obwohl das VPN selbst laut der Registerkarte „Statistik“ der App über den Tunnelmodus (IPv4): Split Include verfügt, was meines Wissens nach bedeuten sollte, dass ich dies tun kann). (Ja, ich verstehe, warum Split Tunneling gefährlich sein kann, aber die Sperrung des VPN stört meine Arbeit und die IT-Abteilung meines Kunden ist nicht daran interessiert, Ausnahmen für einen Auftragnehmer zu machen – und wie ich bereits sagte, die Konfigurationscheinterlaube es.)

Ich habe versucht, Split Tunneling zum Laufen zu bringen. Stattdessen habe ich OpenConnect installiert und die Verbindung funktioniert einwandfrei. Meine Anmeldeinformationen werden akzeptiert, ich sehe die „Banner“-Meldung des Unternehmens im Protokoll und es funktioniert. Aber keines der Ziele, auf die ich nur über das VPN zugreifen kann, funktioniert.

Ich vermute, das Problem liegt bei den Routen. Sowohl AnyConnect als auch OpenConnect fügen eine Reihe von Routen zu bestimmten Netzwerkzielen (denselben) hinzu, haben aber unterschiedliche Werte für Gateway und Schnittstelle. Ein Beispiel:

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

Abgesehen von der 0.0.0.0Route werden alle diese Routen durch die Verbindung zum VPN hinzugefügt. Für 0.0.0.0ändert OpenConnect die Metrik für die Route 0.0.0.0auf 36 (die in der AnyConnect-Tabelle angezeigten Werte sind auch dieselben wie bei vollständiger Trennung). (Nur zur Info: AnyConnect entfernt auch mehrere IPv6-Routen, die OpenConnect unverändert lässt – ich glaube nicht, dass das wichtig ist?)

Um die Ergänzungen explizit gegenüberzustellen: AnyConnect verwendet „On-Link“ für das Gateway, während OpenConnect eine IP-Adresse verwendet, die fast dieselbe ist wie die, die AnyConnect für die Schnittstelle verwendet. Für die Schnittstelle verwendet OpenConnect eine private IP-Adresse. Die für die Schnittstelle von AnyConnect und das Gateway von OpenConnect verwendeten IP-Adressen liegen in einem Bereich, der dem Client gehört.

Auch die Metriken sind unterschiedlich: AnyConnect verwendet 2, was eine höhere Priorität als meine 0.0.0.0Route hat (auf 35 eingestellt, wenn die Verbindung getrennt oder über AnyConnect verbunden ist), während OpenConnect 36 verwendet. Außerdem ändert es meine 0.0.0.0Route so, dass sie 36 verwendet, sodass die Priorität dieselbe ist (alle anderen Routen auf meinem System verwenden nebenbei bemerkt eine Metrik höher als 36).

AnyConnect fügt außerdem eine Route für 192.168.1.1, zu hinzu 192.168.1.151, die OpenConnect für die Schnittstelle verwendet. Dies ist die einzige Route, die einer hat und die dem anderen fehlt.

Beide fügen auch Routen für 224.0.0.0und 255.255.255.255hinzu, aber AnyConnect verwendet eine Metrik von 10000 (höher als jede andere Route), während OpenConnect 291 verwendet (höher als jede andere Ergänzung, aber niedriger als einige andere vorhandene Routen, die ich vor der Verbindung hatte). Interessanterweise verwendet OpenConnect für diese beiden Routen dasselbe Gateway und dieselbe Schnittstelle wie AnyConnect, obwohl für alle anderen Routen unterschiedliche Werte verwendet werden.

Dies ist auf einem Windows 10 Pro x64-Rechner. Cisco AnyConnect ist Version 4.5.03040; OpenConnect GUI ist „Version1.5.3(32 Bit) [...] Basierend auf OpenConnect v7.08.“

Ich weiß nicht wirklich viel über Routing oder VPNs; selbst um an diese Informationen zu kommen, musste ich viel suchen und lesen. Ich kannte nicht einmal den Begriff „Split Tunneling“, bevor ich damit angefangen habe. Viele der verfügbaren Informationen sind auch veraltet – Windows 10 bietet keine Option zum Deaktivieren von „Standardgateway im Remotenetzwerk verwenden“, wie es in vielen anderen Antworten hier und anderswo für Split Tunneling unter AnyConnect empfohlen wird. Ich weiß nicht, ob ich noch andere relevante Details liefern kann, aber ich bin gerne bereit, dies zu tun, wenn etwas anderes benötigt wird. Natürlich habe ich versucht, die IP-Adressen meiner Clients zu maskieren, aber ich denke nicht, dass die spezifische Adresse hier eine große Rolle spielen sollte (ich weiß auch nicht, ob es einen Grund gibt, sie zu maskieren, aber es sind nicht meine Informationen, die ich weitergeben kann, also gebe ich sie nicht weiter).

Antwort1

Basierend auf KRyans Antwort habe ich mein Openconnect-Skript (vpnc-script.js im Openconnect-GUI-Ordner!) wie folgt geändert und es hat mir in einer ähnlichen Situation geholfen:

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"));
    } 

(Zeile 175)

Der Fehler liegt meiner Meinung nach hier:

// 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(".");

Mit einer Netzmaske von 255.255.255.255 für meine interne IP, die von übergeben wird var netmask_array = env("INTERNAL_IP4_NETMASK").split(".");, scheint dieser Gateway-Trick (letztendlich geht eine Route zu einer Schnittstelle, die Gateway-IP ist hier sinnlos) zu scheitern

Antwort2

Ich hatte recht, dass die Routen das Problem waren. Es hat viel Ausprobieren gekostet, bis es richtig war, aber schließlich hat das manuelle Aktualisieren der Routen nach der Verbindung funktioniert.

Seltsamerweise route CHANGEhat das nicht funktioniert. Ich musste verwenden route ADD, obwohl diese Routen meines Wissens nach bereits existierten, nachdem ich die Verbindung hergestellt hatte. Ich habe dasselbe Ziel, dieselbe Maske und dasselbe Gateway verwendet und dann METRIC 2 IF 17(da die Schnittstelle „TAP-Windows-Adapter V9“ 17 verwendete – ich vermute, das ändert sich bei jedem Neustart?) scheint beim Trennen und Wiederherstellen der Verbindung derzeit durchgängig 17 zu verwenden, aber wie Sie der Frage entnehmen können, wurde damals 63 verwendet. Nachdem ich dies getan hatte, waren route PRINTfür dieses Ziel zwei Einträge in aufgeführt (der von OpenConnect hinzugefügte und der von mir hinzugefügte) und ich konnte eine Verbindung herstellen.

Was ich allerdings absolut bizarr finde, ist, dass meine neu hinzugefügte Route eine Metrik von 37 hat – nicht die 2, die ich in den route ADDBefehl eingegeben habe, und größer als die 36, die der vorhandene Eintrag hatte. Aber egal, es funktioniert.

Glücklicherweise verwaltet unser Projekt eine hostsDatei (die Entwickler in ihre eigene Datei kopieren können, hostswenn sie mit der Arbeit beginnen, und die unsere Build-Tools überprüfen), sodass ich ein Batch-Skript schreiben konnte, um die Routen anzupassen. Für alle anderen, die dies auch tun möchten, sieht mein Batch-Skript so aus:

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
)

Das hostsDateiformat ist das gleiche wie das der Systemdatei: a.b.c.d URL. Dieses Skript unterstützt keine Kommentare (obwohl ich mir vorstellen kann, dass das route ADDeinfach fehlschlagen wird) und ich weiß nicht, ob leere Zeilen ein Problem darstellen oder nicht (aber wiederum ist es wahrscheinlich nur ein fehlgeschlagener route ADD).

Ich werde es wahrscheinlich für diese 17 anpassen müssen, da ich vermute, dass das nicht konstant sein wird; wenn das passiert, werde ich untersuchen, wie man es bestimmt, und stattdessen eine Variable dafür verwenden. (Und ich werde diese Antwort auch aktualisieren.)

Antwort3

Nicht, dass Sie nicht bereits etwas herausgefunden hätten, das funktioniert, aber Sie scheinen die Verwendung der Routenmetriken falsch zu verstehen.Sie sind eigentlich nur in ganz bestimmten Situationen ein Entscheidungskriterium.. Zitat aus der verlinkten Antwort:

Die Routenauswahl unter Windows umfasst:

  • Finden der genauesten Routen zum Ziel
  • Auswahl der spezifischsten Route mit der niedrigsten Metrik.

Und wenn Sie Ihr Skript weniger anfällig machen möchten, können Sieprogrammgesteuerte Ermittlung der Schnittstellennummer.

verwandte Informationen