---
title: "WoW Forever Beta: VPN Split-Tunnel Setup (Linux)"
summary: >
  Anleitung, um ausschliesslich Battle.net/WoW ueber einen kostenlosen
  ProtonVPN-US-Server zu routen (Linux Network Namespace + WireGuard),
  waehrend der Rest des Systems auf der normalen Verbindung bleibt.
platform: "Linux (Arch-basiert, z.B. CachyOS) + Steam (Battle.net als Nicht-Steam-Spiel)"
result: "Ping EU->US Beta-Server: ca. 600-800ms vorher -> ca. 150-200ms mit Tunnel"
scope: "Nur der Prozessbaum von Battle.net/WoW wird getunnelt. Browser, Streaming, alles andere bleibt unveraendert auf der echten IP/Verbindung."
tags: [linux, wireguard, network-namespace, split-tunneling, steam, proton, protonvpn, wow, gaming]
---

# WoW Forever Beta: VPN Split-Tunnel Setup (Linux)

## Kontext / Problem

WoW Forever (Beta) laeuft aktuell ausschliesslich auf US-Servern. Fuer
Spieler aus Europa bedeutet das typischerweise 600-800ms Ping statt
spielbarer 100-200ms. Ein normales, systemweites VPN wuerde das Ping-Problem
loesen, haette aber den Nachteil, dass dann der GESAMTE Rechner (Browser,
Downloads, Streaming) ueber die langsamere US-Route laeuft.

## Loesung: Split-Tunneling ueber eine Linux Network Namespace

Statt eines systemweiten VPNs oder der (unzuverlaessigen) Split-Tunneling-
Funktion mancher VPN-Client-GUIs wird eine eigene, isolierte
**Netzwerk-Namespace** (`ip netns`) angelegt. Darin laeuft ein
WireGuard-Interface, das zu einem ProtonVPN-US-Server tunnelt. Nur der
Prozessbaum von Battle.net/WoW wird in diese Namespace gestartet - der Rest
des Systems bleibt in der normalen (Host-)Namespace und somit unveraendert
auf der echten IP/Verbindung.

Vorteile gegenueber "VPN-Client mit Split-Tunneling-Checkbox":

- Isolation auf Kernel-Ebene (eigener Netzwerk-Stack), nicht nur
  Routing-Regeln innerhalb eines gemeinsamen Stacks
- Funktioniert unabhaengig vom verwendeten VPN-Provider, solange eine
  WireGuard-Config vorliegt
- Keine Abhaengigkeit von einer laufenden VPN-Client-GUI/einem
  Hintergrunddienst

## Voraussetzungen

- Arch-basierte Linux-Distribution (CachyOS, Arch, Manjaro, ...). Bei
  Debian/Ubuntu `pacman -S --needed --noconfirm <pkg>` durch
  `apt install -y <pkg>` ersetzen, bei Fedora durch `dnf install -y <pkg>`.
- Steam mit Battle.net bereits als "Nicht-Steam-Spiel" eingerichtet und ohne
  VPN lauffaehig getestet (Proton-Version ausgewaehlt, Spiel startet normal).
- Root-Rechte (`sudo`).
- Ein kostenloses ProtonVPN-Konto (kein Bezahl-Abo noetig - der Gratis-Tarif
  beinhaltet einen US-Standort und hat kein Datenlimit).

## Schritt 1: ProtonVPN-Konto und WireGuard-Config erstellen

1. Kostenloses Konto anlegen: <https://protonvpn.com>
2. Im Account-Dashboard zu Downloads: <https://account.protonvpn.com/downloads>
3. Zum Abschnitt "WireGuard-Konfiguration" scrollen
4. Namen vergeben (z.B. `WoWBeta`), Plattform **GNU/Linux** waehlen
5. Bei "Oder waehle einen bestimmten Server aus" -> **Kostenlose
   Server-Konfigurationen** -> Abschnitt **USA** aufklappen (die Liste ist
   alphabetisch/nach Laendern sortiert, USA kommt z.B. nach Japan,
   Niederlande, Norwegen)
6. Einen `US-FREE#`-Server mit **niedriger Auslastung** waehlen (in der
   ProtonVPN-UI durch niedrigen Prozentwert bzw. gruenes Status-Icon
   erkennbar), auf **Erstellen** klicken
