Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    scripting / openVPN / emailNotification /

    Scheduled Pinned Locked Moved Deutsch
    24 Posts 3 Posters 1.6k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • noplanN
      noplan @JeGr
      last edited by

      @JeGr

      ich bin jetzt überfordert ;)
      liegt aber wahrscheinlich an der zu langen Abendschicht und den Akten die sich hier stapeln ... ich werd das heut vormittag durchdenken.
      ich bin begeistert !

      1 Reply Last reply Reply Quote 0
      • noplanN
        noplan
        last edited by noplan

        irgendwas rennt falsch: @JeGr
        die zu loggenden Clients erhalten mittels CSO
        10.0.0.230/24 - 10.0.0.253/24

        #!/usr/local/bin/php -q
        <?php
        	require_once("/etc/inc/notices.inc");
        
        $local_connect_value = " \n user_name: " . getenv('common_name') . " \n vpn_client_ip: " . getenv('ifconfig_pool_remote_ip') ." connected from " . getenv('trusted_ip') . " on " . date('F j, Y, g:i a');
        
        if ( strrchr (__FILE__ , 'disconnect') ) {
        
        	$client_ip=getenv(ifconfig_pool_remote_ip);
        	$min_ip="10.0.0.229";
        	$max_ip="10.0.0.253";
        
        
        if (ip2long($min_ip) < ip2long($client_ip) && ip2long($client_ip) < ip2long($max_ip)) {
        
        	$local_connect_value = " \n user_name: " . getenv('common_name') . " \n vpn_client_ip: " . getenv('ifconfig_pool_remote_ip') ." connected from " . getenv('trusted_ip') . " on " . date('F j, Y, g:i a') . " \n duration : " . round(((getenv('time_duration'))/3600),2) . "  hours, or " . round(((getenv('time_duration'))/60),2) . "  minutes, or " . getenv('time_duration') . "  seconds,\n upload from vpn-client (received) : " . round(((getenv('bytes_received'))/1048576),2) . " MB, \n download to vpn-client (send) : " . round(((getenv('bytes_sent'))/1048576),2) ." MB. \n DISCONNECTED.";
        }  
        }
        notify_all_remote($local_connect_value);
        
        	
        ?>
        

        es wird zwar ein mail versendet aber nur mehr mit diesem Inhalt:
        client mit 10.0.0.233 (also ein client innerhalb der Range)
        f1ef0509-828f-4c30-a279-4799092b9508-grafik.png

        client mit 10.0.0.7 (also ein client außerhalb der Range) erhält auch noch immer mail
        159ee3a4-ebbe-4c2c-92b5-b492a471f176-grafik.png

        ich versteh auch nicht wieso diese Zeilen nicht mehr mitübermittelt werden .
        34341a19-0583-4bf2-a97f-f7d4e4983a27-grafik.png

        für Hinweise dankbar ... wie gesagt irgendwie Wald und Bäume ...

        1 Reply Last reply Reply Quote 0
        • JeGrJ
          JeGr LAYER 8 Moderator
          last edited by JeGr

          du musst vom ersten Aufruf von $local_connect_value bis zum letzten notify_all_remote alles in das IF mit den ip2long Vergleichen packen

          Warum:

          • du hast vor dem IF noch die erste Anweisung mit dem local_connect_value
          • den zweiten Block mit dem local... hast du im IF
          • NACH dem IF (also immer!) führst du das notify aus -> mit dem ersten Wert von ganz am Anfang befüllt

          Oder verstehe ich dich falsch und es soll immer eine Notification kommen und nur bei den Clients im Range dann eben mehr Details?

          Wenn ja, dann würde ich mit

          $local_connect_value = "";

          anfangen, dann im IF den langen value string reinpacken, einen zusätzlichen Else machen mit nur dem geringen output und am Ende den notify außerhalb des IFs.

          Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

          If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

          noplanN 1 Reply Last reply Reply Quote 0
          • noplanN
            noplan @JeGr
            last edited by noplan

            @JeGr said in scripting / openVPN / emailNotification /:

            nein das script soll nur dann einen Versand triggern wenn die IP d vpn-client eine IP aus der RANGE
            hat.

            interner Test wenn die IP fest vergeben funktioniert.
            also die IF tut was sie soll (hab ja auch nix anderes erwarte)
            und das kommt auch alles so wie es soll.

            #!/usr/local/bin/php -q
            <?php
            	require_once("/etc/inc/notices.inc");
            
            $client_ip=getenv(ifconfig_pool_remote_ip);
            // $client_ip="10.0.0.252";
            // be aware range = .250 - .254
                $min_ip="10.0.0.250";
            	$max_ip="10.0.0.255";
            if (ip2long($min_ip) < ip2long($client_ip) && ip2long($client_ip) < ip2long($max_ip)) {
            $local_connect_value = " \n user_name: " . getenv('common_name') . " \n vpn_client_ip: " . getenv('ifconfig_pool_remote_ip') ." connected from " . getenv('trusted_ip') . " on " . date('F j, Y, g:i a') . " \n duration : " . round(((getenv('time_duration'))/3600),2) . "  hours, or " . round(((getenv('time_duration'))/60),2) . "  minutes, or " . getenv('time_duration') . "  seconds,\n upload from vpn-client (received) : " . round(((getenv('bytes_received'))/1048576),2) . " MB, \n download to vpn-client (send) : " . round(((getenv('bytes_sent'))/1048576),2) ." MB. \n DISCONNECTED.";
            notify_all_remote($local_connect_value);
            }
              
            ?>
            
            

            jetzt kommt der nervige teil (verbindungen aufbauen traffic und closen ... warten ) and again

            1 Reply Last reply Reply Quote 0
            • JeGrJ
              JeGr LAYER 8 Moderator
              last edited by

              Hmm ich wollte das gerade mal nachbauen aber bei mir werden im Lab überhaupt keine Mails versendet ;)

              Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

              If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

              noplanN 1 Reply Last reply Reply Quote 0
              • noplanN
                noplan @JeGr
                last edited by noplan

                @JeGr

                du musst die email notification auf der box aktiviert haben

                im trockentest funktioniert die IF
                also das schript auf der Konsole aufrufen wenn

                $client_ip="10.0.0.252"; 
                

                als fix definiert ist haut es ohne probleme hin
                also bei einer IP aus der Range bekommt man ein mail
                bei einer die nicht in er Range ist bekommt man keines
                (kann man testen indem man) nach der letzten } folgendes else einsetzt (der einzige Unterschied ist ein zusätzliches ELSE im user-name um im mail eine Unterscheidung zu haben)

                else 
                $local_connect_value = " \n ELSE-user_name: " . getenv('common_name') . " \n vpn_client_ip: " . getenv('ifconfig_pool_remote_ip') ." connected from " . getenv('trusted_ip') . " on " . date('F j, Y, g:i a') . " \n duration : " . round(((getenv('time_duration'))/3600),2) . "  hours, or " . round(((getenv('time_duration'))/60),2) . "  minutes, or " . getenv('time_duration') . "  seconds,\n upload from vpn-client (received) : " . round(((getenv('bytes_received'))/1048576),2) . " MB, \n download to vpn-client (send) : " . round(((getenv('bytes_sent'))/1048576),2) ." MB. \n DISCONNECTED.";
                notify_all_remote($local_connect_value);
                

                sobald man allerdings

                $client_ip=getenv(ifconfig_pool_remote_ip);
                

                oder (unterschied sind die beiden ' )

                $client_ip=getenv('ifconfig_pool_remote_ip');
                

                aktiviert hat (was man ja sollte) bekommt man gar nix oder einfach immer nur das Ergebnis der ELSE.

                Da hats mE was mit der Abfrage / Verwendung / Weiterverarbeitung der IP aus $client_ip Variable.

                nP

                1 Reply Last reply Reply Quote 0
                • JeGrJ
                  JeGr LAYER 8 Moderator
                  last edited by

                  Ja die Notifications hatten ein Problem, das Zusammenspiel mit STARTTLS ist da wackelig, aber anyway.

                  Jetzt muss ich nur noch schauen, warum der Disconnect nicht erkannt wird, irgendwas ist da faul. Dann kann ichs endlich mal nachstellen.

                  Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

                  If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

                  noplanN 1 Reply Last reply Reply Quote 0
                  • noplanN
                    noplan @JeGr
                    last edited by

                    @JeGr

                    jop dann wart ich mal geduldig ab ;)

                    ich vermute das die Verarbeitung der $client_ip nicht funktioniert denn der Inhalt dieser Variable wird im ELSE-Teil ja richtig ausgegeben.

                    wenn das Ding fertig ist sollte man es verkaufen !

                    ;)
                    nP

                    1 Reply Last reply Reply Quote 0
                    • JeGrJ
                      JeGr LAYER 8 Moderator
                      last edited by

                      So jetzt hab ichs. Skript macht das was ich will ;) was vielleicht etwas anders ist, als was du vor hattest - aber anpassen geht dann relativ einfach.

                      Was irgendwie gestört hat - konnte ich jetzt nicht rauskitzeln warum - war der IF mit dem "FILE" auf "disconnect". Da aber das ganze Skript ja überhaupt nur beim Disconnect aufgerufen wird (durch OVPN Server Skript), macht das IMHO eh keinen wirklichen Sinn bzw. bringt nutzen - es wird ja so oder so nur beim Disconnect ausgeführt.

                      Ergo weg damit und jetzt läuft es wie es soll, inkl. Logging ins Syslog zusätzlich zur Mail (falls man es lieber im Log haben will). Wie ich es auf die Schnelle in das OVPN Syslog reinbekomme, hatte ich jetzt nicht gesucht, aber das geht sicher auch irgendwie noch.

                      Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

                      If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

                      noplanN 1 Reply Last reply Reply Quote 0
                      • noplanN
                        noplan @JeGr
                        last edited by noplan

                        @JeGr

                        Script zu finden wo?

                        Dir ist eh klar das es bei d ergänzen Sache um die Lesbarkeit d Daten geht
                        Dauer in out user etc.

                        1 Reply Last reply Reply Quote 0
                        • JeGrJ
                          JeGr LAYER 8 Moderator
                          last edited by

                          Code den ich verwende:

                          #!/usr/local/bin/php-cgi -q
                          <?php
                          	require_once("/etc/inc/notices.inc");
                          	
                          	$client_ip=getenv('ifconfig_pool_remote_ip');
                          	$min_ip="172.22.255.229";
                          	$max_ip="172.22.255.254";
                          
                          	//if ( strrchr (__FILE__ , 'disconnect') ) {
                          		if (ip2long($min_ip) < ip2long($client_ip) && ip2long($client_ip) < ip2long($max_ip)) {
                          			// wenn IP innerhalb der Range ist, dann logge volle Info und sende Mail:
                          			$local_connect_value = " \n user_name: " . getenv('common_name') . " \n vpn_client_ip: " . getenv('ifconfig_pool_remote_ip') ." connected from " . getenv('trusted_ip') . " on " . date('F j, Y, g:i a') . " \n duration : " . round(((getenv('time_duration'))/3600),2) . "  hours, or " . round(((getenv('time_duration'))/60),2) . "  minutes, or " . getenv('time_duration') . "  seconds,\n upload from vpn-client (received) : " . round(((getenv('bytes_received'))/1048576),2) . " MB, \n download to vpn-client (send) : " . round(((getenv('bytes_sent'))/1048576),2) ." MB. \n DISCONNECTED.";
                          		} else {
                          			// sonst nur Kurzform loggen und versenden:
                          			$local_connect_value = " \n user_name: " . getenv('common_name') . " \n vpn_client_ip: " . getenv('ifconfig_pool_remote_ip') ." connected from " . getenv('trusted_ip') . " on " . date('F j, Y, g:i a');
                          		}
                          	//}
                          	
                          	syslog(LOG_USER, "vpnconnect.php: ".$local_connect_value); 
                          	notify_all_remote($local_connect_value);
                          ?>
                          

                          Den Min/Max Bereich muss man sich natürlich anpassen wie man Lust hat. Ist die IP aus dem Bereich, gibt es exzessives Logging mit Zusatzdaten, wenn sie nicht im Bereich war, dann gibts nur kleines Logging:

                          Beispiel: 2 User, jens und test.

                          jens -> 172.22.255.234
                          test -> 172.22.255.2

                          Output bei jens:

                          Notifications in this message: 1
                          ================================
                          
                          16:41:46
                           user_name: jens
                           vpn_client_ip: 172.22.255.234 connected from 1.2.3.4 on April 21, 2020, 4:41 pm
                           duration : 0.01  hours, or 0.6  minutes, or 36  seconds,
                           upload from vpn-client (received) : 0.04 MB,
                           download to vpn-client (send) : 0 MB.
                           DISCONNECTED.
                          

                          Output bei test:

                          Notifications in this message: 1
                          ================================
                          
                          16:43:53
                           user_name: test
                           vpn_client_ip: 172.22.255.22 connected from 1.2.3.4 on April 21, 2020, 4:43 pm
                          

                          Will man jetzt bei einer Gruppe gar keine Mail versenden, muss man das nur etwas umgruppieren:

                          #!/usr/local/bin/php-cgi -q
                          <?php
                          	require_once("/etc/inc/notices.inc");
                          	
                          	$client_ip=getenv('ifconfig_pool_remote_ip');
                          	$min_ip="172.22.255.229";
                          	$max_ip="172.22.255.254";
                          	
                          	if (ip2long($min_ip) < ip2long($client_ip) && ip2long($client_ip) < ip2long($max_ip)) {
                          		// wenn IP innerhalb der Range ist, dann logge volle Info und sende Mail:
                          		$local_connect_value = " \n user_name: " . getenv('common_name') . " \n vpn_client_ip: " . getenv('ifconfig_pool_remote_ip') ." connected from " . getenv('trusted_ip') . " on " . date('F j, Y, g:i a') . " \n duration : " . round(((getenv('time_duration'))/3600),2) . "  hours, or " . round(((getenv('time_duration'))/60),2) . "  minutes, or " . getenv('time_duration') . "  seconds,\n upload from vpn-client (received) : " . round(((getenv('bytes_received'))/1048576),2) . " MB, \n download to vpn-client (send) : " . round(((getenv('bytes_sent'))/1048576),2) ." MB. \n DISCONNECTED.";
                          
                          		syslog(LOG_USER, "vpnconnect.php: ".$local_connect_value); 
                          		notify_all_remote($local_connect_value);
                          
                          	} else {
                          		// sonst nichts loggen oder mailen
                          	}
                          ?>
                          

                          Alle anderen Sachen kann man jetzt natürlich noch nach Belieben schön machen. Den Output Salat aufräumen, die Variablen alle sauber vorher zuweisen, etc. etc.

                          Wenn ich dazu komme räum ich vielleicht nochmal auf und machs schön :D

                          Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

                          If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

                          1 Reply Last reply Reply Quote 0
                          • JeGrJ
                            JeGr LAYER 8 Moderator
                            last edited by

                            Kleine Anmerkung:

                            Ich hab mich nochmal hingesetzt und es für mich gerade schön gemacht. Skripte in /usr/local/bin gepackt, Logging neu, Variablen vordefiniert und nicht alles im Sendevorgang gesetzt, Log Output unterschiedlich zum Mail Output etc.

                            Muss man alles nicht, hatte mich aber getriggert. Kann sich aber jeder selbst zusammenbauen, wie er den Output möchte, da muss ich denke ich nicht nochmal großartig was posten.

                            Was aber noch schön ist, wenn das wer möchte: Um den Logging Vorgang ins Syslog von OpenVPN zu verfrachten und nicht in das normale Syslog (vielleicht will es ja jemand genau da haben - je nach Gusto), muss man noch folgendes tun:

                            • Direkt zum Start des Skripts nach dem include ein
                              openlog("openvpn", LOG_PID | LOG_PERROR, LOG_LOCAL0);
                              einfügen
                            • Die syslog(...) Zeile ändern auf LOG_NOTICE statt User, das ist generell eh sinnvoller, da wir ja keinen Alarm auslösen wollen
                            • Den Output von syslog() sollte man entweder mit <skriptname:> beginnen (wenns ins syslog geht, dort Standard), oder beim Output ins OVPN Log dann sowas wie Logout: o.ä. voranstellen, damit man die Logzeile besser rausfiltern kann wenn man sucht.
                            • Am Ende des Skript muss noch eine Zeile
                              closelog();
                              mit rein, die dann das Logging abschließt. Mit der Umleitung durch openlog und den ersten Parameter "openvpn" landet das ganze dann im OpenVPN Tab/Log als wäre es vom OVPN Prozess selbst gesendet worden.

                            Das rundet den Feinschliff etwas ab :)

                            Meine Variante im Lab sieht jetzt so aus (nach einem schnellen internen Test):

                            Mail:
                            261d3758-5688-4c6e-a6ee-a79b41bb1e97-image.png

                            Log Eintrag:
                            9dedc721-e087-4693-9656-1856a30c8e46-image.png

                            Man sieht den obersten Eintrag etwas anders formatiert als die Mail um besser im Log lesbar zu sein (und da im Log keine Newlines gelten). Zusätzlich sieht es so aus, als käme die Info vom "openvpn" Prozess, die unterschiedliche PID zeigt aber, dass hier das PHP Skript zu Gange war :)

                            Grüße

                            Don't forget to upvote 👍 those who kindly offered their time and brainpower to help you!

                            If you're interested, I'm available to discuss details of German-speaking paid support (for companies) if needed.

                            1 Reply Last reply Reply Quote 0
                            • noplanN
                              noplan
                              last edited by

                              /status ... ich noch immer nicht dazu gekommen ... fffu*****

                              1 Reply Last reply Reply Quote 0
                              • First post
                                Last post
                              Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.