Android: DNS-Server für mobiles Netz einstellen

1. Einstellungen beschnittenAndroid Mobile DNS

Mit jeder Android-Version hat Google die Möglichkeit weiter eingeschränkt, den DNS-Server für das mobile Datennetz anzupassen. Das wollte ich so allerdings nicht hinnehmen, da ich den DNS-Servern meines (Mobilfunk-)Providers wenig Vertrauen schenke. Häufig protokollieren die Anbieter DNS-Anfragen mit, verwerten / teilen diese Informationen mit Dritten oder zensieren den Aufruf bestimmter Adressen. Grund genug also, auf alternative DNS-Server auszuweichen.

Wenn ihr dieser Anleitung folgen wollt, dann muss euer Android-Gerät gerootet sein und ihr solltet mit den CustomScripts der AFWall+ bereits vertraut sein. Im vorliegenden Beitrag stelle ich euch zwei unterschiedliche Lösungen vor, die mittels iptables Regelsätzen »erzwungen« werden.

2. Android und die (mobilen) DNS-Server

Euer Android Gerät verfügt im Normalfall über verschiedene Netzwerkschnittstellen, sogenannte Interfaces. Die Kommunikation im WiFi-Netzwerk erfolgt bspw. über das wlan0 Interface, Daten für das mobile Netz werden über das Interface rmnet0 (Bezeichnung kann variieren) ausgetauscht und für VPN-Verbindungen ist das Interface tun0 reserviert.

Für das wlan0 Interface könnt ihr den DNS-Server unter Einstellungen konfigurieren:

  • Einstellungen → WLAN → Ein langer Fingertipp auf eure aktive WLAN-Verbindung → Netzwerk ändern.
  • Setzt das Häkchen bei »Erweiterte Optionen einblenden« und selektiert bei IP-Einstellungen anschließend »Statisch«.
  • Scrollt nach ganz unten, bis ihr auf die beiden Einstellungen »DNS 1« und »DNS 2« trefft.
  • Tragt bei DNS 1 und DNS 2 jeweils einen neuen DNS-Server ein. Anbei ein paar Vorschläge für freie und unzensierte DNS-Server ohne Protokollierung.

Für das mobile Interface (rmnet0) besteht hingegen nicht die Möglichkeit, die DNS-Server über ein grafisches Menü anzupassen. Bis Android 6.0.0 konnte man sich allerdings über das Terminal behelfen.

Der Kuketz-Blog ist spendenfinanziert!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

2.1 Bis Android 4.3

Bis Android 4.3 konnten die DNS-Server für das mobile Interface (rmnet0) noch per Befehl gesetzt werden:

setprop net.rmnet0.dns1 <DNS-Server1>
setprop net.rmnet0.dns2 <DNS-Server2>
setprop net.dns1 <DNS-Server1>
setprop net.dns1 <DNS-Server2>

Sobald eine Neuverbindung (Reconnect) zum mobilen Datennetzwerk erfolgt, müssen diese Befehle erneut ausgeführt werden. Schon damals war es daher sinnvoll, mit einem CustomScript für die AFWall+ zu arbeiten, das die Befehle bei jeder Änderung der Datenverbindung bzw. einem Interface (LAN, WLAN, mobile Daten, etc.) erneut ausführt und die übermittelten DNS-Server vom Mobilfunkanbieter damit überschreibt.

2.2 Bis einschließlich Android 6.0.0

Ab Android 4.3 bis einschließlich der Version 6.0.0 kann der DNS-Server für das mobile Interface (rmnet0) dann mit einem anderen Befehl (ndc) gesetzt werden. Allerdings variieren die Befehle in fast jeder Android-Version und es ist schwierig, die korrekte Syntax zu finden. Für Android 6.0.0 ist bspw. folgender Befehlssatz korrekt:

ndc resolver setnetdns rmnet0 "" <DNS-Server1> <DNS-Server2>
ndc resolver clearnetdns rmnet0
ndc resolver flushnet rmnet0

Bei jedem Verbindungswechsel (bspw. WLAN -> mobile Daten) werden die gesetzten Einstellungen allerdings wieder überschrieben. Daher ist es auch hier sinnvoll mit AFWall+ zu arbeiten.

2.3 Ab Android 6.1.x

