2011-05-17 14:23:58 +0000 2011-05-17 14:23:58 +0000
85
85

Wie kann man den lokalen LAN-Zugriff erlauben, während man mit Cisco VPN verbunden ist?

Wie kann ich den lokalen LAN-Zugriff aufrechterhalten, während ich mit Cisco VPN verbunden bin?

Bei einer Verbindung über Cisco VPN hat der Server die Möglichkeit, den Client anzuweisen, den lokalen LAN-Zugriff zu verhindern.

Angenommen, diese serverseitige Option kann nicht ausgeschaltet werden, wie kann man den lokalen LAN-Zugriff zulassen, während man mit einem Cisco VPN-Client verbunden ist?


Ich dachte immer, es handele sich einfach um hinzugefügte Routen, die LAN-Verkehr mit einer höheren Metrik erfassen, zum Beispiel:

Network 
Destination Netmask Gateway Interface Metric
   10.0.0.0 255.255.0.0 10.0.0.3 10.0.0.3 20 <--Local LAN
   10.0.0.0 255.255.0.0 192.168.199.1 192.168.199.12 1 <--VPN Link

Und der Versuch, die Route 10.0.x.x -> 192.168.199.12 zu löschen, hat keinen Effekt:

>route delete 10.0.0.0
>route delete 10.0.0.0 mask 255.255.0.0
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1 if 192.168.199.12
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1 if 0x3

Und obwohl es vielleicht einfach ein Routing-Problem ist, schlagen Versuche, Routen hinzuzufügen oder zu löschen, fehl.

Auf welcher Ebene macht der Cisco VPN-Client-Treiber was im Netzwerkstapel, das die Fähigkeit eines lokalen Administrators, seinen Rechner zu verwalten, außer Kraft setzt?

Der Cisco VPN-Client kann keine Magie anwenden. Es ist immer noch Software, die auf meinem Computer läuft. Welchen Mechanismus verwendet er, um in das Netzwerk meines Rechners einzugreifen? Was passiert, wenn ein IP/ICMP-Paket im Netzwerk ankommt? Wo im Netzwerkstapel wird das Paket gefressen?

Siehe auch


Edit: Dinge, die ich noch nicht ausprobiert habe:

>route delete 10.0.*

Bearbeitung: Da Cisco seinen alten Client zugunsten von AnyConnect (HTTP SSL basiertes VPN) aufgegeben hat, kann diese Frage, ungelöst, als Relikt der Geschichte belassen werden.

In Zukunft können wir versuchen, das gleiche Problem mit ihrem neuen Client zu lösen .

Antworten (10)

56
56
56
2013-02-05 00:07:44 +0000

Das Problem mit Anyconnect ist, dass es zuerst die Routing-Tabelle modifiziert und dann auf sie aufpasst und sie korrigiert, wenn Sie sie manuell ändern. Ich habe einen Workaround für dieses Problem gefunden. Funktioniert mit den Versionen 3.1.00495, 3.1.05152, 3.1.05170 und wahrscheinlich mit allen anderen Versionen der 3.1 Familie. Kann mit anderen Versionen funktionieren, zumindest sollte eine ähnliche Idee funktionieren, vorausgesetzt, der Code wird nicht umgeschrieben. Zum Glück für uns hat Cisco den Aufruf des Babysitters “Baby ist wach” in eine gemeinsam genutzte Bibliothek gelegt. Die Idee ist also, dass wir die Aktion von vpnagentd über LD_PRELOAD verhindern.

  1. Zuerst erstellen wir eine Datei hack.c:

Hinweis: Dieser Code funktioniert nur unter Linux. Um diese Lösung auf einem macOS-Rechner anzuwenden, siehe die an macOS angepasste Version .

  1. Dann kompilieren wir sie wie folgt:

  2. Installieren Sie libhack.so in den Cisco-Bibliothekspfad:

  3. Bringen Sie den Agenten herunter:

  4. Stellen Sie sicher, dass er wirklich heruntergefahren ist:

  5. Korrigieren Sie dann /etc/init.d/vpnagentd, indem Sie LD_PRELOAD=/opt/cisco/anyconnect/lib/libhack.so an der Stelle hinzufügen, an der vpnagentd aufgerufen wird, so dass es wie folgt aussieht:

  6. Starten Sie nun den Agenten:

  7. Reparieren Sie die iptables, da AnyConnect sie durcheinander bringt:

  8. Richten Sie nun die Routen nach Belieben ein, zum Beispiel:

  9. Prüfen Sie, ob sie wirklich da sind:

