In meinem Beitrag -> Fernsteuerung und Homeworking mit Ubuntu habe ich die Möglichkeit vorgestellt, auf einem entfernten PC so zu arbeiten, als säße man davor. Voraussetzung dafür ist eine VPN-Verbindung, wobei ich aufgrund der einfachen Installation und Konfiguration -> OpenSSL gewählt habe. Da es hin und wieder Probleme mit dem Gnome-Network-Manager gibt, habe ich aus Gründen der Zuverlässigkeit den Start und Stopp der VPN-Verbindung dem User überlassen, indem ich ihm die Möglichkeit gebe, Open VPN am Client mit Desktop-Icons starten und stoppen zu können.
Im Beitrag -> SSL-VPN mit OpenVPN in Ubuntu 18.04 wird der Start bereits beim Login durchgeführt, was z.B. bei einem fremden (WLAN-)Netzwerk, zu dem man in diesem Moment noch keine Verbindung aufgebaut hat, ein Problem darstellt. Für diese Lösung benötigt man zwei Skripte und zwei Desktop-Icons. OpenVPN muss natürlich installiert sein und die Konfigurationsdatei von der Firewall heruntergeladen worden sein.
Die Konfigurationsdatei testuser@utm9-fw.ovpn speichere ich im home-Verzeichnis des Users unter /home/testuser/.vpn/ und erstelle die Scriptdatei zum Starten der VPN-Verbindung. Ich verwende hier den Parameter –daemon, um den Prozess im Hintergrund laufen zu lassen.
Das geht entweder ganz einfach mit folgender Zeile im Terminal
:~$ sudo openvpn --config /home/testuser/.vpn/testuser@utm9-fw.ovpn --daemon
oder man schreibt ein Script, das für den User noch prüft, ob die Verbindung tatsächlich steht:
#!/bin/bash WEISS="3[1;37m" ROT="3[1;31m" # File vpn.sh (startet die VPN-Verbindung) echo -e "${WEISS}Die VPN-Verbindung wird aufgebaut. Bitte warten..." if ( sudo systemctl status openvpn | grep " active" >/dev/null ) then sudo openvpn --config /home/testuser/.vpn/testuser@utm9-fw.ovpn --daemon >/dev/null else echo "openvpn service start" sudo systemctl start openvpn >/dev/null sleep 3 echo "openvpn start" sudo openvpn --config /home/testuser/.vpn/testuser@utm9-fw.ovpn --daemon >/dev/null fi # Prüfe den Status des Daemon if ( ps -eo 'comm' | grep "openvpn" >/dev/null ) then echo "Der Daemon wurde erfolgreich gestartet." else echo -e "${ROT}### ERROR ###" echo "OpenVPN konnte nicht gestartet werden!" echo -e "${WEISS}Beliebiger Taste für WEITER..." read INP exit 1 fi sleep 15 echo -e "\n" # Prüfen on Verbindung besteht # IP des Hosts, der geprüft werden kann (z.B. eine NAS oder ein Server) HOST="10.10.0.1" echo "Prüfung, ob das entfernte Netz erreicht werden kann..." ping -w5 -c1 $HOST 1>/dev/null 2>/dev/null SUCCESS=$? if [ $SUCCESS -eq 0 ] then echo -e "Der Host ${WATCH_IP} wurde erreicht." echo "Die Verbindung wurde erfolgreich hergestellt." else echo -e "${ROT}### ERROR ###" echo "Die Ziel-IP kann nicht erreicht werden!" echo "Der Service OpenVPN wird wieder gestoppt und die Verbindung getrennt." echo -e "${WEISS}Beliebiger Taste für WEITER..." read INP sudo pkill "openvpn --config /home/testuser/.vpn/testuser@utm9-fw.ovpn" > /dev/null sudo ip link delete tun0 > /dev/null exit 1 fi echo -e "\n" echo -e "${WEISS}Beliebige Taste für WEITER..." read INP exit 0
Zu beachten ist hier, dass mein testuser eigentlich kein sudo ausführen kann, ohne ein Passwort einzugeben. Das muss ihm explizit erlaubt werden, indem man die Liste der sudoers erweitert. Vertraut man seinem User, kann man anstelle der für die Skripte benötigten Rechte auch alle Aktionen von der Eingabe des sudo-Passworts ausnehmen.. Dazu gibt es einen schönen Artikel -> hier.
Um dem testuser nur die für diese beiden Scripte notwendigen sudo-Rechte zu geben editiert man die Datei custom-users mit visudo:
~$: sudo visudo -f /etc/sudoers.d/custom-users
In diese in der Regel leere Datei trägt man folgende Zeile ein:
testuser ALL=(ALL) NOPASSWD:/usr/sbin/openvpn, /bin/systemctl status openvpn, /bin/systemctl start openvpn, /usr/bin/pkill, /sbin/ip
Jetzt speichert man und schliesst die Datei. In der zweiten Scriptdatei kille ich den Prozess openvpn einfach, um die VPN-Verbindung zu beenden.
#!/bin/bash WEISS="3[1;37m" ROT="3[1;31m" # File vpnkill.sh (stoppt die VPN-Verbindung) echo -e "${WEISS}Die VPN-Verbindung wird unterbrochen. Bitte warten…" sudo pkill "openvpn --config /home/testuser/.vpn/testuser@utm9-fw.ovpn" > /dev/null echo "Der Prozess wurde gekillt." sleep 10 if ( ifconfig | grep "tun0" >/dev/null ) then echo -e "${ROT}Die VPN-Schnittstelle tun0 ist noch aktiv!" sudo ip link delete tun0 >/dev/null sleep 2 echo -e "${WEISS}Die VPN-Schnittstelle tun0 wurde erfolgreich gelöscht." else sleep 1 fi echo "Die Verbindung wurde getrennt." echo -e "\n" echo "Beliebige Taste für WEITER..." read INT EXIT 0
Die beiden Desktop-Icons erstelle ich aus einer Kopie des Terminals und speichere sie als VPN_ON.desktop und VPN_OFF.desktop in /home/testuser/Desktop (bzw. Schreibtisch in der deutschen Version).
[Desktop Entry] Name=VPN ON Comment=Use the command line TryExec=gnome-terminal Exec=gnome-terminal --command="/home/testuser/vpn.sh" Icon=utilities-terminal Type=Application X-GNOME-DocPath=gnome-terminal/index.html X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=gnome-terminal X-GNOME-Bugzilla-Component=BugBuddyBugs X-GNOME-Bugzilla-Version=3.6.2 Categories=GNOME;GTK;Utility;TerminalEmulator; StartupNotify=true OnlyShowIn=GNOME;Unity; Keywords=Run; Actions=New X-Ubuntu-Gettext-Domain=gnome-terminal Name[de_DE]=VPN ON [Desktop Action New] Name=New Terminal Exec=gnome-terminal OnlyShowIn=Unity
[Desktop Entry] Name=VPN OFF Comment=Use the command line TryExec=gnome-terminal Exec=gnome-terminal --command="/home/testuser/vpnkill.sh" Icon=utilities-terminal Type=Application X-GNOME-DocPath=gnome-terminal/index.html X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=gnome-terminal X-GNOME-Bugzilla-Component=BugBuddyBugs X-GNOME-Bugzilla-Version=3.6.2 Categories=GNOME;GTK;Utility;TerminalEmulator; StartupNotify=true OnlyShowIn=GNOME;Unity; Keywords=Run; Actions=New X-Ubuntu-Gettext-Domain=gnome-terminal Name[de_DE]=VPN OFF [Desktop Action New] Name=New Terminal Exec=gnome-terminal OnlyShowIn=Unity
Die beiden Desktop-Icons müssen beim ersten Start noch als vertrauenswürdig eingestuft werden. Danach lässt sich der VPN-Tunnel bequem durch den User starten und stoppen.