scripting / openVPN / emailNotification /
-
@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
-
Hmm ich wollte das gerade mal nachbauen aber bei mir werden im Lab ĂŒberhaupt keine Mails versendet ;)
-
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
-
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.
-
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 -
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.
-
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. -
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.2Output 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
-
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 aufLOG_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 wieLogout:
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 durchopenlog
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:
Log Eintrag:
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
- Direkt zum Start des Skripts nach dem include ein
-
/status ... ich noch immer nicht dazu gekommen ... fffu*****