Zufälligen Wireguard Server bei jedem Boot ansteuern
Posted by hyper_ch 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
No Comments »