7. Im folgenden Dialog auf **Herunterladen** klicken - die `.conf`-Datei
   landet im Download-Ordner (z.B. `~/Downloads/WoWBeta-US-FREE-41.conf`)

Der genaue Dateiname und Serverstandort variiert je nach Auswahl. In den
folgenden Schritten den Platzhalter `WoWBeta-US-FREE-41.conf` durch den
tatsaechlichen Dateinamen ersetzen.

Beispielhafter Aufbau der heruntergeladenen Config (Werte sind pro Nutzer/
Server unterschiedlich):

```ini
[Interface]
PrivateKey = <base64-key>
Address = 10.2.0.2/32, 2a07:b944::2:2/128
DNS = 10.2.0.1, 2a07:b944::2:1

[Peer]
PublicKey = <base64-key>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <ip>:51820
PersistentKeepalive = 25
```

## Schritt 2: Netzwerk-Namespace mit WireGuard einrichten

Dieses Skript:

1. installiert `wireguard-tools`, falls nicht vorhanden
2. legt eine Netzwerk-Namespace namens `wowvpn` an
3. erstellt darin ein WireGuard-Interface `wg0` und konfiguriert es anhand
   der heruntergeladenen `.conf`-Datei
4. setzt den Default-Route innerhalb der Namespace auf das WireGuard-Interface
5. setzt einen eigenen DNS-Resolver fuer die Namespace (`/etc/netns/wowvpn/resolv.conf`)
6. traegt eine eng begrenzte `sudoers`-Regel ein, die AUSSCHLIESSLICH
   `ip netns exec wowvpn <...>` ohne Passwort erlaubt (inkl. `SETENV`, siehe
   Troubleshooting) - kein pauschaler Root-Zugriff fuer den Nutzer

Wichtiger technischer Hinweis: `wg-quick strip <datei>` verlangt zwingend
einen Dateinamen im Format `<interface-name>.conf` (z.B. `wg0.conf`).
ProtonVPN-Downloads heissen aber z.B. `WoWBeta-US-FREE-41.conf`, was
`wg-quick strip` mit dem Fehler
`The config file must be a valid interface name, followed by .conf`
ablehnt. Das Skript unten umgeht das, indem es die Zeilen `Address=` und
`DNS=` (die `wg setconf` nicht versteht, `wg-quick` aber schon) selbst per
`grep` herausfiltert, statt `wg-quick strip` aufzurufen.

Vor dem Speichern in `WG_CONF=` und `REAL_USER=` die eigenen Werte eintragen:

