Android bietet APIs, mit denen Entwickler virtuelle private Netzwerke (VPN) erstellen können Lösungen zu finden. Nachdem Sie diesen Leitfaden gelesen haben, wissen Sie, wie Sie Ihre eigenen VPN-Client für Android-Geräte.
Übersicht
VPNs ermöglichen den sicheren Zugriff auf Geräte, die sich nicht physisch mit einem Netzwerk befinden, Netzwerk.
Android verfügt über einen integrierten VPN-Client (PPTP und L2TP/IPSec), der manchmal namens altes VPN. Unter Android 4.0 (API-Level 14) wurden APIs eingeführt, eigene VPN-Lösungen bereitstellen. Sie verpacken Ihre VPN-Lösung in eine App einbinden, die Nutzer auf dem Gerät installieren. Entwickler erstellen in der Regel ein VPN App aus einem der folgenden Gründe:
- Zum Anbieten von VPN-Protokollen, die der integrierte Client nicht unterstützt
- Damit Nutzer ohne eine komplizierte Konfiguration eine Verbindung zu einem VPN-Dienst herstellen können
Im weiteren Verlauf dieses Handbuchs wird die Entwicklung von VPN-Apps (einschließlich durchgehend aktives VPN und VPN pro App) und deckt nicht die integrierten VPN-Client.
Nutzererfahrung
Android bietet eine Benutzeroberfläche (UI), die beim Konfigurieren, Starten und beenden Sie Ihre VPN-Lösung. Über die System-UI wird auch die Person, die das Gerät verwendet, eine aktive VPN-Verbindung erkennen. Android zeigt die folgenden UI-Komponenten für VPN-Verbindungen:
- Bevor eine VPN-App zum ersten Mal aktiviert werden kann, zeigt das System eine Dialogfeld für die Verbindungsanfrage. Im Dialogfeld wird die Person, die das Gerät verwendet, aufgefordert, bestätigen, dass sie dem VPN vertrauen, und die Anfrage akzeptieren.
- Auf dem Bildschirm „VPN-Einstellungen“ (Einstellungen > Netzwerk und Internet > VPN) wird das VPN Apps, bei denen eine Person Verbindungsanfragen angenommen hat. Es gibt eine Schaltfläche zum Konfigurieren Systemoptionen oder das VPN entfernen.
- Im Bereich „Schnelleinstellungen“ wird ein Infobereich angezeigt, wenn eine Verbindung aktiv ist. aktiv ist. Wenn Sie auf das Label tippen, wird ein Dialogfeld mit weiteren Informationen und einem Link angezeigt zu den Einstellungen.
- Die Statusleiste enthält ein VPN-Schlüsselsymbol, das auf eine aktive Verbindung hinweist.
Ihre App muss außerdem eine Benutzeroberfläche bieten, damit die Person, die das Gerät verwendet, die Optionen Ihres Dienstes konfigurieren. Ihre Lösung muss beispielsweise Einstellungen für die Kontoauthentifizierung fest. Apps sollten folgende UI anzeigen:
- Steuerung zum manuellen Starten und Beenden einer Verbindung. Durchgehend aktives VPN kann bei Bedarf eine Verbindung herstellen, aber Nutzer können die Verbindung zuerst konfigurieren. wann sie Ihr VPN verwenden.
- Eine Benachrichtigung, die sich nicht schließen lässt, wenn der Dienst aktiv ist. Die Benachrichtigung kann den Verbindungsstatus anzeigen oder weitere Informationen bereitstellen, z. B. Netzwerkstatistiken. Wenn Sie auf die Benachrichtigung tippen, wird die App in den Vordergrund verschoben. Entfernen Sie die nachdem der Dienst inaktiv wird.
VPN-Dienst
Ihre App verbindet das Systemnetzwerk für einen Nutzer oder ein Unternehmen
) zu einem VPN-Gateway verbinden. Jeder Nutzer (oder jedes Arbeitsprofil) kann ein
VPN-App verwenden. Sie erstellen einen VPN-Dienst, den das System zum Starten und
beenden Sie Ihr VPN und verfolgen Sie den Verbindungsstatus. Ihr VPN-Dienst übernimmt die
VpnService
Der Dienst fungiert auch als Container für die VPN-Gateway-Verbindungen und
ihre lokalen Geräteschnittstellen. Ihren Dienstinstanzaufruf
VpnService.Builder
-Methoden zum Erstellen einer neuen lokalen Schnittstelle.
Ihre App überträgt die folgenden Daten, um das Gerät mit dem VPN-Gateway zu verbinden:
- Liest ausgehende IP-Pakete aus dem Dateideskriptor der lokalen Schnittstelle, verschlüsselt und sendet sie an das VPN-Gateway.
- Schreibt eingehende Pakete (vom VPN-Gateway empfangen und entschlüsselt) in den Dateideskriptor der lokalen Schnittstelle.
Es gibt nur einen aktiven Dienst pro Nutzer oder Profil. Wenn Sie einen neuen Dienst starten, beendet einen vorhandenen Dienst automatisch.
Dienst hinzufügen
Um Ihrer App einen VPN-Dienst hinzuzufügen, erstellen Sie einen Android-Dienst, der die
VpnService
VPN-Dienst in Ihrer App deklarieren
Manifest-Datei mit den folgenden Ergänzungen:
- Dienst mit dem
BIND_VPN_SERVICE
schützen damit nur das System eine Bindung an Ihren Dienst vornehmen kann. - Bewerben Sie den Dienst mit dem Intent-Filter
"android.net.VpnService"
, sodass kann das System Ihren Dienst finden.
Im folgenden Beispiel wird gezeigt, wie Sie den Dienst in Ihrer App-Manifestdatei deklarieren können:
<service android:name=".MyVpnService"
android:permission="android.permission.BIND_VPN_SERVICE">
<intent-filter>
<action android:name="android.net.VpnService"/>
</intent-filter>
</service>
Nachdem der Dienst in Ihrer App deklariert ist, kann das System automatisch und bei Bedarf den VPN-Dienst der App beenden. Zum Beispiel die Systemsteuerung für Ihren Dienst, wenn Sie ein durchgehend aktives VPN ausführen.
Dienst vorbereiten
Um die App als aktueller VPN-Dienst des Nutzers vorzubereiten, rufen Sie Folgendes auf:
VpnService.prepare()
Wenn die Person, die das Gerät verwendet, noch nicht
bereits eine Berechtigung für Ihre App erteilt hat, gibt die Methode einen Aktivitäts-Intent zurück.
Sie verwenden diesen Intent, um eine Systemaktivität zu starten, in der Sie nach einer Berechtigung gefragt werden. Die
wird ein Dialogfeld angezeigt, das anderen Berechtigungsdialogfeldern ähnelt, z. B.
Kamera- oder Kontaktzugriff. Wenn Ihre App bereits vorbereitet ist, gibt die Methode
null
Nur eine App kann der aktuell vorbereitete VPN-Dienst sein. Immer anrufen
VpnService.prepare()
, weil eine Person möglicherweise eine andere
seit dem letzten Aufruf der Methode durch die App als VPN-Dienst verwendet wurde. Weitere Informationen finden Sie unter
Abschnitt Dienstlebenszyklus
Dienst verbinden
Sobald der Dienst ausgeführt wird, können Sie eine neue lokale Schnittstelle erstellen, die mit einem VPN-Gateway verbunden sind. Um die Berechtigung anzufordern und eine Verbindung zu Ihrem Dienst herzustellen, um des VPN-Gateways müssen Sie die Schritte in der folgenden Reihenfolge ausführen:
- Rufen Sie
VpnService.prepare()
auf und bitten Sie um Erlaubnis (wenn erforderlich). VpnService.protect()
aufrufen, um den Tunnel-Socket der App beizubehalten außerhalb des System-VPN und vermeiden Sie eine zirkuläre Verbindung.- Rufen Sie
DatagramSocket.connect()
auf, um eine Verbindung zum Tunnel Ihrer App herzustellen Sockets zum VPN-Gateway. - Rufen Sie die Methoden
VpnService.Builder
auf, um eine neue lokale TUN-Schnittstelle auf der Gerät für VPN-Traffic. - Rufen Sie
VpnService.Builder.establish()
auf, damit das System richtet die lokale TUN-Schnittstelle ein und beginnt mit der Weiterleitung von Traffic über die .
Ein VPN-Gateway schlägt in der Regel Einstellungen für die lokale TUN-Schnittstelle vor, während
Hände schütteln. Ihre App ruft VpnService.Builder
-Methoden auf, um Folgendes zu konfigurieren:
wie im folgenden Beispiel gezeigt:
Kotlin
// Configure a new interface from our VpnService instance. This must be done // from inside a VpnService. val builder = Builder() // Create a local TUN interface using predetermined addresses. In your app, // you typically use values returned from the VPN gateway during handshaking. val localTunnel = builder .addAddress("192.168.2.2", 24) .addRoute("0.0.0.0", 0) .addDnsServer("192.168.1.1") .establish()
Java
// Configure a new interface from our VpnService instance. This must be done // from inside a VpnService. VpnService.Builder builder = new VpnService.Builder(); // Create a local TUN interface using predetermined addresses. In your app, // you typically use values returned from the VPN gateway during handshaking. ParcelFileDescriptor localTunnel = builder .addAddress("192.168.2.2", 24) .addRoute("0.0.0.0", 0) .addDnsServer("192.168.1.1") .establish();
Das Beispiel im Abschnitt VPN pro App zeigt eine IPv6-Konfiguration mit
weitere Optionen. Sie müssen die folgenden VpnService.Builder
-Werte hinzufügen
bevor Sie eine neue Schnittstelle einrichten können:
addAddress()
- Fügen Sie mindestens eine IPv4- oder IPv6-Adresse sowie eine vom System die Adresse der lokalen TUN-Schnittstelle zuweist. Ihre App empfängt die IP-Adresse normalerweise Adressen und Subnetzmasken von einem VPN-Gateway während des Handshakes.
addRoute()
- Fügen Sie mindestens eine Route hinzu, wenn das System Traffic über das VPN senden soll
. Routen filtern nach Zieladressen. Um den gesamten Traffic zu akzeptieren,
offene Route wie
0.0.0.0/0
oder::/0
Die Methode establish()
gibt eine
ParcelFileDescriptor
-Instanz, die Ihre Anwendung zum Lesen und Schreiben verwendet
an den und vom Zwischenspeicher der Schnittstelle. Die establish()
gibt null
zurück, wenn deine App nicht vorbereitet ist oder jemand die
Berechtigung.
Dienstlebenszyklus
Ihre App sollte den Status des vom System ausgewählten VPN sowie alle aktiven Verbindungen. Aktualisieren Sie die Benutzeroberfläche Ihrer App, damit die Person die App weiterhin verwendet. über Änderungen informiert.
Dienst starten
Sie können Ihren VPN-Dienst auf folgende Arten starten:
- Ihre App startet den Dienst – in der Regel, weil eine Person auf eine Schaltfläche zum Verbinden getippt hat.
- Der Dienst wird vom System gestartet, da das durchgehend aktive VPN aktiviert ist.
Ihre App startet den VPN-Dienst, indem sie einen Intent an
startService()
Weitere Informationen finden Sie unter Starten eines
Das System startet Ihren Dienst im Hintergrund durch Aufrufen von
onStartCommand()
Android schränkt jedoch
ab Version 8.0 (API-Level 26) installiert. Wenn Sie diese
API-Levels verwenden, müssen Sie Ihren Dienst in den Vordergrund versetzen, indem Sie folgenden Befehl aufrufen:
Service.startForeground()
Weitere Informationen finden Sie unter Ein
Dienst im Vordergrund ausgeführt wird.
Dienst beenden
Eine Person, die das Gerät verwendet, kann den Dienst über die Benutzeroberfläche Ihrer App beenden. Beenden Sie die anstatt die Verbindung einfach zu schließen. Außerdem stoppt das System eine aktive Verbindung, wenn die Person, die das Gerät verwendet, auf dem Bildschirm „VPN“ Folgendes ausführt: der App „Einstellungen“:
- die Verbindung zur VPN-App trennt oder vergisst
- deaktiviert durchgehend aktives VPN für eine aktive Verbindung
Das System ruft die Methode onRevoke()
Ihres Dienstes auf, aber dieser Aufruf
im Hauptthread nicht passieren. Wenn das System diese Methode aufruft, wird ein
alternative Netzwerkschnittstelle
leitet bereits Traffic. Sie können
der folgenden Ressourcen:
- Schließen Sie den geschützten Tunnel-Socket zum VPN-Gateway durch folgenden Aufruf:
DatagramSocket.close()
- Schließen Sie die Paketdateibeschreibung. Sie müssen sie nicht per Drain beenden, indem Sie den Befehl
ParcelFileDescriptor.close()
Durchgehend aktives VPN
Android kann einen VPN-Dienst starten, wenn das Gerät hochfährt, und währenddessen das Gerät eingeschaltet ist. Diese Funktion heißt durchgehend aktives VPN und ist verfügbar in Android 7.0 (API-Level 24) oder höher Während Android den Dienst ist Ihr VPN-Dienst für das VPN-Gateway Durch ein durchgehend aktives VPN können auch Verbindungen blockiert werden, die das VPN nicht verwenden.
Nutzererfahrung
Unter Android 8.0 oder höher zeigt das System die folgenden Dialogfelder an, um die Person, die das Gerät mit aktiviertem Always-On-VPN verwendet:
- Wenn immer aktive VPN-Verbindungen getrennt werden oder keine Verbindung hergestellt werden kann, sehen Nutzer eine die nicht schließbar ist. Wenn du auf die Benachrichtigung tippst, wird ein Dialogfeld angezeigt, erfahren Sie mehr dazu. Die Benachrichtigung verschwindet, wenn das VPN wieder verbunden wird oder jemand deaktiviert die Option „Durchgehend aktives VPN“.
- Durch das durchgehend aktive VPN kann der Nutzer eines Geräts jedes Netzwerk blockieren die das VPN nicht nutzen. Wenn Sie diese Option aktivieren, App warnt vor dem VPN, dass sie keine Internetverbindung haben verbindet. Die App „Einstellungen“ fordert die Person, die das Gerät verwendet, auf, fortzufahren oder Abbrechen.
Da das System (und keine Person) eine Always-On-Verbindung startet und unterbricht, müssen Sie das Verhalten und die Benutzeroberfläche Ihrer App anpassen:
- Deaktivieren Sie alle Benutzeroberflächen, die die Verbindung trennen, da das System und die Einstellungen App die Verbindung steuern.
- Speichern Sie die Konfiguration nach jedem App-Start und konfigurieren Sie eine Verbindung mit dem aktuellen Einstellungen. Da das System Ihre App bei Bedarf startet, nicht immer eine Verbindung konfigurieren möchte.
Sie können auch verwaltete Konfigurationen verwenden, um eine Mit verwalteten Konfigurationen kann ein IT-Administrator Ihr VPN per Fernzugriff konfigurieren.
Erkennung von immer an
Android enthält keine APIs, um zu prüfen, ob das System dein VPN gestartet hat . Wenn Ihre Anwendung jedoch Dienstinstanzen kennzeichnet, die von ihr gestartet werden, können Sie davon ausgehen, dass das System nicht gekennzeichnete Dienste für durchgehend aktives VPN gestartet hat. Hier ein Beispiel:
- Erstellen Sie eine
Intent
-Instanz, um den VPN-Dienst zu starten. - Kennzeichnen Sie den VPN-Dienst, indem Sie dem Intent zusätzliche Informationen hinzufügen.
- Suchen Sie in der Methode
onStartCommand()
des Dienstes nach dem in den Extras desintent
-Arguments.
Blockierte Verbindungen
Eine Person, die das Gerät verwendet, oder ein IT-Administrator kann erzwingen, dass der gesamte Datenverkehr das VPN verwendet. Das System blockiert jeglichen Netzwerkverkehr, der nicht das VPN nutzt. Nutzer der Gerät finden Sie in den VPN-Optionen den Schalter Verbindungen ohne VPN blockieren. in den Einstellungen.
„Immer an“ deaktivieren
Wenn deine App derzeit kein durchgehend aktives VPN unterstützt, kannst du die Funktion deaktivieren.
8.1 oder höher), indem Sie die Einstellung
SERVICE_META_DATA_SUPPORTS_ALWAYS_ON
Dienstmetadaten für false
. Das folgende Beispiel für ein App-Manifest zeigt, wie Sie
Metadatenelement:
<service android:name=".MyVpnService"
android:permission="android.permission.BIND_VPN_SERVICE">
<intent-filter>
<action android:name="android.net.VpnService"/>
</intent-filter>
<meta-data android:name="android.net.VpnService.SUPPORTS_ALWAYS_ON"
android:value=false/>
</service>
Wenn deine App das durchgehend aktive VPN deaktiviert, deaktiviert das System die Benutzeroberfläche für Optionen in den Einstellungen.
Einzelnen Apps die VPN-Nutzung erlauben
VPN-Apps können filtern, welche installierten Apps Traffic über den VPN-Verbindung. Sie können eine Liste mit zulässigen oder nicht zugelassenen aber nicht beides. Wenn Sie keine Listen erstellen, den gesamten Netzwerkverkehr über das VPN.
Die VPN-App muss die Listen festlegen, bevor die Verbindung hergestellt wird. Wenn Sie die Listen ändern, eine neue VPN-Verbindung herstellen. Eine App muss auf dem Gerät installiert ist, wenn Sie es einer Liste hinzufügen.
Kotlin
// The apps that will have access to the VPN. val appPackages = arrayOf( "com.android.chrome", "com.google.android.youtube", "com.example.a.missing.app") // Loop through the app packages in the array and confirm that the app is // installed before adding the app to the allowed list. val builder = Builder() for (appPackage in appPackages) { try { packageManager.getPackageInfo(appPackage, 0) builder.addAllowedApplication(appPackage) } catch (e: PackageManager.NameNotFoundException) { // The app isn't installed. } } // Complete the VPN interface config. val localTunnel = builder .addAddress("2001:db8::1", 64) .addRoute("::", 0) .establish()
Java
// The apps that will have access to the VPN. String[] appPackages = { "com.android.chrome", "com.google.android.youtube", "com.example.a.missing.app"}; // Loop through the app packages in the array and confirm that the app is // installed before adding the app to the allowed list. VpnService.Builder builder = new VpnService.Builder(); PackageManager packageManager = getPackageManager(); for (String appPackage: appPackages) { try { packageManager.getPackageInfo(appPackage, 0); builder.addAllowedApplication(appPackage); } catch (PackageManager.NameNotFoundException e) { // The app isn't installed. } } // Complete the VPN interface config. ParcelFileDescriptor localTunnel = builder .addAddress("2001:db8::1", 64) .addRoute("::", 0) .establish();
Zugelassene Apps
Um eine App auf die Zulassungsliste zu setzen, rufen Sie Folgendes auf:
VpnService.Builder.addAllowedApplication()
Wenn
die Liste eine oder mehrere Apps enthält, dann verwenden nur diese das VPN.
Alle anderen Apps, die nicht in der Liste aufgeführt sind, verwenden die Systemnetzwerke wie das VPN
nicht geschaltet wird. Wenn die Zulassungsliste leer ist, verwenden alle Apps das VPN.
Nicht zugelassene Apps
Um eine App der Liste der unzulässigen Apps hinzuzufügen, rufen Sie
VpnService.Builder.addDisallowedApplication()
Nicht zugelassene Apps verwenden das Systemnetzwerk so, als würde das VPN nicht ausgeführt werden – alle anderen
Apps verwenden das VPN.
VPN umgehen
Über Ihr VPN können Apps das VPN umgehen und ihr eigenes Netzwerk auswählen. Bis
um das VPN zu umgehen, rufen Sie VpnService.Builder.allowBypass()
auf, wenn
eine VPN-Schnittstelle einrichten. Sie können diesen Wert nach dem Start des
VPN-Dienst Wenn eine App ihren Prozess oder einen Socket nicht an einen bestimmten
Netzwerk, wird der Netzwerkverkehr der App über das VPN fortgesetzt.
Apps, die an ein bestimmtes Netzwerk gebunden sind,
haben keine Verbindung, wenn jemand
und blockiert Traffic, der nicht über das VPN läuft. Um Traffic über eine bestimmte
Netzwerk, Apps-Aufrufmethoden wie
ConnectivityManager.bindProcessToNetwork()
oder
Network.bindSocket()
, bevor Sie die Steckdose anschließen.
Beispielcode
Das Open-Source-Projekt von Android enthält eine Beispiel-App namens ToyVPN. In dieser App wird gezeigt, wie Sie einen VPN-Dienst einrichten und verbinden.