Spätestens ab Android 6.1.x hat Google dann alle Befehle entfernt, mit dem sich der mobile DNS-Server für das rmnet0 Interface beeinflussen lässt. Mit herkömmlichen Mitteln lassen sich die DNS-Server daher nicht mehr ändern, sondern es sind spezielle Apps wie bspw. DNS Changer oder Engelsiz erforderlich. Allerdings haben alle genannten Tools einen entscheidenden Nachteil: Sie initiieren einen lokalen VPN-Tunnel, um Einfluss auf die DNS-Server der Mobilfunkverbindung zu nehmen – noch dazu sind sie nicht quelloffen.

3. iptables und AFWall+

Mit speziellen iptables Regeln und den CustomScripts der AFWall+ war es auch schon bisher möglich, alle DNS-Anfragen an einen bestimmten DNS-Server weiterzureichen – und den mobilen DNS-Server damit zu »umgehen«:

# Force a specific dns server for all interfaces
$IPTABLES -t nat -I OUTPUT -p tcp --dport 53 -j DNAT --to-destination 116.203.32.217:53
$IPTABLES -t nat -I OUTPUT -p udp --dport 53 -j DNAT --to-destination 116.203.32.217:53

Doch das Code-Snippet hatte einen Nachteil: Der DNS-Server wurde für alle Interfaces überschrieben, also auch für euer heimisches WLAN. Das ist insbesondere dann unpraktisch, wenn ihr in eurem Netzwerk mit einem Pi-hole oder einer ähnlichen Lösung Werbung und Tracker herausfiltert.

3.1 Lösung 1: Eigener DNS-Server für das rmnet0 Interface

Die Lösung ist denkbar einfach: Immer wenn eine DNS-Anfrage (Port 53 TCP/UDP) das Gerät über das rmnet0 Interface verlässt (-o rmnet+), wird das Paket an die IP-Adresse 116.203.32.217 gesendet – der DNS-Server der Digitalcourage. Es spielt also keine Rolle, welche DNS-Server von eurem Mobilfunkanbieter gesetzt werden, folgende iptables Regeln »erzwingen« für das mobile Interface die Abfrage an den DNS-Server eurer Wahl:

# Force a specific dns server for rmnet[*] interface
$IPTABLES -t nat -I OUTPUT -o rmnet+ -p tcp --dport 53 -j DNAT --to-destination 116.203.32.217:53
$IPTABLES -t nat -I OUTPUT -o rmnet+ -p udp --dport 53 -j DNAT --to-destination 116.203.32.217:53

3.2 Lösung 2: Eigener DNS-Server für das heimische WLAN

Lösung 1 funktioniert zwar einwandfrei, hat nach meiner Auffassung allerdings einen kleinen Nachteil: Wenn ihr euch in fremde WLANs einbucht, bekommt ihr meist per DHCP einen DNS-Server zugeteilt. Persönlich möchte ich allerdings auch in fremden WLAN-Netzen einen DNS-Server meiner Wahl benutzen. Erreichen kann ich dies mit folgendem Code-Snippet:

# Set a specific dns server for all networks except home WiFi (192.168.150.0/24)
$IPTABLES -t nat -I OUTPUT ! -s 192.168.150.0/24 -p tcp --dport 53 -j DNAT --to-destination 116.203.32.217:53
$IPTABLES -t nat -I OUTPUT ! -s 192.168.150.0/24 -p udp --dport 53 -j DNAT --to-destination 116.203.32.217:53

Was wird hier gemacht? Alle DNS-Anfragen, die nicht aus dem Heimnetzwerk stammen (192.168.150.0/24) werden an den DNS-Server der Digitalcourage weitergeleitet. Damit das auch wirklich funktioniert, darf das fremde WLAN-Netzwerk natürlich nicht den selben IP-Adressbereich (192.168.150.0/24) wie euer Heimnetzwerk verwenden. Sollte es das allerdings tun, dann werden einfach alle DNS-Anfragen an den per DHCP übermittelten DNS-Server übermittelt – also auch kein Beinbruch.

Die DNS-Anfragen im mobilen Netzwerk gehen auch bei dieser Variante immer an den von euch definierten DNS-Server. Lösung 2 sorgt im Prinzip also nur zusätzlich dafür, dass der von euch gewünschte DNS-Server auch in fremden WLAN-Netzwerken benutzt wird.

Danke an marco aus dem XMPP-Raum, der entscheidend zu dieser zweiten Lösung beigetragen hat.

Hinweis

Ob Lösung 2 mit VPN-Verbindungen harmoniert habe ich bisher nicht getestet.

3.3 DNS-Server verifizieren

Die iptables Regelsätze für das CustomScript der AFWall+ gilt es anschließend zu verifizieren. Letztendlich gibt es nur eine Variante, die immer korrekt funktioniert: Verbindet euer Android-Smartphone mit dem USB-Kabel mit eurem PC und nutzt anschließend adb:

