Persönliche Anpassungen der VPN-Konfigurationsdateien

Honk

Member
Ich habe noch nie einen Client benutzt, sondern lasse die configs per script erstellen, wie ich sie brauche.
Da steht dann auch drin:
route-nopull
route-noexec
damit der mir nicht die routing-table verbiegt. Das mach ich lieber selbst.
Hab mir auch ein Skript erstellt, um persönliche Anpassungen vorzunehmen.

pull-filter ignore "dhcp-option DNS6"
pull-filter ignore "route-ipv6"
pull-filter ignore "ifconfig-ipv6"

am Anfang der Konfigurationsdateien, damit ich mich mit VPN einloggen kann, nachdem ich IPv6 mit GRUB_CMDLINE_LINUX="ipv6.disable=1" in der Grub-Datei deaktiviert habe.

mute-replay-warnings habe ich entfernt, da ich gerne sehen möchte, wenn diese Warungen erscheinen. Das ist oft ein Hinweis, dass die Verbindung schlecht ist, was sich oftmals in einer langsamen Geschwindigkeit zeigt. Dieser Eintrag ist vor Jahren still und heimlich hinzugefügt worden, nachdem Kunden sich an diesen Warnungen gestört hatten, frei nach dem Motto "aus den Augen, aus dem Sinn".

auth-nocache habe ich hinzugefügt, weil im Terminal der Hinweis erscheint, dass das Passwort im Cache ein Sicherheitsrisiko sein kann.


Gerne würde ich mehr darüber erfahren, was es mit route-nopull und route-noexec, sowie den Anpassugen der Routing-Tabelle auf sich hat.
 
Wenn ipv6 über GRUB deaktiviert wurde, MÜSSEN die Zeilen eingefügt werden? Ich verstehe noch nicht ganz den Vorteil. IPv6 ist deaktiviert, also kann auch keine ipv6 Verbindung hergestellt werden? Was ist wenn man nur ipv6 über GRUB deaktiviert hat und diese Zeilen aus der Config raus lässt? Also welchen Mehrwert haben die drei Zeilen?
 
@theoth Gerne würde ich mehr darüber erfahren, was es mit route-nopull und route-noexec, sowie den Anpassugen der Routing-Tabelle auf sich hat.
Das steht hier beschrieben (für Version 2.6): https://openvpn.net/community-resources/reference-manual-for-openvpn-2-6/

route-noexec: Don't add or remove routes automatically. Instead pass routes to --route-up script using environmental variables.
route-nopull: When used on the client, this option effectively bars the server from adding routes to the client's routing table, however note that this option still allows the server to set the TCP/IP properties of the client's TUN/TAP interface.

Macht aber erst Sinn, wenn man selbst die routes setzt und auch weiß, wie das genau funktioniert.

Ich starte so einen Tunnel, ohne daß sofort aller traffic durch diesen tunnel geht. Das muß ich dann selbst konfigurieren

Zum routing einfach mal nach linux advanced routing gurgeln.
Ich habe übrigens ipV6 bei mir enabled und auch bei Bedarf (mit NAT) durch den Tunnel geroutet.

Um die unsägliche Syntax von iptables bzw. ip6tables zu vermeiden benutze ich shorewall/shorewall6 als Frontend für meine firewall
Das ist wesentlich einfacher (und sicherer) zu konfigurieren, als iptables selbst und extrem gut dokumentiert.

Shorewall konfiguriert einiges zusätzlich zu den 08/15 iptables Einstellungen, was man zunächst nicht auf dem Schirm hat.
Tom Eastep (verfasser von shorewall) ist eben ein iptables Guru...
 
Würdest du das Skript mit uns teilen? Wäre echt daran interessiert.
klaro..schau mal...

cat vpn_config_update.sh

#!/bin/bash

# Variablen definieren
URL="https://www.perfect-privacy.com/downloads/openvpn/get?system=linux"
DOWNLOAD_DIR="/home/ubuntu/udp"
TEMP_DIR="/home/ubuntu/udp_temp"
ZIP_FILE="vpn_configs.zip"

# E-Mail-Konfiguration
TO_EMAIL="foo@foo.de"
FROM_EMAIL="foo1@foo2.local"
SUBJECT="Neuste VPN Config von perfect-privacy heruntergeladen"

# Sicherstellen, dass die Verzeichnisse existieren
mkdir -p "$DOWNLOAD_DIR"
mkdir -p "$TEMP_DIR"

# Datei herunterladen
wget --content-disposition "$URL" -O "$TEMP_DIR/$ZIP_FILE"

# Entpacken in TEMP_DIR
unzip -o "$TEMP_DIR/$ZIP_FILE" -d "$TEMP_DIR"

# Liste der geänderten Dateien initialisieren
CHANGED_FILES=""

