OpenVPN wenn Benutzer anmeldet, benachrichtigung per Telegram senden.

  • Hallo zusammen =) Ich mal wieder.

    Ich versuche mal so genau wie möglich zu beschreiben was ich machen will um Missverständnisse zu vermeiden oder für alternative Vorschläge

    Das ganze ist momentan noch sehr unausgereift und ich versuche mich in die verschiedenen benötigten Befehle einzulesen. Ich möchte jedoch kein komplettes Script von euch sondern eher Tips welche Befehle ich mal nachschlagen sollte (Lieber einfach und etwas längerer code als komplex zu verstehen dafür kurz).

    Ich möchte mir mittels Telegram eine Nachricht zukommen lassen sobald sich über openVPN jemand bei meinem Pi anmeldet. Da das logfile jedoch nur mit Rootrechten abgerufen werden kann dachte ich mir dies mittels sudo cat /var/log/openvpn-status.log >> /home/pi/logs/openVPN.txt in eine txt datei zu übergeben und nur diese zu prüfen damit nicht das ganze Script mit Rootrechten laufen muss. Diese txt möchte ich dann mittels Script erstmal auf Grösse beobachten. Wenn niemand verbunden ist ist das File immer gleich gross. Ändert sich also die Grösse muss eine Verbindung hergestellt worden sein. Wenn also die Dateigrösse nicht mehr der Vorgabe entspricht möchte ich die Datei nach CLIENT_LIST durchsuchen. Das CLIENT_LIST in der 3. Zeile möchte ich Ignorieren, ich brauche das aus Zeile 5 bzw ich möchte da den <ClientName> auslesen und diesen dann per Telegram weiterleiten.

    Die Probleme die ich in diesem Denkansatz noch hab sind:

    • Nach dem vorher beschriebenen Vorgehen würde das Script jedesmal auslösen wenn es die Datei überprüft so lange jemand angemeldet ist. Das soll ja nicht sein. Meine erste Idee war die geänderte Dateigrösse an eine globale Variabel weiterzugeben um diese beim nächsten run gegenzuprüfen und falls A=B dann Script schliessen. Nachdem ich mal etwas gegoogelt hab scheint mir die Idee eher schlecht da ganz klar von globalen Variablen abgeraten wird. Welche alternativen gibt es da? Eine andere Möglichkeit die ich in Batch-Dateien unter Windoof oft nutzte ist das zwischenspeichern der Variabel in einer temporären Datei, ich denke jedoch das geht auch besser?
    • Der String CLIENT_LIST kommt offensichtlich mehrere male vor im log sobald jemand verbunden ist. Ist es möglich nur ab einer gewissen Zeile das Dokument zu untersuchen?
    • Wenn sich mehrere Nutzer anmelden hab ich natürlich u.a. auch das erste genannte Problem aber das Script soll ja dann auch eine Zeile weiter unten den Clientnamen auslesen. Ich nehme an das könnte man mit einer Counterfunktion machen mit welcher die Prüfzeile angesteuert wird?
    • Mit findstr unter Windoof konnte man Leerzeichen als Trennmarker verwenden um den Zeileninhalt als einzelne Variablen auszulesen. So konnte ich z.b. Den <ClientName> auslesen ohne zu wissen wie dieser genau eingetragen ist. Soetwas gibt es sicher auch in python. Welchen Befehl muss ich da nachschlagen?
    • Selbige Probleme natürlich beim ausloggen. Dachte da an sowas wie: Wenn dateigrösse kleiner als zuvor setze counter=-1 und Wenn Dateigrösse = Leergrösse setze counter=0 jedoch ohne output. Damit meine ich dass ich keine Telegrammsg für ausloggen brauche sondern nur der Zeilencounter wieder reduziert oder geresetted werden soll damit beim nächsten run die richtige Zeile ausgelesen werden kann.

    Den Befehl für die Telegramnachricht habe ich bereits die kann man mal aus dem Thread ausschliessen.

    Das entsprechende Logfile befindet sich bei /var/log/openvpn-status.log Wenn niemand angemeldet ist sieht das Folgendermassen aus:

    Code
    TITLE    OpenVPN 2.4.0 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
    TIME    Fri Dec 22 18:13:01 2017    1513962781
    HEADER    CLIENT_LIST    Common Name    Real Address    Virtual Address    Virtual IPv6 Address    Bytes Received    Bytes Sent    Connected Since    Connected Since (time_t)    Username    Client ID    Peer ID
    HEADER    ROUTING_TABLE    Virtual Address    Common Name    Real Address    Last Ref    Last Ref (time_t)
    GLOBAL_STATS    Max bcast/mcast queue length    1
    END

    Sobald sich jemand connected ändert es sich folgendermassen (Zeile 4 + Zeile 6):

    Code
    TITLE    OpenVPN 2.4.0 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
    TIME    Fri Dec 22 17:59:59 2017    1513961999
    HEADER    CLIENT_LIST    Common Name    Real Address    Virtual Address    Virtual IPv6 Address    Bytes Received    Bytes Sent    Connected Since    Connected Since (time_t)    Username    Client ID    Peer ID
    CLIENT_LIST    <ClientName>    123.45.67.89:12345    192.168.1.3        12345    12345    Fri Dec 22 17:59:24 2017    987654321    UNDEF    5    0
    HEADER    ROUTING_TABLE    Virtual Address    Common Name    Real Address    Last Ref    Last Ref (time_t)
    ROUTING_TABLE    192.168.1.3    <ClientName>    123.45.67.89:12345    Fri Dec 22 17:59:29 2017    987654321
    GLOBAL_STATS    Max bcast/mcast queue length    1
    END

    Soweit ich gelesen habe kann man bei wenig Text die Datei folgendermassen auslesen:

    Python
    if 'CLIENT_LIST' in open('/home/pi/logs/VPNlog.txt').read():
        print("true")

    Hier müsste ich dann ja nur noch die Zeile definieren können dann hätt ich schon mal einen Anfang.

    Danke schonmals für die Hilfestellungen :)

    Grüsse Apop.

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    4 Mal editiert, zuletzt von Apop85 (22. Dezember 2017 um 19:03)

  • OpenVPN wenn Benutzer anmeldet, benachrichtigung per Telegram senden.? Schau mal ob du hier fündig wirst!

  • Hallo Apop85,

    suche doch mal nach den Frickler-Pipes. Da solltest Du alle Ansätze finden, aus gezielten Zeilen bestimmte Informationen herauszusuchen.

    Mit der Brechstange betrachtet, fallen mir so Linux-Kommandos wie head und tail ein. grep ist auch immer gut. Oder awk (obwohl das meistens mit Kanonen auf Pinguine schießen ist) - aber es funktioniert.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • llutz :wallbash: hab mich wund gegoogelt nach sowas aber nix gefunden ^^. Versteh ich das richtig, ich muss nur client-connect /path/to/script.sh in die conf Datei eintragen und dann hab ich mehr oder weniger was ich will bzw muss nur noch den <clientname> auslesen? Oder ist client-connect selbst noch ein Script welches ich bräuchte? Bin bei der Beschreibung nicht ganz gestiegen.

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

  • Ok mit den Hinweisen bin ich jetzt sicher mal ne Weile beschäftigt ^^.

    Einzige Frage noch: ist das mit dem übergen in eine txt sinnvoll/nötig bei den Frickler-Pipes? Jetzt wäre ja der Ablauf etwas anders als im initialen Post beschrieben


    1. VPN Verbindung wird hergestellt
    2. Script wird ausgeführt
    3. kopiert log in txt (Falls überhaupt nötig?)
    4. liest clientname in variabel aus mittels Frickler-Pipes
    5. Text + Variabel wird per Telegram übermittelt.

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

  • Wozu der Umstand kopieren/etc?

    Einfach per client-connect ein Script starten, das telegram-Msg sendet. openvpn schreibt client-name/ip und einiges mehr in envvars, die musst du halt auswerten bzw dem Script übergeben..

    //EDIT

    https://openvpn.net/index.php/…-openvpn-20x-manpage.html

    dort unter "SCRIPTING AND ENVIRONMENTAL VARIABLES"

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (22. Dezember 2017 um 19:47)

  • Wenn ich das Manual richtig verstanden habe müsste in der conf dann folgendes stehen:

    Code
    script-security 2
    client-connect /path/to/file.sh 

    und der Benutzername könnte danach mit $username abgerufen werden? In dem Manual fehlen leider einige Beispiele für mein Verständnis.

    EDIT: Das Ausführen rein mit client-connect /path/to/file.sh funktioniert schon mal problemlos (Was auch schon fast zu erwarten war ^^)

    EDIT2: Hab nun div Kombinationen durchprobiert aber kriegs ned hin. Sobald ich auth-user-pass-verify nutze kann ich mich nicht mehr einloggen. Aber die Funktion benötigt ja eigentlich noch ein Script zum ausführen. Ich brauch ja aber nur die Variabel username beim anmelden aber kein Script welches die Anmeldung an sich übernimmt. Suche mal weiter. Evt komm ich ja noch drauf ^^

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    7 Mal editiert, zuletzt von Apop85 (22. Dezember 2017 um 23:00)

  • Gemäss Wiki müsste es ja so gehen:

    Code
    script-security 2
    auth-user-pass-verify /path/to/script via-env

    Script Security 2 reicht ja um den Usernamen zu übermitteln. Passwort brauch ich ja nicht. Doch kann ich mich mit so nicht mehr auf dem Server einloggen.

    Ich schätze mal ich mach hier einen grundliegenden Fehler... trozdem hier mal das openvpn-log:

    Zitat von openvpn.log

    Fri Dec 22 21:54:06 2017 123.45.67.89:98765 TLS Error: Auth Username/Password was not provided by peer

    Fri Dec 22 21:54:06 2017 123.45.67.89:98765 TLS Error: TLS handshake failed

    Hier habe ich gelesen dass client-connect eigentlich schon IP und "common name" als Variabel übergeben würde. Mit echo $username kann ich diesen jedoch nicht abrufen.

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    2 Mal editiert, zuletzt von Apop85 (22. Dezember 2017 um 22:37)

  • Ok habs.

    Die Variabel die ich gesucht hab war $common_name ^^ habs die ganze zeit mit echo in ein log getestet aber hab da nie was erhalten. Hab die variabel nun in den curl befehl für die Telegrammessage eingebunden und nu ist es so wie gewünscht.

    Code: /etc/openvpn/server.conf
    # Am Ende von server.conf eingetragen
    script-security 2
    client-connect /path/to/script.sh
    Bash: /path/to/script.sh
    #!/bin/bash
    curl -s -k "https://api.telegram.org/botBotID/sendMessage" -d text="VPN-Verbindung wurde hergestellt! Benutzer: $common_name." -d chat_id=ChatID
    exit 0

    Danke an alle für die Hilfe und die Tipps =)

    p.s. kann ich den Thread verschieben? Ist ja bei python inzwischen fehl am platz ^^

    p.p.s. rein aus Neugierde... warum habe ich mittels echo in ein logfile (echo $common_name >> path/to/log.txt) die Variabel nicht auslesen können? Nutzte das oft bei Batchdateien zum debuggen von grösseren "Scripten" oder als Activitylog

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    Einmal editiert, zuletzt von Apop85 (22. Dezember 2017 um 23:02)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!