adb root
adb shell tcpdump -ns0 -i any 'port 53'

Auf der Konsole werden euch dann alle Pakete angezeigt, die über den Port 53 rein- und rausgehen. Darüber könnt ihr den genutzten DNS-Server im mobilen Netz eindeutig identifizieren – wenn rmnet0 aktiv und wlan0 inaktiv:

11:31:57.537734 IP 10.120.223.230.50355 > 116.203.32.217.53: 38091+ A? mail.kuketz.de. (32)

Und ebenso im WLAN – wenn wlan0 aktiv und rmnet0 inaktiv:

11:33:05.915985 IP 192.168.150.15.58283 > 192.168.150.1.53: 42633+ A? mail.kuketz.de. (32)

Eine andere Variante sind Online-Services, die allerdings nicht immer das richtige Ergebnis liefern:

4. Fazit

Lösung 1 sollte auf allen Geräten funktionieren, bei denen ihr Zugriff auf iptables habt. Ihr müsst euch also auch auf älteren Android-Versionen nicht mit Terminal-Befehlen herumärgern, sondern könnt einfach iptables bzw. AFWall+ in Kombination mit den CustomScripts nutzen.

Ab Android 6.1.x habt ihr nach meinem aktuellen Kenntnisstand keine andere Wahl, als den mobilen DNS-Server eures Mobilfunkanbieters, über die vorgestellten iptables Regelsätze zu überschreiben. Persönlich nutze ich Lösung 2 und habe dies auch in mein AFWall+ CustomScript eingearbeitet.

Bildquellen:

Server: Freepik from www.flaticon.com is licensed by CC 3.0 BY

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

