Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Linux-Control: Wireguard VPN Clients in VIS anzeigen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Linux-Control: Wireguard VPN Clients in VIS anzeigen

    This topic has been deleted. Only users with topic management privileges can see it.
    • Scrounger
      Scrounger Developer last edited by Scrounger

      Hab heute ziemlich dran geknobelt, meine verbundenen Wiredguard Clients in ioBroker zu integrieren und will das Ergebnis mit Euch teilen.

      Folgendes wird benötigt:

      • Linux-Control Adapter
      • funktionierender Wireguard Server
      • paket jq muss auf dem Wireguard Server installiert werden
      • in der wg0.conf müssen Namen für die Peers definiert sein. Dazu muss man einfach einen Kommentar direkt unter peer schreiben, wie hier dargestellt:
      [Peer]
      #Laptop
      PublicKey = XXXXXXXXXXXXXXXX
      AllowedIPs = 10.100.46.2/32
      

      Anzahl der verbundenen Clients ermitteln
      Dazu habe ich folgendes kleines bash script geschrieben

      wireguard_count_clients.sh

      #!/usr/bin/env bash
      # lists connected vpn users
      set -euo pipefail
      DATE=$(date +%Y-%m-%d\ %H:%M:%S)
      number=0
      onlineTime=120
      
      for connected in $(wg | grep -B1 -A2 endpoint |grep peer |awk '{print $2}')
      do
        client=$(grep -B2 $connected /etc/wireguard/wg0.conf|grep -v Peer| grep -v Public)
        last_handshake=$(wg|grep -A3 $connected|grep latest|awk -F':' '{print $2}' | sed 's/ ago//')
         
        convertToTime="$(printf '%s' "$last_handshake" | sed 's/ seconds//'| sed 's/ second//' | sed 's/ minutes,/:/' | sed 's/ minute,/:/'| sed 's/ hours,/:/' | sed 's/ hour,/:/' | sed 's/ //g')"   
        duration=$(echo "$convertToTime" | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }')
      
      	if (( duration < onlineTime )); then
      		number=$(expr $number + 1)
          fi
        
      done
      echo "$number"
      

      Diese Skript kann man jetzt über den Linux-Control Adapter ausführen -> Adapter Einstellung -> Reiter Meine Befehle. Dort erstellt muss dann ein Eintrag erstellt werden der das skript ausführt - wichtig der Typ muss Zahl sein z.B.:

      33108b4a-9711-4327-a2e3-b1b6178f1fb9-grafik.png

      Verbundenen Clients ermitteln
      Mit dem nächsten Skript könnt ihr Infos (Name, IP, Empfangen & Gesendet) zu den Clients ermitteln.

      wireguard_clients.sh

      #!/usr/bin/env bash
      # lists connected vpn users
      set -euo pipefail
      DATE=$(date +%Y-%m-%d\ %H:%M:%S)
      number=0
      onlineTime=120
      json=""
      
      for connected in $(wg | grep -B1 -A2 endpoint |grep peer |awk '{print $2}')
      do
        client=$(grep -B2 $connected /etc/wireguard/wg0.conf|grep -v Peer| grep -v Public | sed 's/#//')
        last_handshake=$(wg|grep -A3 $connected|grep latest|awk -F':' '{print $2}' | sed 's/ ago//')
         
        convertToTime="$(printf '%s' "$last_handshake" | sed 's/ seconds//'| sed 's/ second//' | sed 's/ minutes,/:/' | sed 's/ minute,/:/'| sed 's/ hours,/:/' | sed 's/ hour,/:/' | sed 's/ //g')"   
        duration=$(echo "$convertToTime" | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }')
        
        
        ip=$(wg|grep -A3 $connected|grep allowed|awk -F':' '{print $2}' | sed 's/\/32//')
        received=$(wg show wg0 | grep -A 2 $ip | grep transfer | sed 's/  transfer: //' | sed 's/KiB/KB/' | sed 's/MiB/MB/' | sed 's/GiB/GB/' | awk '{print $1" "$2}')
        sent=$(wg show wg0 | grep -A 2 $ip | grep transfer | sed 's/  transfer: //' | sed 's/KiB/KB/' | sed 's/MiB/MB/' | sed 's/GiB/GB/' | awk '{print $4" "$5}')
      
      	if (( duration < onlineTime )); then
      		#echo -e "$client $ip" | sed 's/# //' | sed 's/\/32//' | jq -Rsc
      		json+=$(jq -n "{name:\"$client\", ip:\"$ip\", received:\"$received\", sent:\"$sent\"}")
          fi
      
      done
      echo -e "$json" | jq -n '[inputs]'
      

      Im Linux-Control Adapter legt ihr dann wie oben folgenden Punkt an, Wichtig Typ muss Zeichenkette sein:

      f6417d4e-12ee-4158-81e5-9e2820fd9160-grafik.png

      Die Client Infos werden als JSON String im Datenpunkt abgelegt.
      Diesen kann man dann z.B. mit dem Table Widget des Material Design Adapters verarbeiten und im VIS anzeigen:

      4fec359b-b3fd-4dd6-87a8-97641f37f362-grafik.png

      Evtl. kann es ja der ein oder andere gebrauchen oder hat Verbesserungsvorschläge.

      D 1 Reply Last reply Reply Quote 3
      • K
        KleinesA last edited by

        Super Danke. So etwas habe ich gesucht.

        1 Reply Last reply Reply Quote 0
        • D
          darkiop Most Active @Scrounger last edited by

          Guten Morgen @scrounger,

          ich bekomme mit

          wg | grep -B1 -A2 endpoint |grep peer 
          

          nichts gegrept - 'peer' gibt es nicht in meiner wg-Ausgaben:

          ┬[09:43:17] [ssh:root@pve-ct-wireguard(10.7.0.1): /etc/wireguard (700)]
          ╰─> # wg | grep -B1 -A2 endpoint |grep peer
          
          ┬[10:43:12] [ssh:root@pve-ct-wireguard(10.7.0.1): /etc/wireguard (700)]
          ╰─> # wg | grep -B1 -A2 endpoint
            preshared key: (hidden)
            endpoint: x.x.x.x:28878
            allowed ips: 10.7.0.2/32
            latest handshake: 26 seconds ago
          
          ┬[10:43:15] [ssh:root@pve-ct-wireguard(10.7.0.1): /etc/wireguard (700)]
          ╰─> # wg -v
          wireguard-tools v1.0.20210223 - https://git.zx2c4.com/wireguard-tools/
          

          Kannst du mal schauen wie das bei dir Ausschaut? Hast du ggf. eine andere Wireguard-Tools Version?

          wg0.conf

          [Interface]
          Address = 10.7.0.1/24
          PrivateKey = xxx
          ListenPort = 51820
          
          [Peer]
          #handy1
          PublicKey = xxx
          PresharedKey = xxx
          AllowedIPs = 10.7.0.2/32
          [Peer]
          #handy2
          PublicKey = xxx
          PresharedKey = xxx
          AllowedIPs = 10.7.0.3/32
          
          Scrounger 1 Reply Last reply Reply Quote 0
          • Scrounger
            Scrounger Developer @darkiop last edited by Scrounger

            @darkiop
            Und du musst auch grep auf wg0.conf ausführen. Schau dir bitte das Skript genau an.

            weiter mussen die berechtihungen passen und immer den vollstandigem pfad nehmen

            D 1 Reply Last reply Reply Quote 0
            • D
              darkiop Most Active @Scrounger last edited by

              @scrounger Guten Morgen,

              das hatte ich.

              Das aus der for-Schleife herausgezogene

              wg | grep -B1 -A2 endpoint |grep peer |awk '{print $2}'
              

              wurde zum Testen ausgeführt, da mir das Skript nicht das erwartete Ergebnis brachte.

              Aktuell ist ein Client verbunden:

              ┬[08:42:56] [ssh:darkiop@pve-ct-wireguard(10.7.0.1): ~ (755)] [sudo]
              ╰─> $ wg
              interface: wg0
                public key: xxxxx=
                private key: (hidden)
                listening port: 51820
              
              peer: xxxxx=
                preshared key: (hidden)
                endpoint: x.x.x.x:30835
                allowed ips: 10.7.0.2/32
                latest handshake: 8 seconds ago
                transfer: 377.86 KiB received, 778.34 KiB sent
              
              peer: xxxxx=
                preshared key: (hidden)
                allowed ips: 10.7.0.3/32
              
              ┬[08:42:58] [ssh:darkiop@pve-ct-wireguard(10.7.0.1): ~ (755)] [sudo]
              ╰─> $ sudo ./wg_clients.sh 
              0
              
              

              Das Skript gibt aber 0 aus.

               #!/usr/bin/env bash
               # lists connected vpn users
               set -euo pipefail
               DATE=$(date +%Y-%m-%d\ %H:%M:%S)
               number=0
               onlineTime=120
               
               for connected in $(wg | grep -B1 -A2 endpoint |grep peer |awk '{print $2}')
               do
                 client=$(grep -B2 $connected /etc/wireguard/wg0.conf|grep -v Peer| grep -v Public)
                 last_handshake=$(wg|grep -A3 $connected|grep latest|awk -F':' '{print $2}' | sed 's/ ago//')
               
                 convertToTime="$(printf '%s' "$last_handshake" | sed 's/ seconds//'| sed 's/ second//' | sed 's/ minutes,/:/' | sed 's/ minute,/:/'| sed 's/ hours,/:/' | sed 's/ hour,/:/' | sed 's/ //g')"
                 duration=$(echo "$convertToTime" | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }')
               
                   if (( duration < onlineTime )); then
                       number=$(expr $number + 1)
                 fi
               
               done
               echo "$number"
              

              D J 2 Replies Last reply Reply Quote 0
              • D
                donut99 @darkiop last edited by

                @darkiop

                Bei mir funktioniert das irgendwie auch nicht. Hab die beiden Skripts manuell von der Konsole gestartet und es gibt immer eine 0 oder [] aus.

                1 Reply Last reply Reply Quote 0
                • J
                  joerg1979 @darkiop last edited by

                  @darkiop

                  Hallo zusammen,

                  bei mir funktioniert es leider auch nicht.

                  Hat es jemand in der Zwischenzeit hinbekommen?

                  ? 1 Reply Last reply Reply Quote 0
                  • ?
                    A Former User @joerg1979 last edited by A Former User

                    @joerg1979 @darkiop @donut99 @Scrounger

                    Die beiden Scripte laufen leider mit der aktuellen Wireguard Version nicht mehr, da die Namen in der wg0.conf nicht mehr ausgegeben werden und auch die Ausgabe selbst geaendert wurde.

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    751
                    Online

                    31.9k
                    Users

                    80.2k
                    Topics

                    1.3m
                    Posts

                    6
                    8
                    1424
                    Loading More Posts
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes
                    Reply
                    • Reply as topic
                    Log in to reply
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                    The ioBroker Community 2014-2023
                    logo