# Vergleich und Kopie der neuen/geänderten Dateien nach DOWNLOAD_DIR
for file in "$TEMP_DIR"/*.conf; do
basefile=$(basename "$file")
dest_file="$DOWNLOAD_DIR/$basefile"

if [ ! -f "$dest_file" ] || ! cmp -s "$file" "$dest_file"; then
cp "$file" "$DOWNLOAD_DIR/"
CHANGED_FILES+="$basefile\n"
fi
done

# Ersetzen von auth-user-pass mit auth-user-pass password.txt in neuen .conf-Dateien
if [ -n "$CHANGED_FILES" ]; then
find "$DOWNLOAD_DIR" -name "*.conf" -type f -exec sed -i 's/auth-user-pass/auth-user-pass password.txt/g' {} \;
fi

# Bereinigung der temporären Dateien
rm -rf "$TEMP_DIR"

# Erfolgreiche Ausführung melden
if [ -n "$CHANGED_FILES" ]; then
echo -e "Folgende VPN-Konfigurationsdateien wurden aktualisiert:\n$CHANGED_FILES" | mail -s "$SUBJECT" -r "$FROM_EMAIL" "$TO_EMAIL"
else
echo "Keine neuen oder geänderten VPN-Konfigurationsdateien gefunden." | mail -s "$SUBJECT" -r "$FROM_EMAIL" "$TO_EMAIL"
fi


und dann habe ich noch folgendes Skript:

cat reload_vpn.sh

#!/bin/bash

# Farben
GREEN="\e[32m"
RED="\e[31m"
YELLOW="\e[33m"
RESET="\e[0m"

# Verzeichnisse
OVPN_DIR="/etc/openvpn"
CONFIG_DIR="/home/ubuntu/udp/"

# Prüfen, ob laufende OpenVPN-Instanzen vorhanden sind und stoppen
function stop_running_instances {
running_instances=$(systemctl list-units --type=service --no-pager --no-legend | awk '{print $1}' | grep '^openvpn@.*\.service$')

if [ -z "$running_instances" ]; then
echo -e "${RED}Keine laufenden OpenVPN-Instanzen gefunden.${RESET}"
else
for instance in $running_instances; do
instance_name=$(echo $instance | cut -d'@' -f2 | cut -d'.' -f1)
conf_file="$OVPN_DIR/$instance_name.conf"

echo -e "${YELLOW}Stopping OpenVPN instance: $instance${RESET}"
sudo systemctl stop "$instance"

if [ -f "$conf_file" ]; then
echo -e "${YELLOW}Moving $conf_file back to $CONFIG_DIR${RESET}"
sudo mv -f "$conf_file" "$CONFIG_DIR"
fi
done
fi

# Sicherstellen, dass alle übrig gebliebenen .conf-Dateien verschoben werden
for conf in "$OVPN_DIR"/*.conf; do
if [ -f "$conf" ]; then
echo -e "${YELLOW}Forcing move of leftover $conf to $CONFIG_DIR${RESET}"
sudo mv -f "$conf" "$CONFIG_DIR"
fi
done
}

# Funktion zum Prüfen, ob eine IP-Adresse anpingbar ist
function is_ip_pingable {
ping -c 1 -W 1 "$1" &> /dev/null
return $?
}

# Hauptfunktion
function main {
# 1. Laufende OpenVPN-Instanzen beenden
stop_running_instances

# 2. Prüfen, welche .conf-Dateien anpingbare IPs enthalten
reachable_configs=()
conf_files=("$CONFIG_DIR"/*.conf)

for conf in "${conf_files[@]}"; do
declare -A checked_ips=()
ping_success=false

while IFS= read -r line; do
if [[ $line == remote* ]]; then
ip=$(echo "$line" | awk '{print $2}')
if [[ -n $ip && -z ${checked_ips[$ip]} ]]; then
if is_ip_pingable "$ip"; then
conf_name=$(basename "$conf")
echo -e "${GREEN}$conf_name has at least one reachable IP!${RESET}"
reachable_configs+=("$conf")
ping_success=true
break
fi
checked_ips[$ip]=1
fi
fi
done < "$conf"

if [ "$ping_success" = false ]; then
conf_name=$(basename "$conf")
echo -e "${RED}No reachable IP found in $conf_name.${RESET}"
fi
done

# 3. Prüfen, ob überhaupt anpingbare Konfigurationen gefunden wurden
if [ ${#reachable_configs[@]} -eq 0 ]; then
echo -e "${RED}Keine anpingbaren .conf-Dateien gefunden.${RESET}"
exit 1
fi

# 4. Hauptschleife zur Serverauswahl
echo "Verfügbare OpenVPN-Konfigurationsdateien (mit erreichbaren IPs):"
select conf in "${reachable_configs[@]##*/}" "Abbrechen"; do
if [ "$conf" == "Abbrechen" ]; then
echo -e "${YELLOW}Abbruch durch den Benutzer.${RESET}"
exit 0
fi

if [ -n "$conf" ]; then
instance=$(basename "$conf" .conf)
echo -e "${YELLOW}Copying $CONFIG_DIR/$instance.conf to $OVPN_DIR${RESET}"
sudo cp "$CONFIG_DIR/$instance.conf" "$OVPN_DIR/$instance.conf"

echo -e "${YELLOW}Starting OpenVPN instance: $instance${RESET}"
sudo systemctl start openvpn@$instance

