NEWS
Linux-Control: Wireguard VPN Clients in VIS anzeigen
-
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 geschriebenwireguard_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 mussZahl
sein z.B.: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: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:Evtl. kann es ja der ein oder andere gebrauchen oder hat Verbesserungsvorschläge.
-
Super Danke. So etwas habe ich gesucht.
-
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
-
@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
-
@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.
-
Bei mir funktioniert das irgendwie auch nicht. Hab die beiden Skripts manuell von der Konsole gestartet und es gibt immer eine 0 oder [] aus.
-
Hallo zusammen,
bei mir funktioniert es leider auch nicht.
Hat es jemand in der Zwischenzeit hinbekommen?
-
@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.