Skip to content

fix(network): Server auch bei aktivem Tunnel erreichbar; GateDrop mit mehreren Bildern - #185

Merged
CallMeTechie merged 2 commits into
mainfrom
fix/dns-fallback-gatedrop
Nov 4, 2026
Merged

CallMeTechie merged 2 commits into
mainfrom
fix/dns-fallback-gatedrop

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

Worum es geht

Aus dem App-Log (04.11., ~10:50–11:45): Dutzende UnknownHostException: DNS lookup failed for … (system DNS returned only VPN-internal addresses, no cache) und Connect-Timeouts von der Tunnel-Adresse 10.8.0.6 zur öffentlichen Server-IP. Dazu: Bilder per GateDrop an „FEC Laptop“ – sie kamen an, aber die App zeigte gar nichts, und der Verlauf („Geteilt“) war nicht zu finden.

1. Server bei aktivem Tunnel erreichbar (core/network)

Ursache: Der Server beantwortet seinen eigenen Namen im Tunnel absichtlich mit der Gateway-Adresse (dnsmasq host-record=<API-Host>,10.8.0.1, Split-Horizon, siehe entrypoint.sh des Servers): API-Verkehr eines getunnelten Clients soll über wg0 zu Caddy gehen. Die App selbst geht durch den Tunnel, wenn sie nicht per Split-Tunnel ausgenommen ist (WireGuard excludeApplications/includeApplications, es gibt keine automatische Ausnahme für GateControl). vpnSafeDns verwarf die VPN-Adresse trotzdem immer:

  • ohne Cache (Neustart der App bei aktivem Tunnel, Always-on mit Sperre, Vor-Auflösung bei schon laufendem Tunnel) → jeder API-Aufruf UnknownHostException;
  • mit Cache → Verbindung zur öffentlichen IP durch den Tunnel → Timeouts/ECONNABORTED von 10.8.0.6 (im Log).

Fix: VpnSafeDns (rein, getestet) entscheidet nach dem tatsächlichen Weg des eigenen Verkehrs:

  • Standardnetz der App ist ein VPN (TRANSPORT_VPN) → VPN-Adresse zuerst, bekannte öffentliche Adressen dahinter (OkHttp Fast-Fallback probiert beide);
  • App ausgenommen / kein Tunnel → VPN-Adresse verworfen; Auflösung über ein Netz außerhalb des VPN (Network.getAllByName, validierte Netze zuerst), dann Adressen dieses Laufs, dann die dauerhaft gespeicherten zuletzt bekannten öffentlichen Adressen (SharedPreferences, nur IP-Literale).
  • clearDnsCache() beim Trennen vergisst nur den Lauf; die zuletzt bekannte Adresse bleibt als letzter Ausweg.

2. Connect-Timeouts / NAT64

OkHttp 5.5.1 mit Fast-Fallback (Happy Eyeballs) ist aktiv – im Log laufen IPv6 (64:ff9b::…) und IPv4 (192.0.0.4, CLAT) parallel (Suppressed). Beide Wege laufen über NAT64 des Mobilfunknetzes und scheiterten gleichzeitig nach 15 s; die Timeouts von 192.168.27.19 (WLAN) ebenso – der Server war von dort zeitweise nicht erreichbar. Kein App-Fehler, 15 s Connect-Timeout angemessen, daher unverändert.

3. GateDrop: Rückmeldung beim Senden und auffindbarer Verlauf

  • Keine Rückmeldung: Beim Senden an Geräte/Personen (ohne Link) schloss sich das Blatt sofort mit einem kurzen Toast; danach gab es nur Mitteilungen (ohne Mitteilungsberechtigung: nichts; „Gesendet“ leise im Kanal geringer Wichtigkeit, nach 20 s weg). Jetzt bleibt das Blatt offen und zeigt Fortschritt („Wird gesendet … n %“, „An FEC Laptop“), dann „Gesendet – An …“ oder den Fehler. Schließen geht jederzeit, das Senden läuft im Worker weiter.
  • Stilles Warten: War der Server nicht erreichbar (z. B. durch Punkt 1), wartete der Worker mit exponentiellem Backoff bis zu Stunden ohne jede Anzeige. Jetzt: Zustand Retrying im Blatt und Mitteilung „Noch nicht gesendet – GateControl versucht es von selbst erneut“ (wird durch „Gesendet“/„Nicht gesendet“ ersetzt).
  • Nicht lesbare geteilte Dateien werden genannt statt still ausgelassen.
  • Verlauf: Die Ansicht „Geteilt“ (Empfangen / Gesendet / Links) gab es, aber nur unter Einstellungen › „Teilen“ › „Geteilt“ – ohne das Wort GateDrop. Jetzt: Gruppe heißt „GateDrop“, und das Teilen-Blatt hat „Gesendet und Empfangen ansehen“ (auch nach dem Senden und im Fehlerfall).