if systemctl is-active --quiet openvpn@$instance; then
echo -e "${GREEN}OpenVPN instance $instance started successfully!${RESET}"

# Warten vor dem IP-Check
echo -ne "Waiting 10 seconds before checking public IP address: "

for i in {10..1}; do
echo -ne "$i " # Zeigt den Countdown an
sleep 1
done


# Öffentliche IP-Adresse überprüfen
echo "Checking current public IP address..."
ip_check=$(curl -s --max-time 10 https://checkip.perfect-privacy.com/csv)

if [[ -z "$ip_check" ]]; then
echo -e "${RED}Failed to retrieve public IP address. Please check your connection.${RESET}"
echo -e "${YELLOW}Stopping OpenVPN instance: $instance${RESET}"
sudo systemctl stop openvpn@$instance

# .conf-Datei zurück verschieben
echo -e "${YELLOW}Moving $OVPN_DIR/$instance.conf back to $CONFIG_DIR${RESET}"
sudo mv -f "$OVPN_DIR/$instance.conf" "$CONFIG_DIR"

exit 1
fi

# Überprüfen, ob der DNS-Eintrag zu *.perfect-privacy.com gehört
dns=$(echo "$ip_check" | awk -F',' '{print $2}')
if [[ $dns == *".perfect-privacy.com"* ]]; then
echo -e "${GREEN}Public IP check successful!${RESET}"
echo "Current public IP address: $ip_check"
exit 0
else
echo -e "${RED}Public IP check failed. The current server is not suitable.${RESET}"
echo -e "${YELLOW}Stopping OpenVPN instance: $instance${RESET}"
sudo systemctl stop openvpn@$instance

# .conf-Datei zurück verschieben
echo -e "${YELLOW}Moving $OVPN_DIR/$instance.conf back to $CONFIG_DIR${RESET}"
sudo mv -f "$OVPN_DIR/$instance.conf" "$CONFIG_DIR"
fi
else
echo -e "${RED}Failed to start OpenVPN instance $instance.${RESET}"
fi
else
echo -e "${RED}Ungültige Auswahl. Bitte erneut versuchen.${RESET}"
fi
done
}

# Aufruf der Hauptfunktion
main

Wenn ich mal fix über die console den vpn Standort wechseln muss/will. Das Skript zeigt mir in grün an, welche ip aus den .confs erreichbar / nutzar ist :cool:
 
Last edited:
Wow, da hat einer aber echt Mühe gegeben !!!
Wenn eine neue config da ist, bekomme ich eine Mail, was sich geändert hat ;-)
# E-Mail-Konfiguration
TO_EMAIL="foo@foo.de"
FROM_EMAIL="foo1@foo2.local"
SUBJECT="Neuste VPN Config von perfect-privacy heruntergeladen"

Ich überlege, ob man das auch ohne Email lösen kann, z.B. durch ein Popup auf dem Bildschirm oder einer Ausgabe im Terminal.
 
klaro...

cat vpn_config_update_no_mail.sh

#!/bin/bash

# Variablen definieren
URL="https://www.perfect-privacy.com/downloads/openvpn/get?system=linux"
DOWNLOAD_DIR="/home/ubuntu/udp"
TEMP_DIR="/home/ubuntu/udp_temp"
ZIP_FILE="vpn_configs.zip"

# Sicherstellen, dass die Verzeichnisse existieren
mkdir -p "$DOWNLOAD_DIR"
mkdir -p "$TEMP_DIR"

# Datei herunterladen
wget --content-disposition "$URL" -O "$TEMP_DIR/$ZIP_FILE"

# Entpacken in TEMP_DIR
unzip -o "$TEMP_DIR/$ZIP_FILE" -d "$TEMP_DIR"

# Liste der geänderten Dateien initialisieren
CHANGED_FILES=""

# Vergleich und Kopie der neuen/geänderten Dateien nach DOWNLOAD_DIR
for file in "$TEMP_DIR"/*.conf; do
basefile=$(basename "$file")
dest_file="$DOWNLOAD_DIR/$basefile"

if [ ! -f "$dest_file" ] || ! cmp -s "$file" "$dest_file"; then
cp "$file" "$DOWNLOAD_DIR/"
CHANGED_FILES+="$basefile\n"
fi
done

# Ersetzen von auth-user-pass mit auth-user-pass password.txt in neuen .conf-Dateien
if [ -n "$CHANGED_FILES" ]; then
find "$DOWNLOAD_DIR" -name "*.conf" -type f -exec sed -i 's/auth-user-pass/auth-user-pass password.txt/g' {} \;
fi

# Bereinigung der temporären Dateien
rm -rf "$TEMP_DIR"

# Erfolgreiche Ausführung melden
if [ -n "$CHANGED_FILES" ]; then
echo -e "Folgende VPN-Konfigurationsdateien wurden aktualisiert:\n$CHANGED_FILES"
else
echo "Keine neuen oder geänderten VPN-Konfigurationsdateien gefunden."
fi
 
Back
Top