Ankündigung

Einklappen
Keine Ankündigung bisher.

VPN-Server: Useraktivierung und Status per EIB/KNX-Gruppenadresse

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] VPN-Server: Useraktivierung und Status per EIB/KNX-Gruppenadresse

    Vorgabe:
    - HS/FS-Visu
    - einzelne VPN-User sollen per KNX-GA freigegeben werden können
    - Verbindungsstatus einzelner User auf die HS-Visu bringen via KNX
    - Wartungs-VPN aktivierbar (=Standardfunktion)

    - VPN-Clients werden "ganz normal" übers Webif angelegt, im Plugin nicht aufgeführte User dürfen sich immer einwählen. VPN-Server-Config ist separat zu machen.
    - Beim Verbindungsauf&abbau wird auf die in vpn_usermap_status hinterlegte Gruppenadresse eine 0 (Offline) bzw. 1 (Online) gesendet
    - Beide Gruppenadressen (Freigabe&Status) können per Lesetelegramm vom Bus abgefragt werden.


    Sponsored by Helmut, vielleicht stellt er uns noch einen Screenshot dazu
    -> Realisiert per "selbstinstallierendem" Plugin:
    Code:
    # Plugin zu (de)aktivieren von VPN-Usern per KNX-GA
    # Hinweise: 
    # Umlaute, Sonderzeichen, Leerzeichen etc. in VPN-Clientnamen vermeiden!
    # Gross/Kleinschreibung beachten!
    # (default) hier nicht genannte VPN-User sind aktiviert
     
    # Eigenen Aufruf-Zyklus auf 300 Sekunden setzen
    $plugin_info{$plugname.'_cycle'} = 86400;
    my %vpn_usermap; # Eintrag darf nicht auskommentiert werden
    my %vpn_usermap_status; # Eintrag darf nicht auskommentiert werden
    
    ##############################################################################
    ### Definitionen
    ##############################################################################
    my $install = 1; # Installiere skripte/config bei Bedarf
    # KNX-Ga zum freigeben der User - Namen wie in VPN-config
    $vpn_usermap{'0/7/202'} = "kunde-hsbetreuer";
    $vpn_usermap{'0/7/204'} = "kunde-notebook";
    $vpn_usermap{'0/7/206'} = "kunde-knx-betreuer";
    $vpn_usermap{'0/7/210'} = "kunde-netzwerkbetreuer";
    # KNX-GA Verbindungs-Status der User  - Namen wie in VPN-config
    $vpn_usermap_status{'0/7/203'} = "kunde-hsbetreuer";
    $vpn_usermap_status{'0/7/205'} = "kunde-notebook";
    $vpn_usermap_status{'0/7/207'} = "kunde-knx-betreuer";
    $vpn_usermap_status{'0/7/211'} = "kunde-netzwerkbetreuer";
    ##############################################################################
    ### Ende Definitionen
    ##############################################################################
    
    if (%msg) {
      if ($msg{'apci'} eq "A_GroupValue_Write" and $vpn_usermap{$msg{'dst'}}) {
    	if($msg{'data'}+0) {
    	#enable
    		unlink("/etc/openvpn/servers/$vpn_usermap{$msg{'dst'}}.disabled");
    		return "enabled $vpn_usermap{$msg{'dst'}} by $msg{'dst'}";
    	} else {
    	#disable
    		my $dummy = `echo "disabled" > /etc/openvpn/servers/$vpn_usermap{$msg{'dst'}}.disabled`;
    		return "DISabled $vpn_usermap{$msg{'dst'}} by $msg{'dst'}";
    	}
      } elsif ($msg{'apci'} eq "A_GroupValue_Read" and $vpn_usermap{$msg{'dst'}}) {
        my $status = 0;
        $status = 1 unless (-e "/etc/openvpn/servers/$vpn_usermap{$msg{'dst'}}.disabled");
    		my @args = ($eib_grpresp_bin, $eib_url, $msg{'dst'},sprintf("%02X", $status));
    		system(@args);
      } elsif ($msg{'apci'} eq "A_GroupValue_Read" and $vpn_usermap_status{$msg{'dst'}}) {
        my $status = `grep "^$vpn_usermap_status{$msg{'dst'}}" /var/run/openvpn.server.status`;
        $status = 1 unless (!$status);
    		my @args = ($eib_grpresp_bin, $eib_url, $msg{'dst'},sprintf("%02X", $status));
    		system(@args);
      }
    } else {
        # cyclic/init/change
        # subscribe GA's
        while( my ($k, $v) = each(%vpn_usermap) ) {
          # Plugin an Gruppenadresse "anmelden"
          $plugin_subscribe{$k}{$plugname} = 1;
        }
        open(OUT, ">/etc/openvpn/servers/VPNGA_MAP");
        while( my ($k, $v) = each(%vpn_usermap_status) ) {
          # Plugin an Gruppenadresse "anmelden"
          $plugin_subscribe{$k}{$plugname} = 1;
          # Write VPNGA_MAP
          print OUT "$v=$k\n";
        }
        close(OUT);
        # Self-installer ;) Multiline-print doesn't work somehow
        return unless $install;
        if (! -e '/etc/openvpn/connect.sh' or ! -e '/etc/openvpn/disconnect.sh') {
          open(OUT, ">/etc/openvpn/connect.sh");
          print OUT "#!/bin/bash\n\nif [ -e /etc/openvpn/servers/\$common_name.disabled ]; then\n";
          print OUT "\tlogger -t VPN 'refused disabled VPN-user \$common_name from \$trusted_ip'\n";
          print OUT "\texit 1\nelse \n";
          print OUT "\tlogger -t VPN '\$common_name logged in from \$trusted_ip (\$ifconfig_pool_remote_ip)'\n";
          print OUT "\tVPNGA=`grep \"^\$common_name=\" /etc/openvpn/servers/VPNGA_MAP | cut -d'=' -f 2`\n";
          print OUT "\tgroupswrite local:/tmp/eib \$VPNGA 1\nfi\nexit 0\n";
          close(OUT);
          open(OUT, ">/etc/openvpn/disconnect.sh");
          print OUT "#!/bin/bash\n\n";
          print OUT "logger -t VPN '\$common_name logged out from \$trusted_ip (\$ifconfig_pool_remote_ip) T: \$time_duration S: \$bytes_sent R: \$bytes_received'\n";
          print OUT "VPNGA=`grep \"^\$common_name\" /etc/openvpn/servers/VPNGA_MAP | cut -d'=' -f 2`\n";
          print OUT "groupswrite local:/tmp/eib \$VPNGA 0\n";
          close(OUT);
          chmod 0755, "/etc/openvpn/connect.sh","/etc/openvpn/disconnect.sh";
          `sync`;
        }
        if (! `grep '^client-connect' /etc/openvpn/server.conf` ) {
            open(OUT, ">>/etc/openvpn/server.conf");
            print OUT "script-security 2\nclient-connect connect.sh\nclient-disconnect disconnect.sh\n";
            close OUT;
            `/etc/init.d/openvpn restart`;
            `sync`;
        }
    }
    return;
    (Die einzelnen Schritte und erklärungen evtl. separat)
    Man braucht nicht mehr zu machen als das Plugin einzufügen und die Gruppenadressen/VPNClient-Namen unter ### Definitionen zu ändern

    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    #2
    Hi Makki,

    ich bin von der Lösung echt schwer begeistert, wie sieht denn das der Rest, bin da mal wieder "alleine mit meiner Meinung" ?????

    Könntest du das Script so ändern, dann jeder User im Script auftauchen muss, ansonsten funzt der Zugang einfach nicht ????

    Wäre da doof wenn ein User angelegt wird, und dann kommt der Bruder oder die Schwester jederzeit rein

    Screenshot folgt, aber ich hab grad Stress......

    Kommentar


      #3
      Kann man natürlich machen, man muss nur die "Strategie" umdrehen; USER.enabled statt USER.disabled wegschreiben & prüfen.
      Initial war es aber andersrum gedacht, weil ich unterstellte, das man eher wenige per KNX (de)aktivieren will und der Rest einfach können soll + es ohne Plugin, Anapssung usw. erstmal funktioniert. Ich wollte das ja in die Standardconfig neuer WG packen und dann isses eher blöd wenn das VPN erst nach einem Telegramm funktioniert

      Ausserdem bleibt ja auch die "serienmässige" Alternative den VPN-Server einfach per GA komplett zu deaktivieren..

      Makki
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        Hi,

        ziemlich cooles Feature!
        Bei mir kann ich zwar mit der GA den Zugriff freischalten und deaktivieren, aber die Rückmelde_GA funktioniert nicht sauber.
        Beim Trennen der Verbindung wird keine 0 gesendet. Stattdessen beim nächsten Aufbau der Verbindung direkt hintereinander 0 und dann 1 gesendet.

        Ich nutze OpenVPN 2.2.0.

        Dann wäre es m.E. noch sinnvoll, in Folge der Deaktivierung eines Nutzers auch eine Zwangstrennung dessen zu machen, sofern die Verbindung gerade aktiv ist.

        Kommentar


          #5
          Das funktioniert ziemlich sicher schon, es dauert nur ein bisschen (und wenn man sich sofort wieder einwählt kommt eben 0 und dann 1); es gibt defaultmässig einen keepalive mit timeout von 120sek., erst dann kommt die 0..
          Kann man natürlich verändern, relevant und gut bei madigen Wlan/GSM-Verbindungen, daher sollte man daran nur bedingt drehen..

          Zitat von spookyt. Beitrag anzeigen
          Dann wäre es m.E. noch sinnvoll, in Folge der Deaktivierung eines Nutzers auch eine Zwangstrennung dessen zu machen, sofern die Verbindung gerade aktiv ist.
          Könnte man machen, sowas wie
          Code:
          ...
          	#disable
          		my $dummy = `echo "disabled" > /etc/openvpn/servers/$vpn_usermap{$msg{'dst'}}.disabled`;
          [COLOR="Red"]		my $resp = `echo kill $vpn_usermap{$msg{'dst'}} | nc localhost 8001 -q 1`;[/COLOR]
          		return "DISabled $vpn_usermap{$msg{'dst'}} by $msg{'dst'}[COLOR="Red"] - VPN-server said: $resp[/COLOR]";
          ...
          sollte es tun, kann aber grad nicht testen..

          Makki
          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
          -> Bitte KEINE PNs!

          Kommentar

          Lädt...
          X