Wie führe ich ein Skript aus, nachdem sich OpenVPN erfolgreich verbunden hat?

50

Wie kann ich ein Skript mit OpenVPN verknüpfen, damit es ausgeführt wird, wenn die VPN-Verbindung erfolgreich hergestellt wurde?

Oxwivi
quelle
Im Falle des Kunden denke ich? Welche Software verwenden Sie? OpenVPN oder ein Wrapper (zB NetworkManager)?
Lekensteyn
@Lekensteyn, Wrapper network-manger-openvpn.
Oxwivi

Antworten:

62

network-manager-openvpnStellt diese Funktionalität nicht zur Verfügung, müssen Sie diese openvpndirekt nutzen .

Übergeben Sie --script-security 2 --up /path/to/your/scriptes beim Anschließen. Wenn Sie eine Konfigurationsdatei unter verwenden /etc/openvpn/, hängen Sie die nächsten Zeilen an Ihre Konfigurationsdatei an:

script-security 2
# run /etc/openvpn/up.sh when the connection is set up
up /etc/openvpn/up.sh

Aus der OpenVPN-Manpage :

--script-Sicherheitsstufe [Methode]
              Diese Direktive bietet Kontrolle auf Richtlinienebene über die Nutzung von OpenVPN
              von externen Programmen und Skripten. Niedrigere Werte sind mehr
              restriktiv, höhere Werte sind eher tolerant. Einstellungen für
              Niveau:

              0 - Streng kein Aufruf externer Programme.
              1 - (Standard) Ruft nur integrierte ausführbare Dateien wie ifconfig,
              ip, route oder netsh.
              2 - Aufrufen von integrierten und benutzerdefinierten ausführbaren Dateien zulassen
              Skripte.
              3 - Zulassen, dass Passwörter über die Umgebung an Skripte übergeben werden
              Variablen (möglicherweise unsicher).
       --up cmd
              Shell-Befehl, der ausgeführt wird, nachdem das TUN / TAP-Gerät erfolgreich geöffnet wurde (Pre
              --UID-Änderung des Benutzers). Das up-Skript ist nützlich zum Angeben
              Routing-Befehle, die IP-Verkehr für private Zwecke weiterleiten
              Subnetze, die am anderen Ende der VPN-Verbindung in existieren
              Der Tunnel.
Skript-Ausführungsreihenfolge
       --up Wird ausgeführt, nachdem das TCP / UDP-Socket gebunden und TUN / TAP geöffnet wurde.
       --down Wird ausgeführt, nachdem TCP / UDP und TUN / TAP geschlossen wurden.

Es gibt weitere Ereignisse für die Skriptausführung, die auf der Manpage zu finden sind .

Erstellen /etc/openvpn/up.shund erteilen Sie ihm Ausführungsberechtigungen (z. B. 755 oder 700). Beispielinhalt zum Hinzufügen einer IPv6-Adresse und einer IPv6-Route (zu Bildungszwecken angezeigt, nicht direkt kopieren):

#!/bin/sh
# add an IPv6 address to device $dev (environment variable)
ip -6 addr add 2001:db8::1:2/112 dev $dev
# and the IPv6 route for this net using gateway 2001:db8::1
ip -6 route add 2001:db8::1:0/112 via 2001:db8::1 dev $dev

Beachten Sie, dass dieses upSkript als root ausgeführt wird. Wenn Sie keine Userund Group-Einstellung angegeben haben, führt OpenVPN auch Skripte wie downroot aus.

