VPN

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.

<ph type="x-smartling-placeholder">
</ph>
Abbildung 1: So verbindet VpnService Android Netzwerk zum VPN-Gateway
Blockarchitekturdiagramm, das zeigt, wie VpnService eine lokale TUN erstellt
         Schnittstelle im Systemnetzwerk.

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:

  1. Rufen Sie VpnService.prepare() auf und bitten Sie um Erlaubnis (wenn erforderlich).
  2. VpnService.protect() aufrufen, um den Tunnel-Socket der App beizubehalten außerhalb des System-VPN und vermeiden Sie eine zirkuläre Verbindung.
  3. Rufen Sie DatagramSocket.connect() auf, um eine Verbindung zum Tunnel Ihrer App herzustellen Sockets zum VPN-Gateway.
  4. Rufen Sie die Methoden VpnService.Builder auf, um eine neue lokale TUN-Schnittstelle auf der Gerät für VPN-Traffic.
  5. 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:

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:

  1. Deaktivieren Sie alle Benutzeroberflächen, die die Verbindung trennen, da das System und die Einstellungen App die Verbindung steuern.
  2. 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:

  1. Erstellen Sie eine Intent-Instanz, um den VPN-Dienst zu starten.
  2. Kennzeichnen Sie den VPN-Dienst, indem Sie dem Intent zusätzliche Informationen hinzufügen.
  3. Suchen Sie in der Methode onStartCommand() des Dienstes nach dem in den Extras des intent-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.