Plugin-seitig (nur beschrieben, nicht geändert)

  • targets.devices listet jede App-Installation (gc.devices.list), unabhängig davon, ob deren Client GateDrop kann; eine Zustellung über den Server wird bei online-Geräten als delivered markiert, auch wenn der Client sie nie abholt.
  • transfers/<id>/result: Meldet der Empfänger ok bevor alle Teile eines Mehrdatei-Push angekommen sind und scheitert danach der Sender, gibt es keinen Ausweichweg mehr (Lieferung schon delivered). Hängt am Windows-Empfänger (meldet er erst nach allen Teilen?).

Tests

  • VpnSafeDnsTest (13 Fälle: getunnelt/ausgenommen, Neustart ohne Cache, Auflösung außerhalb des VPN, gespeicherte Adresse, gemischte Antworten, Fehler der Netzabfrage, Literal-Speicherung)
  • lokal: :core:network:testDebugUnitTest, :app:testDebugUnitTest (1640 Tests grün), :app:lintRelease

Generated by Claude Code

Claude added 2 commits November 4, 2026 11:03
… mehreren Bildern

DNS des Servers (ApiClientProvider → neu VpnSafeDns):
- Der Resolver im Tunnel (dnsmasq auf dem Gateway) beantwortet den
  Servernamen absichtlich mit der VPN-Adresse (Split-Horizon). Läuft die
  App selbst durch den Tunnel (keine Split-Tunnel-Ausnahme für
  GateControl), ist das der richtige Weg: die Adresse wird jetzt genutzt,
  bekannte öffentliche Adressen folgen als Ausweichweg. Bisher wurde sie
  verworfen – ohne Cache (z. B. nach einem Neustart der App bei aktivem
  Tunnel) schlug jeder API-Aufruf mit UnknownHostException fehl, mit
  Cache ging der Aufruf an die öffentliche Adresse durch den Tunnel und
  lief in Timeouts.
- Ist die App vom Tunnel ausgenommen, wird eine VPN-Adresse weiter
  verworfen; dann wird der Name über ein Netz außerhalb des VPN aufgelöst
  (Network.getAllByName), danach aus den Adressen dieses Laufs und zuletzt
  aus den zuletzt bekannten öffentlichen Adressen, die jetzt dauerhaft
  gespeichert werden.
- Ob die App durch den Tunnel geht, entscheidet ihr eigenes Standardnetz
  (TRANSPORT_VPN), nicht eine Annahme über die Split-Tunnel-Einstellung.
- Unit-Tests für die Regeln.

GateDrop (Teilen-Blatt):
- Das Blatt schließt sich beim Senden an Geräte nicht mehr sofort mit
  einem Toast, sondern zeigt den Fortschritt, „Gesendet – An …“ oder den
  Fehler; Schließen ist jederzeit möglich, das Senden läuft weiter.
- Ist der Server nicht erreichbar, sagt das Blatt und eine Mitteilung
  „Noch nicht gesendet – GateControl versucht es von selbst erneut“
  (bisher bis zu Stunden ohne jede Rückmeldung).
- Nicht lesbare geteilte Dateien werden genannt statt still ausgelassen.
- „Gesendet und Empfangen ansehen“ im Blatt öffnet Einstellungen ›
  Geteilt; die Gruppe dort heißt jetzt „GateDrop“.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
VpnSafeDns fragt das Standardnetz der App und die Netze außerhalb des VPN
ab (ConnectivityManager); Lint verlangt die Berechtigung im Modul selbst.
Die App deklarierte sie schon, am Verhalten ändert sich nichts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
@CallMeTechie
CallMeTechie merged commit 440e4a1 into main Nov 4, 2026
5 checks passed
CallMeTechie pushed a commit that referenced this pull request Nov 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants