Files
clawdbot/memory/experimenta-tailscale-vpn-tunnel.md

5.5 KiB

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:

/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

/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.

# 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

# 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)

# 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

headscale routes list
headscale routes enable -r <ROUTE_ID>

Schritt 4: Client zu Hause

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)

{
  "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