```bash
#!/usr/bin/env bash
# Richtet eine isolierte Netzwerk-Namespace "wowvpn" ein, in der nur WireGuard-Traffic
# zum ProtonVPN-US-Server laeuft. Alles andere auf dem System bleibt unberuehrt.
set -euo pipefail

if [[ $EUID -ne 0 ]]; then
  echo "Bitte mit sudo ausfuehren: sudo $0" >&2
  exit 1
fi

NETNS="wowvpn"
WG_IF="wg0"
WG_CONF="/home/DEINUSER/Downloads/WoWBeta-US-FREE-41.conf"   # <- anpassen!
REAL_USER="DEINUSER"                                          # <- anpassen!

if [[ ! -f "$WG_CONF" ]]; then
  echo "Config nicht gefunden: $WG_CONF" >&2
  exit 1
fi

echo "==> wireguard-tools installieren (falls noetig)"
pacman -S --needed --noconfirm wireguard-tools

echo "==> Alte Namespace/Interface entfernen, falls vorhanden (sauberer Neuaufbau)"
ip netns exec "$NETNS" ip link del "$WG_IF" 2>/dev/null || true
ip netns del "$NETNS" 2>/dev/null || true

echo "==> Namespace anlegen"
ip netns add "$NETNS"
ip netns exec "$NETNS" ip link set lo up

echo "==> WireGuard-Interface anlegen und in die Namespace verschieben"
ip link add "$WG_IF" type wireguard
ip link set "$WG_IF" netns "$NETNS"

ADDR=$(grep -m1 '^Address' "$WG_CONF" | sed -E 's/Address\s*=\s*//' | cut -d, -f1)
DNS=$(grep -m1 '^DNS' "$WG_CONF" | sed -E 's/DNS\s*=\s*//' | cut -d, -f1)

echo "==> Adresse setzen: $ADDR"
ip netns exec "$NETNS" ip addr add "$ADDR" dev "$WG_IF"

echo "==> WireGuard konfigurieren"
# Nicht wg-quick strip verwenden: das verlangt einen Dateinamen wie <interface>.conf
WG_STRIPPED=$(mktemp)
grep -vE '^\s*(Address|DNS)\s*=' "$WG_CONF" | grep -vE '^\s*#' > "$WG_STRIPPED"
ip netns exec "$NETNS" wg setconf "$WG_IF" "$WG_STRIPPED"
rm -f "$WG_STRIPPED"

ip netns exec "$NETNS" ip link set "$WG_IF" up
ip netns exec "$NETNS" ip route add default dev "$WG_IF"

echo "==> DNS fuer die Namespace setzen"
mkdir -p "/etc/netns/$NETNS"
echo "nameserver $DNS" > "/etc/netns/$NETNS/resolv.conf"

echo "==> Sudo-Regel eintragen (NUR fuer 'ip netns exec wowvpn', SETENV fuer -E/--preserve-env)"
cat > /etc/sudoers.d/99-wowvpn-netns <<EOF
${REAL_USER} ALL=(root) NOPASSWD:SETENV: /usr/bin/ip netns exec ${NETNS} *
EOF
chmod 440 /etc/sudoers.d/99-wowvpn-netns
visudo -c -f /etc/sudoers.d/99-wowvpn-netns

echo
echo "Fertig. Test (sollte eine US-IP zeigen):"
echo "  sudo ip netns exec $NETNS sudo -u $REAL_USER curl -s ifconfig.me"
```

Speichern als `setup-wow-vpn-netns.sh`, dann ausfuehren:

```bash
sudo bash setup-wow-vpn-netns.sh
```

Das Skript ist idempotent (loescht/baut Namespace und Interface bei jedem
Lauf sauber neu auf) - mehrfaches Ausfuehren, z.B. nach Config-Aenderungen,
ist unproblematisch.

## Schritt 3: Launcher-Wrapper fuer Steam

Dieser Wrapper sorgt dafuer, dass der eigentliche Battle.net-Start
innerhalb der `wowvpn`-Namespace passiert, statt in der normalen
Host-Namespace.

**Kritischer Punkt:** `sudo` setzt beim Wechsel des Zielnutzers
standardmaessig die Umgebungsvariablen zurueck (Sicherheitsfeature). Steam
setzt vor dem Start diverse `STEAM_COMPAT_*`-Variablen (u.a.
`STEAM_COMPAT_DATA_PATH`), die Proton zwingend braucht, um zu wissen,
welchen Prefix/welche App gestartet wird. Gehen diese verloren, bricht
Proton lautlos mit `Proton: No compat data path?` ab - kein Fenster, kein
sichtbarer Fehler in der Steam-UI. Deshalb ist `-E` (bzw. `--preserve-env`)
auf **beiden** `sudo`-Aufrufebenen zwingend notwendig, zusammen mit dem
`SETENV`-Tag in der sudoers-Regel aus Schritt 2.

```bash
#!/usr/bin/env bash
# Wrapper fuer Steam-Startoptionen: fuehrt den eigentlichen Battle.net/WoW-Start
# innerhalb der isolierten "wowvpn"-Netzwerk-Namespace aus (nur dieser Prozessbaum
# geht durchs VPN, der Rest des Systems bleibt auf der normalen Verbindung).
exec sudo -E ip netns exec wowvpn sudo -E -u DEINUSER -- "$@"
```

`DEINUSER` durch den eigenen Linux-Benutzernamen ersetzen, speichern als
`~/wow-vpn-launch.sh`, dann ausfuehrbar machen:

```bash
chmod +x ~/wow-vpn-launch.sh
```

## Schritt 4: Steam-Startoptionen setzen

1. In Steam: Rechtsklick auf Battle.net -> **Eigenschaften**
2. Feld **Startoptionen**:

```text
/home/DEINUSER/wow-vpn-launch.sh %command%
```