Eine frühere, einfachere Version dieses Hacks gab eine Funktion, die nur “return 0;” machte - das Poster bemerkte: “Der einzige Nebeneffekt, den ich bisher beobachtet habe, ist, dass vpnagentd 100% der CPU benutzt, wie von top berichtet, aber die Gesamt-CPU ist nur 3% Benutzer und 20% System, und das System ist perfekt ansprechbar. Ich habe es gestreamt, es scheint zwei Selects in einer Schleife zu machen, wenn es im Leerlauf ist und von beiden schnell zurückkehrt, aber es liest oder schreibt nie - ich nehme an, der Aufruf, den ich mit LD_PRELOAD ausgeschnitten habe, sollte lesen. Vielleicht gibt es einen saubereren Weg, es zu tun, aber es ist gut genug für mich so weit. Wenn jemand eine bessere Lösung hat, bitte teilen.”

Das Problem mit dem trivialen Hack ist, dass er dazu führt, dass ein einzelner CPU-Kern die ganze Zeit zu 100% ausgelastet ist, wodurch die Anzahl der Hardware-CPU-Threads effektiv um einen reduziert wird - unabhängig davon, ob die vpn-Verbindung aktiv war oder nicht. Ich habe bemerkt, dass die Selects, die der Code durchführte, auf einem Netlink-Socket lagen, der vpnagentd Daten sendet, wenn sich die Routing-Tabelle ändert. vpnagentd bemerkt immer wieder, dass es eine neue Nachricht auf dem Netlink-Socket gibt und ruft den routeCallBackHandler auf, um damit umzugehen, aber da der triviale Hack die neue Nachricht nicht löscht, wird er immer wieder aufgerufen. der neue Code, der oben bereitgestellt wurde, löscht die Netlink-Daten, so dass die Endlosschleife, die die 100% CPU verursacht, nicht passiert.

Wenn etwas nicht funktioniert, machen Sie gdb -p $(pidof vpnagentd), einmal angehängt:

b socket
c
bt

und sehen Sie, in welchem Aufruf Sie sich befinden. Dann raten Sie einfach, welchen Sie herausschneiden wollen, fügen ihn in hack.c ein und kompilieren neu.

11
11
11
2011-12-24 14:43:04 +0000

Das ist sehr umständlich, aber wenn Sie eine minimale VM mit VMWare Player oder ähnlichem erstellen und den Cisco AnyConnect VPN-Client darin laufen lassen, könnte es möglich sein, das Routing wie gewünscht mit den virtuellen Netzwerkadaptern von VMWare einzurichten oder einfach die VM für den Zugriff auf die benötigten Ressourcen über das Cisco SSL-VPN zu verwenden und Dateien per “Drag/Drop” auf/von Ihrer tatsächlichen Maschine zu übertragen.

7
7
7
2013-03-05 13:17:21 +0000