24 Ergänzungen zu “Android: DNS-Server für mobiles Netz einstellen”

  1. Comment Avatar Michael sagt:

    Also auch bei einem nicht gerootetem Smartphone kann man auch unter Android 7 den dns server von Wifi und 3g ändern. Man muss einfach nur die App dns Changer aus dem App store laden, diese App baut dann eine Art vpn Verbindung auf. Da ich persönlich eh meistens über vpn im Netz bin, nutze ich automatisch den dns vom vpn Anbieter.

    Ich hatte eine zeit lang meinen eigenen vpn server laufen aber davon bin ich ab da ich auf meinen eigenen server der einzige war und bei airvpn kann ich evtl in der Masse untertauchen.

    Dein Blog und deine Berichte sind wirklich sehr gut und freue mich schon immer auf den nächsten Artikel 👍

  2. Comment Avatar Martin sagt:

    Danke für den guten Beitrag. Ich wollte nur noch erwähnen, dass bei meinem Oneplus 3T mit LineageOS 7 das Mobile-Device „rmnet_data0“ war und ich ich die Regeln dahingehend adaptieren musste.

  3. Comment Avatar Arthur sagt:

    Hofffentlich habe ich das richtig verstanden:

    in der Lösung 3.2 sind unter „delete dns“ zwei gleiche Zeilen.
    Die zweite Zeile muss vermutlich „-p udp“ sein anlaog dem Block in „set dns“.

  4. Comment Avatar Sam sagt:

    Ich habe eine Verständnis Frage zu dem Script für AFWall. Die ersten zwei Zeilen löschen jeweils den DNS Server. Die zweiten zwei erstellen ihn sozusagen wieder.

    Was haben bei den ersten zwei Zeilen das „TRUE“ am Ende zu bedeuten?

    Danke für deine Artikel und deine hilfreichen Denkanstöße

    VG SAM

  5. Comment Avatar 3Komma14 sagt:

    Mit Adguard kann man den DNS auch auf ungerooteten Geräten ändern

  6. Comment Avatar NoName sagt:

    Wieder mal ein sehr interessanter Artikel. Habe auch gleich die unter 3.2 beschriebene Lösung ausprobiert. Leider funktioniert die bei mir nicht. Liegt das auch am Lineage?

  7. Comment Avatar Heiner Marken sagt:

    Wieder ein wertvoller Beitrag.
    Allerdings finde ich es schade, dass auch für Laien, wie mich, erläutert wird, warum das datenschutzrelevant ist.

  8. Comment Avatar Hans-Werner sagt:

    Es sind spezielle Apps wie bspw. DNS Changer, Engelsiz oder DNSet erforderlich. Allerdings haben alle genannten Tools einen entscheidenden Nachteil: Sie initiieren einen lokalen VPN-Tunnel, um Einfluss auf die DNS-Server der Mobilfunkverbindung zu nehmen – noch dazu sind sie nicht quelloffen.

    Servus Mike!
    Bin vor kurzer Zeit von Adaway auf DNS66 umgestiegen. Letzteres bietet auch die Funktion, dns-Server auszuwählen. Gibt’s ’nen triftigen Grund, wieso diese nicht gelistet ist? Kann ja sein, dass ich was verballert habe…
    Grüße!

    • Comment Avatar Mike Kuketz sagt:

      Es ist nicht gelistet, weil der primäre Zweck von DNS66 nicht die Änderung von DNS-Servern ist.

      • Comment Avatar Hans-Werner sagt:

        Der Gedankengang ist klar. Vlt. magst du’s am Rande dennoch erwähnen, da DNS66, NetGuard usw. usf. gegenüber den genannten quelloffen sind und somit deutlich mehr unserer Philosophie entsprechen ;) .

  9. Comment Avatar Iain sagt:

    Hallo, funktioniert es nicht auch mit NetGuard unter Einstellungen/Erweiterte Optionen: VPN-DNS? Mit DNS-Leak Testseiten, die hier im Blog genannt wurden habe ich jedenfalls immer die in NetGuard hinterlegten DNS-Server angezeigt bekommen…
    Danke für den Input!!

  10. Comment Avatar Hamzelot sagt:

    Hallo, ich habe vielleicht eine kleine Verbesserung.

    Wenn man im Heimnetzwerk seinem Handy eine feste IP gibt, über den DHCP-Server oder diese in der Einstellung des Handy´s erzwingt z.b „192.168.150.201“ und die Einträge anpasst

    $IPTABLES -t nat -I OUTPUT ! -s 192.168.150.201 -p tcp --dport 53 -j DNAT --to-destination 85.214.20.141:53
    $IPTABLES -t nat -I OUTPUT ! -s 192.168.150.201 -p udp --dport 53 -j DNAT --to-destination 85.214.20.141:53

    dann sollte der DNS-Server nur dann angesprochen werden, wenn der IP-Adressbereich und die feste IP gleich sind. Somit erreiche ich, dass wenn ich im fremden WLAN bin, der denselben Addressbereich wie ich nutze, ich nicht den DNS-Server des fremden Netzwerkes nutze, sondern 85.214.20.141:53. Korrigiert mich wenn ich falsch liege.

  11. Comment Avatar M_Hulot sagt:

    Hallo Mike,

    danke für die wertvolle Erweiterung des Skripts. Ich habe mich sowieso schon gewundert, warum mein Smartphone nicht im Log des Pi-holes auftaucht. Jetzt weiß ich, wieso und habe mein AFWall-Skript dahingehend angepasst.
    Zusätzlich habe ich jede Zeile doppelt eingefügt, jeweils mit einer DNS-Server-Alternative, falls der Server mal nicht erreichbar ist (So war es auch im ursprünglichen Skript aus deinem Beitrag über die Rückgewinnung der Datenhoheit auf dem Smartphone (der Titel fällt mir gerade nicht ein).

  12. Comment Avatar Anonymous sagt:

    Alles schick, aber hast du mal ne Quelle dafür, dass die Mobilfunk-Anbieter (Telekom, Vodafone, O2) DNS-Anfragen protokollieren, verwerten oder mit Dritten teilen?

    • Comment Avatar Gats sagt:

      Das würde mich auch interessieren. Wobei ich mir ziemlich sicher bin, dass Mike damit recht hat. Eine Quelle wäre trotzdem nett.

  13. Comment Avatar Wulf sagt:

    Hallo Mike,
    vielen Dank für die wertvollen Anregungen. Das hat mir bereits an anderer Stelle mehrfach geholfen. Ich würde in AFWall aber gerne 2 DNS-Server einstellen für den Fall, dass einer mal nicht erreichbar ist. Dein Beispielcode sieht aber in allen Lösungen immer nur 1 Server vor. Kann ich am Ende der Zeile hinter „… –to-destination 85.214.20.141:53“ vielleicht mit einem Komma getrennt einfach eine 2. IP wieder mit Port 53 aufführen? Github gab zu dieser Fragestellung leider nichts her. Vielleicht findest Du ja die Zeit für eine kurze Antwort, danke.

HilfeWenn du konkrete Fragen hast oder Hilfe benötigst, sind das offizielle Forum oder der Chat geeignete Anlaufstellen, um dein Anliegen zu diskutieren. Per E-Mail beantworte ich grundsätzlich keine (Support-)Anfragen – dazu fehlt mir einfach die Zeit. Kuketz-Forum

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.