So passt du die DNS-Auflösung unter iOS an – ganz wie beim Bearbeiten der Hosts-Datei

So passt du die DNS-Auflösung unter iOS an – ganz wie beim Bearbeiten der Hosts-Datei

Ich wurde bei einem früheren Job von DNS-Auflösungsproblemen geplagt. Unser Projekt verwendete dieselbe Domain für die Produktiv- und die Testumgebung. Um den Traffic der App in die Testumgebung zu leiten, mussten wir die Domain-Auflösung ändern. Am Desktop ist das simpel – einfach die System-hosts-Datei anpassen und fertig. Doch auf iOS ist das direkte Bearbeiten von hosts aufgrund von Sandboxing und Sicherheitsbeschränkungen nicht möglich.

Damals behalfen wir uns, indem wir den WLAN-DNS-Server auf einen eigenen DNS-Server umstellten. Dabei tauchten immer wieder diese Probleme auf:

  1. DNS-Caching: Nach jeder Änderung musste der Cache geleert und die App neu gestartet werden.
  2. Wegen des Cachings ließ sich nur anhand der API-Antworten erkennen, ob die neue DNS-Auflösung tatsächlich aktiv war.
  3. Jedes Mal den WLAN-DNS-Server umzustellen, ist umständlich.
  4. Die DNS-Änderung kann die normale Nutzung anderer Apps auf dem Smartphone beeinträchtigen.

Um diese Probleme zu lösen, haben wir eine DNS-Spoofing-Funktion in ApiCatcher eingebaut: „DNS-Mapping“. Damit lässt sich unter iOS quasi eine "benutzerdefinierte Hosts-Datei" umsetzen – bestimmte Domains werden auf selbst gewählte IPs umgeleitet.

So funktioniert DNS-Mapping

Wenn die hosts-Datei von iOS nicht verändert werden kann – wie schafft ApiCatcher es dann, das Auflösungsergebnis einer Domain zu ändern?

Die Magie passiert während der TCP-Verbindungsaufbau-Phase auf der Proxy-Ebene durch Interception und Umleitung:

  1. Traffic-Übernahme: Sobald die Paketerfassung in ApiCatcher läuft, fließen alle HTTP/HTTPS-Anfragen der Apps über einen lokalen VPN-Tunnel und passieren den lokalen Proxy-Server von ApiCatcher.
  2. Host-Interception auf Proxy-Ebene: Wenn eine App versucht, eine Verbindung zur Zieldomain (z.B. echo.apicatcher.net) aufzubauen, prüft der Proxy-Server vor dem eigentlichen TCP-Verbindungsaufbau zuerst die lokalen DNS-Mapping-Regeln.
  3. Austausch der physischen IP: Bei einem Treffer umgeht der Proxy-Server die öffentliche DNS-Auflösung komplett und baut die TCP-Verbindung direkt zur von dir angegebenen IP-Adresse auf.
  4. Transparent für den TLS-Handshake: Da die IP nur auf der TCP-Verbindungsebene ausgetauscht wird, bleiben der Host-Header des HTTP-Pakets und die SNI-Information (Server Name Indication) des TLS-Handshakes unverändert. Dadurch läuft die Zertifikatsvalidierung auf Client-Seite auch bei striktem HTTPS-Handshake normal durch – für die App völlig transparent und nahtlos.

So richtest du es ein

  1. Öffne die ApiCatcher-App, tippe oben auf der Startseite auf den 「+」-Button und wähle im Popup-Menü DNS-Mapping, um zur „DNS-Mapping“-Konfigurationsseite zu gelangen.

  2. Tippe rechts oben auf den 「+」-Button, um eine neue Regel zu erstellen:

    • Domain: Gib die zu mappende Domain ein. Platzhalter werden unterstützt (z.B. *.apicatcher.net matcht alle Subdomains).
    • IP-Adresse: Gib die IP-Adresse des Zielservers oder deines lokalen Rechners ein.
  3. Erfassung starten – sofort aktiv Kehre zur Startseite zurück und starte die Paketerfassung. Ab diesem Moment werden alle passenden Anfragen auf deinem Smartphone automatisch auf die konfigurierte Ziel-IP umgeleitet. Falls du nur DNS-Mapping ohne Paketerfassung nutzen möchtest, kannst du stattdessen Host-Whitelist-/Blacklist-Regeln einrichten.

Änderungen an DNS-Mapping-Regeln werden sofort wirksam, solange die Paketerfassung läuft.