(http://www.shrew.net “Free as of March 2013”) Die Software Soft VPN hat bei mir auch funktioniert, wie Ian Boyd vorgeschlagen hat.

Sie kann Cisco VPN Client-Profile importieren. Ich habe Cisco VPN Client Version 5.0.05.0290 verwendet, und nach der Installation von Shrew VPN (Version 2.1.7) und dem Importieren des Cisco-Profils konnte ich auf das lokale LAN zugreifen, während ich mit dem Firmen-VPN verbunden war, ohne zusätzliche Konfiguration der Shrew VPN-Verbindung (oder Software).

5
5
5
2015-01-28 18:51:15 +0000

Dank an Sasha Pachev für den netten Hack oben.

vpnagentd bringt auch den Resolver durcheinander, indem es die an /etc/resolv.conf vorgenommenen Änderungen überschreibt. Ich habe das Problem gelöst, indem ich schließlich das Rennen gegen ihn gewonnen habe:

#!/bin/bash

dnsfix() {
    [-f /etc/resolv.conf.vpnbackup] || echo "Not connected?" >&2 || return 0 # do nothing in case of failure
    while ! diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup #>/dev/null
    do
         cat /etc/resolv.conf.vpnbackup >/etc/resolv.conf
    done
    chattr +i /etc/resolv.conf
    diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup >/dev/null 
}

while ! dnsfix
do
    echo "Retrying..."
    chattr -i /etc/resolv.conf
done

Vergessen Sie beim Trennen der Verbindung nicht chattr -i /etc/resolv.conf.

Ich versuche, es zu lösen, indem ich den Callback abfange, wie bei der Routen-Methode oben, kann aber den entsprechenden Callback oder die Methode noch nicht finden.

Update1/2: Ein strace ergab, dass vpnagentd die inotify-API verwendet, um die Änderungen der Resolver-Datei zu überwachen. Von da an ging es nur noch bergab. Hier ist der zusätzliche Hack:

int _ZN18CFileSystemWatcher11AddNewWatchESsj(void *string, unsigned int integer)
{
  return 0;
}

Das ist zugegebenermaßen ein wenig übertrieben, da es alle Dateiüberwachungen für den Agenten deaktiviert. Aber es scheint gut zu funktionieren.

Das unten stehende Wrapper-Skript für den vpn-Client integriert die gesamte Funktionalität (aktualisiert, um diesen zusätzlichen Hack zu berücksichtigen). chattr wird nicht mehr verwendet/benötigt.

Update 3: Die Einstellungen für Benutzernamen/Passwort im Skript wurden korrigiert. Es verwendet jetzt eine vpn.conf-Datei mit dem unten beschriebenen Format (und nur Root-Rechten).

#!/bin/bash

# Change this as needed
CONF="/etc/vpnc/vpn.conf"
# vpn.conf format
#gateway <IP>
#username <username>
#password <password>
#delete_routes <"route spec"...> eg. "default gw 0.0.0.0 dev cscotun0"
#add_routes <"route spec"...> eg. "-net 192.168.10.0 netmask 255.255.255.0 dev cscotun0" "-host 10.10.10.1 dev cscotun0"

ANYCONNECT="/opt/cisco/anyconnect"

usage() {
    echo "Usage: $0 {connect|disconnect|state|stats|hack}"
    exit 1
}

CMD="$1"
[-z "$CMD"] && usage

ID=`id -u`

VPNC="$ANYCONNECT/bin/vpn"

dnsfix() {
    [-f /etc/resolv.conf.vpnbackup] || echo "Not connected?" >&2 || return 0 # do nothing in case of failure
    while ! diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup >/dev/null
    do
         cat /etc/resolv.conf.vpnbackup >/etc/resolv.conf
    done
# chattr +i /etc/resolv.conf
    diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup >/dev/null 
}

case "$CMD" in
    "connect")
        [$ID -ne 0] && echo "Needs root." && exit 1
        HOST=`grep ^gateway $CONF | awk '{print $2}'`
        USER=`grep ^user $CONF | awk '{print $2}'`
        PASS=`grep ^password $CONF | awk '{print $2}'`
        OLDIFS=$IFS
        IFS='"'
        DEL_ROUTES=(`sed -n '/^delete_routes/{s/delete_routes[\t\"]*//;s/\"[\t]*\"/\"/g;p}' $CONF`)
        ADD_ROUTES=(`sed -n '/^add_routes/{s/add_routes[\t\"]*//;s/\"[\t]*\"/\"/g;p}' $CONF`)
        IFS=$OLDIFS

        /usr/bin/expect <<EOF
set vpn_client "$VPNC";
set ip "$HOST";
set user "$USER";
set pass "$PASS";
set timeout 5
spawn \$vpn_client connect \$ip
match_max 100000
expect { 
    timeout {
        puts "timeout error\n"
        spawn killall \$vpn_client
        exit 1
    }
    ">> The VPN client is not connected." { exit 0};
    ">> state: Disconnecting" { exit 0};
    "Connect Anyway?"
}
sleep .1
send -- "y\r"
expect { 
    timeout {
        puts "timeout error\n"
        spawn killall \$vpn_client
        exit 1
    }
    "Username:"
}
sleep .1
send -- "\$user\r"
expect { 
    timeout {
        puts "timeout error\n"
        spawn killall \$vpn_client
        exit 1
    }
    "Password: "
}
send -- "\$pass\r";
expect eof
EOF
        sleep 2
        # iptables
        iptables-save | grep -v DROP | iptables-restore

        # routes
        for ROUTE in "${DEL_ROUTES[@]}"
        do
# echo route del $ROUTE
            route del $ROUTE
        done
        for ROUTE in "${ADD_ROUTES[@]}"
        do
# echo route add $ROUTE
            route add $ROUTE
        done

        # dns
        while ! dnsfix
        do
            echo "Try again..."
# chattr -i /etc/resolv.conf
        done

        echo "done."
        ;;
    "disconnect")
# [$ID -ne 0] && echo "Needs root." && exit 1
        # dns
# chattr -i /etc/resolv.conf

        $VPNC disconnect
        ;;
    "state"|"stats")
        $VPNC $CMD
        ;;
    "hack")
        [$ID -ne 0] && echo "Needs root." && exit 1
        /etc/init.d/vpnagentd stop
        sleep 1
        killall -9 vpnagentd 2>/dev/null
        cat - >/tmp/hack.c <<EOF