Lekensteyn
quelle
Wenn Sie nicht wissen, wie Sie openvpn direkt verwenden können, geben Sie Ihre aktuellen Konfigurationsdetails an: Verbindungstyp (z. B. X509-Zertifikate), Gateway-Port, LZO-Komprimierung, TCP-Force, Verwendung von Tap-Device, Chiffre, HMAC und TLS. Erwähnen Sie auch Ihre IP-Einstellungen, wenn diese nicht automatisch sind. Lassen Sie für Ihre Privatsphäre Ihre tatsächlichen Adressen weg.
Lekensteyn
Okay, gut, ich habe mich entschieden, OpenVPN direkt zu verwenden (und ja, ich habe die .conf-Datei), aber wird die Verbindung automatisch wiederhergestellt, wenn die Verbindung unterbrochen wird? Und wie stelle ich eine automatische Verbindung her, wenn eine Internetverbindung besteht? Und schließlich habe ich nicht verstanden, wo ich die Zeilen hinzufügen muss, die Sie in der Antwort erwähnt haben.
Oxwivi
Ich habe die Antwort erweitert, um sie openvpndirekt zu verwenden . Beim Einrichten eines Servers ist mir aufgefallen, dass OpenVPN versucht, die Verbindung wiederherzustellen, wenn der Server ausfällt. Nicht sicher, ob OpenVPN weiterhin versucht, wenn Ihre Netzwerkschnittstelle ausfällt.
Lekensteyn
Mein Problem ist nicht, wenn die Netzwerkschnittstelle ausfällt - es wird versucht, die Verbindung wiederherzustellen, wenn die Internetverbindung unterbrochen und wieder hergestellt wird. Ich möchte nur eine Verbindung zum VPN herstellen, wenn ich eine Internetverbindung erhalte.
Oxwivi
Oh, und gilt das Skript für alle VPN-Verbindungen? Und bitte markieren Sie @Oxwivi, wenn Sie antworten, ich werde sonst nicht benachrichtigt.
Oxwivi
5

Auf die Frage: "Wie kann ich OpenVPN ein Skript zuordnen, damit es ausgeführt wird, wenn die VPN-Verbindung erfolgreich hergestellt wurde?" Ich möchte darauf hinweisen, dass Lekensteyn eine hervorragende Antwort geliefert hat . Zu dem Zeitpunkt, als seine Antwort verfasst wurde, fehlte es jedoch an Klarheit darüber, wie openvpn-Befehlszeilenargumente bereitgestellt werden sollten, um openvpn auf einem Ubuntu-Computer zu starten, insbesondere, damit es nach einem Neustart genauso funktioniert.


Openvpn-Befehlszeilenargumente unter Ubuntu:

Natürlich kann man openvpn von einer Kommandozeile aus mit allen verfügbaren legalen Optionen starten. Wenn man aber auf einem Ubuntu-Rechner openvpn nach einem Neustart mit denselben Befehlszeilenargumenten starten möchte, sollte man in Betracht ziehen, die Datei zu bearbeiten /etc/default/openvpn. Untersuchen Sie folgende Zeilen:

# Optional arguments to openvpn's command line
OPTARGS="" 

Von der Community OpenVPN Manpage auf--script-security

--script-Sicherheitsstufe
    Diese Direktive bietet eine Kontrolle auf Richtlinienebene über die Verwendung von external durch OpenVPN 
    Programme und Skripte. Niedrigere Werte sind restriktiver und höher
    Werte sind freizügiger. Einstellungen für Level:
0 - Streng kein Aufruf externer Programme. 
1 - (Standard) Ruft nur integrierte ausführbare Dateien wie ifconfig, ip, route,
oder netsh. 
2 - Aufrufen von integrierten ausführbaren Dateien und benutzerdefinierten Skripten zulassen. 
3 - Zulassen, dass Kennwörter über Umgebungsvariablen an Skripts übergeben werden
(möglicherweise unsicher).

OpenVPN-Releases vor v2.3 unterstützten auch ein Methodenflag, das angibt, wie 
OpenVPN sollte externe Befehle und Skripte aufrufen. Dies kann entweder ausgeführt werden
oder System. Ab OpenVPN v2.3 wird dieses Flag nicht mehr akzeptiert. In den meisten * nix
Umgebungen, in denen der Ansatz execve () ohne Probleme verwendet wurde.

