Zufälligen Wireguard Server bei jedem Boot ansteuern

Posted by on 11 Jul 2021 | Tagged as: Benutzer

Heute hat jemand im #wireguard Kanal auf dem Libera IRC gefragt, wie man beim Starten des System zu einem zufälligen Wireguard Server verbunden werden kann. Er hat bereits die diversen Konfigurationen im /etc/wireguard Verzeichnis.

Nach kurzem nachdenken bin ich zu folgender Lösung gekommen.

Anstelle dass eine zufällige existierende Konfiguration ausgewählt wird und mit dieser gestartet wird, erscheint es einfach zu sein, dass eine feste Konfiguration besteht und diese dann jeweils überschrieben wird, z.B. /etc/wireguard/boot.conf

Auch könnte es beim Starten zu Racing Problemen führen, wenn dort zufällig ausgewählt werden soll. Deswegen ist es viel einfacher, beim Herunterfahren des Systems diese /etc/wireguard/boot.conf entsprechend zu überschreiben. Das Ausführen eines Skripts beim Herunterfahren des Systems kann mit SystemD einfach bewerkstelligt werden. Dazu braucht es eine Unit File wie die folgende:

[Unit]
Description= Wireguard Randomize Server

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/usr/local/bin/wg_randomizer

[Install]
WantedBy=multi-user.target

Speichere diese Unit Datei in deinem /etc/systemd/system Verzeichnis, bspw. /etc/systemd/system/wg_randomizer.service

Dann erstelle das eigentliche Skript in /usr/local/bin/wg_randomizer mit folgendem Inhalt:

#!/usr/bin/env bash

# This files contains all the names of the configuration files in /etc/wireguard that can be used
loopFile="/etc/wireguard/boot.txt"
# This file will be the wireguard configuration file that is set to be used at boot
bootFile="/etc/wirguard/boot.conf"

# Get a random entry from the loopFile
randomLine=$(shuf -n1 "${loopFile}")

# The randomLine contains the name of the wg config file, so copy it as next default boot
cp "/etc/wirguard/${randomLine}.conf" "${bootFile}"

Das eigentliche Skript ist sehr kurz und einfach zu verstehen. Am Anfang definieren wir zwei Variablen. Einerseits die Datei, welche die möglichen WG Konfigurationen enthält, von denen eine ausgewählt werden soll. Zum anderen die WG Konfigurationsdatei, die beim Boote verwendet wird.

Aus der ersten Datei holen wir einen zufälligen Eintrag und verwenden den Namen dann um die zu bootende Konfigurationsdatei mit dieser zufällig ausgewählten Datei zu überschreiben.

Alternatives Skript (nicht zufällig, sondern der Liste nach)

#!/usr/bin/env bash

loopFile="/etc/wireguard/boot.txt"
bootFile="/etc/wirguard/boot.conf"

# Read the first line of the loop file
read -r firstLine < "${loopFile}"

# First line contains the name of the wg file, so copy it as next default boot
cp "/etc/wirguard/${firstLine}.conf" "${bootFile}"

# Remove first line of file, by copying line 2 (to the end) as same file
tail -n +2 "${loopFile}" > "${loopFile}

# Add first line as last entry
printf '\n%s' "${firstLine}" >> "${loopFile}"

Dieses Skript ist sehr ähnlich zum ersten, aber hier werden die Einträge in der loopFile nicht zufällig ausgewählt, sondern immer der erste Eintrag verwendet. Zuerst liest das Skript die erste Zeile der loopFile Datei aus und überschreibt dann die Standard Boot Konfiguration entsprechend. Danach wird die loopFile mit sich selbst überschrieben, wobei aber die erste Zeile weggelassen wird. Am Schluss wird die (vormalig) erste Zeile am Schluss der loopFile wieder angehängt.

Die Einträge in der loopFile bestehen einfach aus den möglich zu verwendenden Wireguard Konfigurationsdateien ohne .conf Endung mit einem Eintrag pro Zeile.

Am Schluss das Skript noch ausführbar machen chmod 0755 /usr/local/bin/wg_randomizer und dann eine bestehende Wireguard Konfigurationsdatei zu /etc/wireguard/boot.conf kopieren und die erstellte Unit File aktivieren systemctl enable wg_randomizer.service

Comments are closed.