#include <sys/socket.h>
#include <linux/netlink.h>

int _ZN27CInterfaceRouteMonitorLinux20routeCallbackHandlerEv()
{
  int fd=50; // max fd to try
  char buf[8192];
  struct sockaddr_nl sa;
  socklen_t len = sizeof(sa);

  while (fd) {
     if (!getsockname(fd, (struct sockaddr *)&sa, &len)) {
        if (sa.nl_family == AF_NETLINK) {
           ssize_t n = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
        }
     }
     fd--;
  }
  return 0;
}

int _ZN18CFileSystemWatcher11AddNewWatchESsj(void *string, unsigned int integer)
{
  return 0;
}
EOF
        gcc -o /tmp/libhack.so -shared -fPIC /tmp/hack.c
        mv /tmp/libhack.so $ANYCONNECT
        sed -i "s+^\([\t]*\)$ANYCONNECT/bin/vpnagentd+LD_PRELOAD=$ANYCONNECT/lib/libhack.so $ANYCONNECT/bin/vpnagentd+" /etc/init.d/vpnagentd
        rm -f /tmp/hack.c
        /etc/init.d/vpnagentd start
        echo "done."
        ;;
    *)
        usage
        ;;
esac
4
4
4
2012-06-17 13:37:24 +0000

Meine Firma benutzt immer noch diesen vpn. Der vpnc-Client ändert Ihre iptables-Einstellungen einfach so:

# iptables-save # Generated by iptables-save v1.4.10 on Sun Jun 17 14:12:20 2012 \*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT DROP [0:0] -A INPUT -s 123.244.255.254/32 -d 192.168.0.14/32 -j ACCEPT -A INPUT -i tun0 -j ACCEPT -A INPUT -i lo0 -j ACCEPT -A INPUT -j DROP -A OUTPUT -s 192.168.0.14/32 -d 123.244.255.254/32 -j ACCEPT -A OUTPUT -o tun0 -j ACCEPT -A OUTPUT -o lo0 -j ACCEPT -A OUTPUT -j DROP COMMIT

Es filtert alles außer dem vpn-Verkehr.

Holen Sie sich einfach den Filter in eine Datei mit iptables-save, fügen Sie INPUT- und OUTPOUT-Zugangszeilen hinzu, die Ihren Bedürfnissen entsprechen und wenden Sie die Datei mit iptables-restore wieder an.

zum Beispiel für den Zugriff auf ein lokales Netzwerk auf 192.168.0

# Generated by iptables-save v1.4.10 on Sun Jun 17 14:12:20 2012 \*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT DROP [0:0] -A INPUT -s 123.244.255.254/32 -d 192.168.0.14/32 -j ACCEPT -A INPUT -s 192.168.0.0/24 -d 192.168.0.14/32 -j ACCEPT #local in -A INPUT -i tun0 -j ACCEPT -A INPUT -i lo0 -j ACCEPT -A INPUT -j DROP -A OUTPUT -s 192.168.0.14/32 -d 123.244.255.254/32 -j ACCEPT -A OUTPUT -s 192.168.0.14/32 -d 192.168.0.0/24 -j ACCEPT #local out -A OUTPUT -o tun0 -j ACCEPT -A OUTPUT -o lo0 -j ACCEPT -A OUTPUT -j DROP COMMIT
4
4
4
2019-02-05 01:45:11 +0000

Für diejenigen, die die Kontrolle über ihre Routing-Tabelle behalten wollen, wenn sie ein Cisco AnyConnect SSL VPN verwenden, sollten sich OpenConnect ansehen. Es unterstützt sowohl das Cisco AnyConnect SSL VPN und versucht nicht, Routing-Tabelleneinträge zu stören oder zu “sichern”. @Vadzim deutet dies in einem Kommentar oben an.

Nachdem ich alles versucht hatte, außer den AnyConnect Secure Mobility Client zu patchen, konnte ich ihn unter Windows erfolgreich durch OpenConnect GUI ersetzen. Dadurch konnte ich die Konnektivität zu lokalen Ressourcen aufrechterhalten (und die Routing-Tabelle aktualisieren).

Ich verwende OpenConnect unter Windows, aber es unterstützt auch Linux, BSD und macOS (neben anderen Plattformen) laut der Projektseite .

3
3
3
2011-07-23 19:49:44 +0000

Gibt es dazu Neuigkeiten?

Auf welcher Ebene macht der Cisco VPN-Client-Treiber was im Netzwerkstapel, das die Fähigkeit eines lokalen Administrators, seinen Rechner zu verwalten, außer Kraft setzt?

