#!/bin/bash # ============================================================ # wstunnel Client - WireGuard over WebSocket # Anpassen: PROXY_SERVER = Domainname eures wstunnel-Servers # ============================================================ PROXY_SERVER="vpn.example.com" # Lokaler UDP Port fuer WireGuard (muss mit WG Endpoint uebereinstimmen) LOCAL_WG_PORT=51820 # Remote WireGuard Port auf dem Server REMOTE_WG_PORT=51820 # wstunnel Binary (im selben Ordner oder im PATH) WSTUNNEL_DIR="$(cd "$(dirname "$0")" && pwd)" WSTUNNEL="$WSTUNNEL_DIR/wstunnel" # GitHub API GITHUB_API="https://api.github.com/repos/erebe/wstunnel/releases/latest" # ============================================================ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' echo "" echo -e "${GREEN} ############################################${NC}" echo -e "${GREEN} wstunnel WireGuard Proxy${NC}" echo -e "${GREEN} ############################################${NC}" echo "" echo -e " Server : ${YELLOW}${PROXY_SERVER}${NC}" echo -e " Tunnel : UDP localhost:${LOCAL_WG_PORT} --> ${PROXY_SERVER}:${REMOTE_WG_PORT}" echo "" # --- Architektur erkennen --- detect_arch() { local arch arch=$(uname -m) case "$arch" in x86_64) echo "amd64" ;; aarch64) echo "arm64" ;; armv7*) echo "armv7" ;; armv6*) echo "armv6" ;; *) echo -e "${RED} [FEHLER] Unbekannte Architektur: $arch${NC}" >&2 exit 1 ;; esac } # --- Download-Funktion --- download_wstunnel() { echo -e " ${YELLOW}[!] wstunnel nicht gefunden.${NC}" echo -e " ${CYAN}[*] Ermittle aktuelle Version von GitHub...${NC}" # curl oder wget verfuegbar? if command -v curl &>/dev/null; then DOWNLOADER="curl" elif command -v wget &>/dev/null; then DOWNLOADER="wget" else echo -e " ${RED}[FEHLER] Weder curl noch wget gefunden!${NC}" exit 1 fi # Aktuelle Version per GitHub API ermitteln if [ "$DOWNLOADER" = "curl" ]; then VERSION=$(curl -fsSL "$GITHUB_API" | grep '"tag_name"' | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/') else VERSION=$(wget -qO- "$GITHUB_API" | grep '"tag_name"' | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/') fi if [ -z "$VERSION" ]; then echo -e " ${RED}[FEHLER] Konnte Version nicht ermitteln. Internetverbindung pruefen.${NC}" exit 1 fi echo -e " ${GREEN}[OK] Aktuelle Version: ${VERSION}${NC}" # Versionsnummer ohne fuehrendes "v" VERNUM="${VERSION#v}" ARCH=$(detect_arch) TARBALL="wstunnel_${VERNUM}_linux_${ARCH}.tar.gz" DOWNLOAD_URL="https://github.com/erebe/wstunnel/releases/download/${VERSION}/${TARBALL}" TMP_FILE="/tmp/${TARBALL}" echo -e " ${CYAN}[*] Lade herunter: ${DOWNLOAD_URL}${NC}" if [ "$DOWNLOADER" = "curl" ]; then curl -fL --progress-bar -o "$TMP_FILE" "$DOWNLOAD_URL" else wget --show-progress -q -O "$TMP_FILE" "$DOWNLOAD_URL" fi if [ ! -f "$TMP_FILE" ]; then echo -e " ${RED}[FEHLER] Download fehlgeschlagen!${NC}" echo " Bitte manuell herunterladen: $DOWNLOAD_URL" exit 1 fi echo -e " ${CYAN}[*] Entpacke...${NC}" tar -xzf "$TMP_FILE" -C "$WSTUNNEL_DIR" wstunnel 2>/dev/null || \ tar -xzf "$TMP_FILE" -C "$WSTUNNEL_DIR" 2>/dev/null rm -f "$TMP_FILE" chmod +x "$WSTUNNEL" if [ ! -f "$WSTUNNEL" ]; then echo -e " ${RED}[FEHLER] wstunnel nach dem Entpacken nicht gefunden!${NC}" exit 1 fi echo -e " ${GREEN}[OK] wstunnel erfolgreich installiert (${VERSION}).${NC}" echo "" } # --- Pruefen ob wstunnel vorhanden, sonst herunterladen --- if [ ! -f "$WSTUNNEL" ] && ! command -v wstunnel &>/dev/null; then download_wstunnel elif command -v wstunnel &>/dev/null && [ ! -f "$WSTUNNEL" ]; then WSTUNNEL="wstunnel" fi echo -e " ${YELLOW}Bitte WireGuard Endpoint auf 127.0.0.1:${LOCAL_WG_PORT} setzen!${NC}" echo " Skript laufen lassen solange VPN aktiv ist." echo "" # Sauber beenden bei Strg+C trap 'echo -e "\n${YELLOW} Tunnel beendet.${NC}"; exit 0' SIGINT SIGTERM echo -e "${GREEN} Starte Tunnel...${NC}" echo "" "$WSTUNNEL" client \ -L "udp://${LOCAL_WG_PORT}:127.0.0.1:${REMOTE_WG_PORT}?timeout_sec=0" \ "wss://${PROXY_SERVER}:443" echo "" echo -e "${YELLOW} wstunnel beendet.${NC}"