Einige Anweisungen wie --up ermöglichen die Übergabe von Optionen an das externe Skript.
Stellen Sie in diesen Fällen sicher, dass der Skriptname keine Leerzeichen oder das Zeichen enthält 
Der Konfigurationsparser wird ersticken, da nicht festgestellt werden kann, wo sich das Skript befindet 
Der Name endet und die Skriptoptionen beginnen.

Kombiniert mit einem abgekürzten Abschnitt auf --up

--up cmd
    Führen Sie den Befehl cmd aus, nachdem das TUN / TAP-Gerät erfolgreich geöffnet wurde (UID-Änderung vor dem Benutzer).
    cmd besteht aus einem Pfad zum Skript (oder ausführbaren Programm), dem optional gefolgt wird
    durch Argumente. Der Pfad und die Argumente können in einfache oder doppelte Anführungszeichen gesetzt werden und / oder
    Escapezeichen mit einem Backslash und sollte durch ein oder mehrere Leerzeichen getrennt werden.

Beispiel:

Auf meinem Computer mit einer openpvn-server.conf habe ich die folgenden Zeilen in meiner /etc/default/openvpnDatei:

OPTARGS="
    --script-security 2
    --up /etc/openvpn/nat.sh
" 

Im Übrigen richtet die Datei nat.sh die Netzwerkadressübersetzung ein, um den privaten Netzwerkverkehr von OpenVPN-Clients an das öffentliche Internet weiterzuleiten. Das ist gut, wenn man einem öffentlichen WIFI-Zugangspunkt nicht vertraut.


Abgesehen davon, dass ein Neustart nach einem Neustart wie erwartet zulässig ist /etc/openvpn/[client or server].confund die /etc/default/openvpnDateien ordnungsgemäß konfiguriert wurden, kann openvpn mit den folgenden Schritten gestartet oder gestoppt werden:

sudo service openvpn start
sudo service openvpn stop

Weitere nützliche Optionen für service openvpninclude cond-restart,force-reload,reload, restart,soft-restart, start, status, stop.

Keith Reynolds
quelle
3

Da dies ein ziemlich alter Thread ist, bin ich mir nicht sicher, ob er noch von Interesse ist. Wenn Sie den NetworkManager weiterhin zum Herstellen einer Verbindung mit einem VPN verwenden möchten, können Sie eine einfache udev-Regel wie die folgende hinzufügen:

KERNEL=="vpn0", RUN+="/PATH_TO_THE_SCRIPT/SCRIPT_NAME"

Dies sollte jedes Skript ausführen, nachdem das VPN erstellt wurde.

Thomas
quelle
1

Ich bin auf die Antwort bei meinen Nachforschungen gestoßen, um dieses Problem zu lösen, und habe herausgefunden, dass die beste Lösung (unter Verwendung von OpenVPN-Server) wie folgt ist:

Erstellen Sie ein Skript, das ausgeführt werden soll:

# nano /etc/openvpn/up.sh
<file:contents>
#!/bin/sh

# export >> /var/log/openvpn/openvpn-up.log
D=`date "+%Y-%m-%d %H:%M"`
echo "[$D] ($local_port_1:$proto_1) $X509_0_CN: $trusted_ip => $ifconfig_pool_remote_ip" >> /var/log/openvpn/openvpn-up.log
</file>

Fügen Sie der openvpn-Konfiguration (normalerweise /etc/openvpn/server.conf) die folgenden Zeilen hinzu . In der obigen Antwort wurde "up" und "down" verwendet, die beim Starten des Servers verwendet werden (Neustart). Die Direktive client-connect (und client-disconnect) wird verwendet, wenn der Client eine Verbindung herstellt (trennt).

# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
CozC
quelle
Wie würden Sie den Client-Konfigurationsnamen in die Protokolldatei aufnehmen?
Kallisto