3. Eigenschaften-Fenster schliessen. Battle.net ganz normal ueber
   **Spielen** starten - Steam ersetzt `%command%` automatisch durch den
   eigentlichen Proton-Startbefehl, der Wrapper greift ohne weiteres
   Zutun.

## Verifizieren

Ob der Tunnel steht (erwartete Ausgabe: eine ProtonVPN-Exit-IP, z.B. im
Bereich `37.19.221.x`, NICHT die eigene echte IP):

```bash
sudo ip netns exec wowvpn sudo -u DEINUSER curl -s ifconfig.me
```

WireGuard-Handshake-Status (erwartete Ausgabe: `latest handshake: <n>
seconds/minutes ago`, niemals `never`):

```bash
sudo ip netns exec wowvpn wg show
```

Ob Battle.net/WoW tatsaechlich in der isolierten Namespace laufen, waehrend
das Spiel laeuft:

```bash
pgrep -f "Battle.net.exe|WowB.exe" | xargs -I{} readlink /proc/{}/ns/net
```

Der zurueckgegebene Namespace-Identifier (Format `net:[<inode>]`) muss sich
vom Host-Namespace unterscheiden:

```bash
readlink /proc/1/ns/net
```

Kontrolle, dass NICHTS anderes betroffen ist: parallel, in einem normalen
(nicht-netns) Terminal:

```bash
curl -s ifconfig.me
```

sollte weiterhin die echte, unveraenderte IP-Adresse liefern.

## Troubleshooting

| Symptom | Ursache | Fix |
|---|---|---|
| `wg-quick: The config file must be a valid interface name, followed by .conf` | `wg-quick strip` verlangt einen Dateinamen wie `wg0.conf`; ProtonVPN liefert z.B. `WoWBeta-US-FREE-41.conf` | Das Setup-Skript in Schritt 2 verwendet bereits einen eigenen `grep`-Filter statt `wg-quick strip` - kein weiterer Handlungsbedarf, wenn das Original-Skript unveraendert genutzt wird |
| Battle.net startet mit gesetzter Startoption gar nicht (kein Fenster, kein sichtbarer Fehler) | `sudo -u <user>` loescht standardmaessig die Umgebung; `STEAM_COMPAT_*`-Variablen von Steam gehen verloren; Proton bricht mit `No compat data path?` lautlos ab | Sicherstellen, dass der Wrapper `-E`/`--preserve-env` auf BEIDEN `sudo`-Ebenen nutzt UND die sudoers-Regel das `SETENV`-Tag traegt (`NOPASSWD:SETENV:`, nicht nur `NOPASSWD:`) |
| `sudo ip netns exec ...` fragt interaktiv nach einem Passwort | sudoers-Regel fehlt, ist falsch, oder das `SETENV`-Tag fehlt | `visudo -c -f /etc/sudoers.d/99-wowvpn-netns` zur Syntaxpruefung; im Zweifel Setup-Skript aus Schritt 2 erneut mit `sudo bash ...` ausfuehren (idempotent, schreibt die Regel neu) |
| Ping bleibt trotz aktivem Tunnel hoch | Der gewaehlte `US-FREE#`-Server ist stark ausgelastet/ueberlastet | Im ProtonVPN-Dashboard einen anderen `US-FREE#`-Server mit niedrigerer Auslastung waehlen, neue `.conf` herunterladen, Schritt 1 + 2 mit der neuen Datei wiederholen |
| Nach einem Neustart des Rechners funktioniert nichts mehr (kein Tunnel, `ip netns exec wowvpn` findet die Namespace nicht) | Linux Network Namespaces sind standardmaessig NICHT persistent ueber Reboots hinweg | Nach jedem Neustart das Setup-Skript aus Schritt 2 einmal erneut mit `sudo bash setup-wow-vpn-netns.sh` ausfuehren |

## Kurzreferenz (fuer wiederholte Nutzung nach einmaliger Einrichtung)

Nach einem Neustart, bevor WoW gespielt wird:

```bash
sudo bash setup-wow-vpn-netns.sh
```

Danach Battle.net normal ueber Steam "Spielen" starten - Startoptionen und
Wrapper-Skript muessen nur einmalig eingerichtet werden und bleiben
bestehen.
