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

scripting / openVPN / emailNotification /

Scheduled Pinned Locked Moved Deutsch
24 Posts 3 Posters 1.5k 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.
  • N
    noplan @JeGr
    last edited by noplan Apr 21, 2020, 2:59 PM Apr 21, 2020, 2:58 PM

    @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
    • J
      JeGr LAYER 8 Moderator
      last edited by Apr 21, 2020, 3:11 PM

      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
      • J
        JeGr LAYER 8 Moderator
        last edited by Apr 21, 2020, 9:40 PM

        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
        • N
          noplan
          last edited by Apr 23, 2020, 12:22 PM

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

          1 Reply Last reply Reply Quote 0
          21 out of 24
          • First post
            21/24
            Last post
          Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.
            This community forum collects and processes your personal information.
            consent.not_received