# Experimenta VPN via Tailscale/Headscale **Projektname:** xPortal **Ziel:** Zugang zum Experimenta-Firmennetz von zu Hause — ohne F5 VPN Client. ## Setup - **Router:** GL-MT3000 (GL.iNet Stock-Firmware, OpenWRT-basiert) - **Modus:** Client-Mode im Firmen-WLAN - **Headscale:** hs.noxware.net ## MAC-Adressen (MacBook Pro) | Interface | MAC | Notiz | |-----------|-----|-------| | Ethernet | f8:e4:3b:75:81:8e | Hardware-MAC | | WLAN (privat) | 92:85:65:dd:6c:02 | Private Adresse, statisch — **diese für Spoofing verwenden!** | Die private WLAN-MAC ist die, die Bastian in den letzten Jahren im Firmen-WLAN genutzt hat → Firewall kennt diese. ## MAC-Spoofing auf GL-MT3000 **Config-Datei:** `/etc/config/repeater` ``` option macaddr '92:85:65:dd:6c:02' ``` (Ohne `r,` Prefix — das `r,` bedeutet "randomized") **Nach Änderung:** ```bash /etc/init.d/repeater restart # oder: wifi reload ``` **Getestet:** 2026-02-01 — Heimrouter vergibt korrekt die MacBook-IP (192.168.222.125) an den Router. ## Netzwerk-Konfiguration | Netz | IP-Range | Beschreibung | |------|----------|--------------| | Heimnetz | 192.168.222.0/24 | heimdall (Haupt-Router) | | GL-MT3000 LAN | 192.168.228.0/24 | Router-eigenes LAN (bewusst ungewöhnlich wg. Firmen-Kollision) | **Tailscale advertised routes:** - 192.168.222.0/24 (Heimnetz) - 192.168.228.0/24 (Router-LAN) ## LED-Steuerung ```bash /etc/init.d/gl_led turnoff # LED permanent aus /etc/init.d/gl_led turnon # LED permanent an /etc/init.d/gl_led start # LED-Service starten /etc/init.d/gl_led stop # LED-Service stoppen ``` Die `turnon`/`turnoff` Befehle persistieren über Reboots. ## Routen (aus F5 VPN extrahiert) | Netz | Beschreibung | |------|--------------| | 10.10.0.0/16 | Haupt-Firmennetz | | 10.20.0.0/16 | Weiteres internes Netz | | 172.31.1.0/24 | - | | 172.31.2.1/32 | Einzelhost | | 192.168.1.0/24 | - | | 192.168.2.0/24 | - | | 192.168.4.0/24 | - | | 192.168.5.2/32 | Einzelhost | | 192.168.5.3/32 | Einzelhost | | 192.168.5.5/32 | Einzelhost | | 192.168.5.11/32 | Einzelhost | | 192.168.6.0/24 | - | **DNS-Server:** 10.10.32.1, 10.10.32.2 --- ## Schritt 0: MAC-Adresse spoofen (Firmen-Firewall) Die Firmen-Firewall kennt nur die MAC-Adressen deines MacBooks (WLAN + Ethernet). Der Router muss die WLAN-MAC deines Macs übernehmen. ```bash # Auf dem Mac — WLAN-MAC rausfinden: networksetup -getmacaddress Wi-Fi # oder: ifconfig en0 | grep ether # Auf dem Router — MAC persistent setzen: uci set wireless.@wifi-iface[0].macaddr='XX:XX:XX:XX:XX:XX' uci commit wireless wifi reload ``` **Alternativ via LuCI:** Network → Wireless → Client-Interface → Advanced Settings → *Override MAC address* ⚠️ **Wichtig:** Mac danach nicht mehr direkt ins Firmen-WLAN — nur noch über Tailscale durch den Router! --- ## Schritt 1: GL-MT3000 konfigurieren ```bash # IP Forwarding aktivieren sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf # Tailscale starten mit Routen tailscale up --login-server=https://hs.noxware.net \ --advertise-routes=10.10.0.0/16,10.20.0.0/16,172.31.1.0/24,172.31.2.1/32,192.168.1.0/24,192.168.2.0/24,192.168.4.0/24,192.168.5.2/32,192.168.5.3/32,192.168.5.5/32,192.168.5.11/32,192.168.6.0/24 \ --accept-dns=false ``` ## Schritt 2: Firewall (OpenWRT) ```bash # Zone für Tailscale uci add firewall zone uci set firewall.@zone[-1].name='tailscale' uci set firewall.@zone[-1].input='ACCEPT' uci set firewall.@zone[-1].output='ACCEPT' uci set firewall.@zone[-1].forward='ACCEPT' uci set firewall.@zone[-1].network='tailscale' # Forwarding Tailscale → WAN uci add firewall forwarding uci set firewall.@forwarding[-1].src='tailscale' uci set firewall.@forwarding[-1].dest='wan' uci commit firewall /etc/init.d/firewall restart ``` ## Schritt 3: Headscale — Routen freigeben ```bash headscale routes list headscale routes enable -r ``` ## Schritt 4: Client zu Hause ```bash tailscale up --accept-routes ``` --- ## Hinweise - **Heimnetz:** 192.168.222.0/24 — kollidiert nicht ✅ - **Exit-Node:** Nicht nötig, da nur Split-Tunnel gewünscht - Router muss im Firmen-WLAN eingeloggt sein (Client-Mode) --- ## Headscale Nodes & Users | Node | IP | User | Status | |------|-----|------|--------| | gl-mt3000 | 100.64.0.11 | xportal | online | | air4 | 100.64.0.5 | bam | online | | sp4c3 | 100.64.0.7 | bam | online | | heimdall | 100.64.0.4 | heimdall | online | | docker-intranet | 100.64.0.3 | npm | online | | glkvm-pve | 100.64.0.9 | glkvm-pve | online | ## Headscale ACL-Policy (Entwurf) ```json { "groups": { "group:allow": ["bam@", "heimdall@", "npm@", "glkvm@", "glkvm-pve@"] }, "acls": [ { "action": "accept", "src": ["group:allow"], "dst": ["group:allow:*"] }, { "action": "accept", "src": ["bam@"], "dst": ["xportal@:*"] }, { "action": "accept", "src": ["bam@"], "dst": ["192.168.222.0/24:*", "192.168.228.0/24:*"] }, { "action": "accept", "src": ["xportal@"], "dst": ["xportal@:*"] } ], "ssh": [ { "action": "accept", "src": ["bam@"], "dst": ["*"], "users": ["bam", "root"] } ] } ``` **Wichtig:** Routes müssen explizit in ACL stehen (nicht implizit über xportal@:*) **Kill-Switch:** Routes in Headscale deaktivieren reicht um Tunnel abzuschalten ## Offene Probleme - **Tailscale Login nach Reboot:** GL-MT3000 verliert Login-State - State-File: `/etc/tailscale/tailscaled.state` (korrekt konfiguriert) - `tailscaled --cleanup` im init-script evtl. Ursache? - Noch zu debuggen: State-Datei nach Login prüfen vs. nach Reboot --- *Erstellt: 2026-01-31 | Aktualisiert: 2026-02-03*