Ich stimme dem voll und ganz zu und habe mich über dasselbe gewundert.

Wie auch immer, es ist eine Anwendung, die Administratorrechte zur Installation benötigt und während sie läuft, kann sie sehr wohl filtern, was Sie tun…

Meine Versuche unter Windows schlagen auch fehl:

route change 0.0.0.0 mask 0.0.0.0 192.168.1.1 metric 1
 OK!

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.230 21 <-- LAN
          0.0.0.0 0.0.0.0 192.168.120.1 192.168.120.3 2 <-- VPN

Haha. Keine Metrik unter 20 hier, wie es scheint.

3
3
3
2014-02-28 10:12:50 +0000

Da ich keine Kommentare hinzufügen kann, werde ich hier posten. Ich arbeite unter Windows.

Die Lösung, eine virtuelle Maschine zu verwenden und AnyConnect innerhalb der VM laufen zu lassen und dann die VM als Vermittler zwischen Ihrer Arbeitsumgebung und dem Firmennetzwerk zu verwenden, wird nicht funktionieren, wenn Ihre “geliebte” IT-Abteilung 0.0.0.0 durch das VPN leitet, so dass sogar Ihr lokales Netzwerk (einschließlich der Verbindung zwischen Ihrem lokalen PC und der VM) durch das VPN(sic!) geroutet wird.

Ich habe versucht, die von @Sasha Pachev gepostete Lösung anzuwenden, aber am Ende habe ich die .dll so gepatcht, dass sie am Anfang der Funktion 0 zurückgibt. Schließlich konnte ich nach einigem Kampf mit der dynamischen Bibliothek die Routing-Tabellen nach meinen Bedürfnissen ändern, aber anscheinend ist das nicht genug!

Obwohl meine Regeln korrekt zu sein scheinen, um Split-Tunneling zu erreichen, erhalte ich immer noch General Failure.Haben Sie ein ähnliches Problem und konnten Sie es lösen?

  • Mein Gateway zum Internet ist 192.168.163.2
  • Mein Gateway zum Firmennetzwerk ist 10.64.202.1 (also das ganze 10... * Subnetz behandle ich als “Firmennetz”)

So sieht meine Routing-Tabelle jetzt aus (nach manuellen Änderungen bei eingeschaltetem VPN)

Dennoch sind die Ergebnisse von ping folgende

C:\Users\Mike>ping -n 1 10.64.10.11
Reply from 10.64.10.11: bytes=32 time=162ms TTL=127

C:\Users\Mike>ping -n 1 8.8.8.8
PING: transmit failed. General failure.

C:\Users\Mike>ping -n 1 192.168.163.2
General failure.

Nur als Referenz, unten sehen Sie, wie die Routentabelle aussieht, wenn die VPN-Verbindung getrennt ist (unverändert)

und so sieht die Tabelle aus, wenn die VPN-Verbindung hergestellt ist (unverändert) in diesem Fall, wenn ich versuche, 8.8.8.8 anzupingen, erhalte ich einfach eine Zeitüberschreitung (da die Firewall der Firma keinen Verkehr außerhalb des Intranets erlaubt)

3
3
3
2011-11-06 11:44:34 +0000

Ich weiß nicht, ob ich es richtig verstanden habe, aber ich kläre zunächst mein Verständnis:

Sie haben ein lokales LAN (z.B. sagen wir 10.0.0.0/16, und einen entfernten Cisco VPN Server (z.B. 64.0.0.0/16). Sie möchten sich über den Cisco VPN-Client mit dem VPN-Server verbinden und benötigen dennoch den LAN-Zugang. In diesem Fall wollen Sie die gesamte 10.0.x.x/16 von der VPN-Verbindung trennen). Die folgende Route muss in einem Mac-Client hinzugefügt werden:

/sbin/route add -net 10.0 -interface en1

wobei en1 die Schnittstelle ist, über die Sie mit Ihrem LAN verbunden sind. Ich weiß, dass Sie das Gleiche auch in Windows und Linux hinzufügen können.

1
1
1
2014-05-01 03:42:23 +0000

Versuchen Sie, diese Einträge mit gateway 10.64.202.13 zu entfernen, um zu sehen, ob ping 8.8.8.8 funktioniert, und fügen Sie sie dann nacheinander wieder hinzu, um festzustellen, welcher Eintrag die Probleme verursacht.

Wie haben Sie die DLL gepatcht. Ich kann nicht einmal die Routing-Tabelle ändern, weil die 0.0.0.0 mit dem VPN-Gateway immer wieder hinzugefügt werden.