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 --cleanupim init-script evtl. Ursache?- Noch zu debuggen: State-Datei nach Login prüfen vs. nach Reboot
- State-File:
Erstellt: 2026-01-31 | Aktualisiert: 2026-02-03