VPN

Android, geliştiricilerin sanal özel ağ (VPN) oluşturması için API'ler sunar çözümler. Bu kılavuzu okuduktan sonra, uygulamanızın özelliklerini nasıl geliştirip test edeceğinizi kendi VPN istemcisini kullanabilirsiniz.

Genel Bakış

VPN'ler, fiziksel olarak bir ağda bulunmayan cihazların ağ.

Android, yerleşik bir (PPTP ve L2TP/IPSec) VPN istemcisi içerir. eski VPN'dir. Android 4.0 (API Düzeyi 14), uygulamanın geliştiricilerin kendi VPN çözümlerini sağlamasıdır. VPN çözümünüzü paketleyin yüklenen bir uygulamaya dönüştürülebilir. Geliştiriciler normalde VPN oluşturur neden olabilir:

  • Yerleşik istemcinin desteklemediği VPN protokollerini sunmak için.
  • Kullanıcıların karmaşık yapılandırma olmadan bir VPN hizmetine bağlanmalarına yardımcı olmak için.

Bu kılavuzun geri kalanında, VPN uygulamalarının nasıl geliştirileceği (ör. her zaman açık ve uygulama başına VPN) kapsar ve yerleşik VPN istemcisi bulunuyor.

Kullanıcı deneyimi

Android, kullanıcıların yapılandırmasına, başlatılmasına ve başlatılmasına yardımcı olan bir kullanıcı arayüzü sağlar. VPN çözümünüzü durdurun. Sistem kullanıcı arayüzü, cihazı kullanan kişinin haberdar olmanız gerekir. Android, VPN bağlantıları:

  • Bir VPN uygulamasının ilk kez etkin hale gelmesi için önce sistem bir bağlantı isteği iletişim kutusu. İletişim kutusunda, cihazı kullanan kişiden VPN'ye güvendiğini ve isteği kabul ettiğini onaylayın.
  • VPN ayarları ekranında (Ayarlar > Ağ ve İnternet > VPN) VPN gösterilir. kullanıcıların bağlantı isteklerini kabul ettiği uygulamalar. Yapılandırmak için bir düğme bulunur veya VPN'i unutabilirsiniz.
  • Hızlı Ayarlar tepsisi, bir bağlantı kurulduğunda bir bilgi paneli etkin. Etikete dokunduğunuzda daha fazla bilgi ve bağlantı içeren bir iletişim kutusu görüntülenir Ayarlar'a gidin.
  • Durum çubuğunda, etkin bağlantıyı gösteren bir VPN (anahtar) simgesi bulunur.

Cihazı kullanan kişinin uygulamanızı kullanabilmesi için uygulamanızın kullanıcı arayüzü de sağlaması gerekir. hizmetinizin seçeneklerini yapılandırın. Örneğin, çözümünüzün hesap kimlik doğrulama ayarlarını yakalamalıdır. Uygulamalar aşağıdaki kullanıcı arayüzünü göstermelidir:

  • Bağlantıyı manuel olarak başlatma ve durdurma kontrolleri. Her zaman açık VPN bağlantı kurulabilir, ancak ilk olarak kişilerin bağlantıyı yapılandırmasına izin verilir VPN\u0027nizi kullandıklarında emin olun.
  • Hizmet etkin olduğunda kapatılamayan bir bildirim. Bildirim, bağlantı durumunu gösterebilir veya ağ istatistikleri gibi daha fazla bilgi sağlayabilir. Bildirime dokunduğunuzda uygulamanız ön plana çıkarılır. Şunu kaldırın: bildirim alırsınız.

VPN hizmeti

Uygulamanız bir kullanıcı (veya bir iş yeri) profili) bir VPN ağ geçidine bağlayın. Her kullanıcı (veya iş profili) bir başka bir VPN uygulaması kullanabilirsiniz. Sistemin VPN hizmeti oluşturup başlatmasını ve VPN'inizi durdurabilir ve bağlantı durumunu izleyebilirsiniz. VPN hizmetiniz şunları devralır: VpnService.

Hizmet aynı zamanda VPN ağ geçidi bağlantıları için kapsayıcınızdır ve yerel cihaz arayüzlerini kullanmak. Hizmet örneği çağrınız Yeni bir yerel arayüz oluşturmak için VpnService.Builder yöntemlerini.

Şekil 1. VpnService, Android'i nasıl bağlar? VPN ağ geçidi için ağ bağlantısı kurma
VpnService'in nasıl yerel bir TUN oluşturduğunu gösteren blok mimari diyagramı
         arayüz üzerinde.

Uygulamanız, cihazı VPN ağ geçidine bağlamak için aşağıdaki verileri aktarır:

  • Yerel arayüzün dosya tanımlayıcısından giden IP paketlerini okur, şifreler ve VPN ağ geçidine gönderir.
  • Gelen paketleri (VPN ağ geçidinden alınan ve şifresi çözülen) paketleri yerel arayüzün dosya tanımlayıcısı.
ziyaret edin.

Kullanıcı veya profil başına yalnızca bir etkin hizmet vardır. Yeni bir hizmet başlatılırken, mevcut bir hizmeti otomatik olarak durdurur.

Hizmet ekle

Uygulamanıza bir VPN hizmeti eklemek için şuradan bir Android hizmeti oluşturun: VpnService. Uygulamanızda VPN hizmetini beyan edin manifest dosyasını indirin:

  • Hizmeti BIND_VPN_SERVICE ile koruyun Böylece hizmetinize yalnızca sistemin bağlanabilmesi için izin vermeniz gerekir.
  • "android.net.VpnService" intent filtresiyle hizmetin reklamını yapın. bulabilirsiniz.

Bu örnekte, uygulama manifest dosyanızda hizmeti nasıl beyan edebileceğiniz gösterilmektedir:

<service android:name=".MyVpnService"
         android:permission="android.permission.BIND_VPN_SERVICE">
     <intent-filter>
         <action android:name="android.net.VpnService"/>
     </intent-filter>
</service>

Uygulamanız artık hizmeti beyan ettiğine göre sistem, ve gerektiğinde uygulamanızın VPN hizmetini durdurabilir. Örneğin sistem, her zaman açık VPN kullanırken yararlanabileceğiniz hizmetler hakkında daha fazla bilgi edinin.

Hizmet hazırlama

Uygulamayı kullanıcının mevcut VPN hizmeti olmaya hazırlamak için şu numarayı arayın: VpnService.prepare(). Cihazı kullanan kişi uygulamanız için zaten izin verilmişse yöntem bir etkinlik amacı döndürür. Bu niyeti, izin isteyen bir sistem etkinliği başlatmak için kullanırsınız. İlgili içeriği oluşturmak için kullanılan izin modu, aşağıdaki gibi diğer izin iletişim kutularına benzer bir iletişim kutusu gösterir. kamera veya kişilere erişim. Uygulamanız zaten hazırsa yöntem null

Şu anda hazırlanan VPN hizmeti yalnızca bir uygulama olabilir. Her zaman ara Kullanıcı farklı bir değer ayarlamış olabileceğinden VpnService.prepare() uygulamanızı VPN hizmeti olarak kullanıma sunduk. Daha fazla bilgi edinmek için bkz. Hizmet yaşam döngüsü bölümünde

Hizmet bağlayın

Hizmet çalışmaya başladıktan sonra, herkese açık olan yeni bir yerel arayüz oluşturabilirsiniz. bir VPN ağ geçidine bağlı olabilir. İzin istemek ve hizmetinize bağlanmak için: VPN ağ geçidini seçerseniz adımları aşağıdaki sırayla tamamlamanız gerekir:

  1. İzin istemek için VpnService.prepare() numaralı telefonu arayın (zaman gerekir).
  2. Uygulamanızın tünel yuvasını kullanmaya devam etmek için VpnService.protect() numaralı telefonu arayın VPN'nin dışına çıkın ve döngüsel bağlantıdan kaçının.
  3. Uygulamanızın tünelini bağlamak için DatagramSocket.connect() numaralı telefonu arayın VPN ağ geçidine bağlanır.
  4. Yeni bir yerel yapılandırma için VpnService.Builder yöntemlerini çağırın TUN arayüzünün VPN trafiği için bir cihaz.
  5. Sistemin etkinleştirilmesi için VpnService.Builder.establish() numaralı telefonu arayın yerel TUN arayüzünü oluşturur ve trafiği kullanır.

VPN ağ geçidi normalde bahsedeceğiz. Uygulamanız, aşağıdakileri yapılandırmak için VpnService.Builder yöntemlerini çağırır aşağıda gösterildiği gibi değiştirebilirsiniz:

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();

Uygulama başına VPN bölümündeki örnekte, aşağıdakileri içeren bir IPv6 yapılandırması gösterilmektedir: daha fazla seçenek. Aşağıdaki VpnService.Builder değerlerini eklemeniz gerekiyor yeni bir arayüz oluşturmadan önce:

addAddress()
Sistemin kullanabileceği bir alt ağ maskesiyle birlikte en az bir IPv4 veya IPv6 adresi ekleyin yerel TUN arayüz adresi olarak atar. Uygulamanız genellikle IP'yi alır VPN ağ geçidinden gelen adresler ve alt ağ maskeleri.
addRoute()
Sistemin trafiği VPN üzerinden göndermesini istiyorsanız en az bir rota ekleyin kullanır. Rotalar, hedef adreslerine göre filtrelenir. Tüm trafiği kabul etmek için 0.0.0.0/0 veya ::/0 gibi açık rotalar.

establish() yöntemi, Uygulamanızın okuma ve yazma için kullandığı ParcelFileDescriptor örneği veya arabelleğin arabelleğinden alınır. establish() yöntemi, uygulamanız hazır değilse veya birisinull izni gerekir.

Hizmet yaşam döngüsü

Uygulamanız, sistem tarafından seçilen VPN'nin ve etkin durumdaki tüm VPN'lerin durumunu izlemelidir. bağlantılar. haberdar olun.

Hizmet başlatma

VPN hizmetiniz aşağıdaki şekillerde başlatılabilir:

  • Uygulamanız, genellikle bir kişinin bağlan düğmesine dokunduğu için hizmeti başlatır.
  • Her zaman açık VPN etkin olduğu için sistem hizmeti başlatır.

Uygulamanız, VPN hizmetini startService(). Daha fazla bilgi edinmek için hizmet.

Sistem, şunu arayarak hizmetinizi arka planda başlatır: onStartCommand(). Ancak Android, mobil cihazlarda 8.0 (API Düzeyi 26) veya sonraki sürümlerdeki arka plan uygulamaları. Bu programları destekliyorsanız için bir çağrı çağırarak hizmetinizi ön plana geçirmeniz gerekir Service.startForeground(). Daha fazla bilgi edinmek için Bir arka planda çalışır.

Bir hizmeti durdurma

Cihazı kullanan bir kişi, uygulamanızın kullanıcı arayüzünü kullanarak hizmetinizi durdurabilir. Durdurun hizmete sunmamız gerekir. Sistem ayrıca etkin bir bağlantısı, cihazı kullanan kişi VPN ekranında aşağıdaki işlemleri yaptığında seçin:

  • VPN uygulamasının bağlantısı kesilir veya uygulamayı unutursa
  • etkin bir bağlantı için her zaman açık VPN'yi kapatır

Sistem, hizmetinizin onRevoke() yöntemini kullanır ancak bu çağrı, ana ileti dizisinde gerçekleşmeyebilir. Sistem bu yöntemi çağırdığında alternatif ağ arayüzü zaten trafiği yönlendiriyordur. Güvenle atabilirsiniz şu kaynaklardan yararlanabilirsiniz:

Her zaman açık VPN

Android, cihaz başlatıldığında bir VPN hizmeti başlatabilir ve bu sırada çalışmaya devam edebilir. cihazın açık olduğundan emin olun. Her zaman açık VPN adlı bu özelliğe şu platformlarda erişebilirsiniz: Android 7.0 (API Düzeyi 24) veya sonraki sürümler. Android, bu hizmeti sunmaya devam ederken VPN ağ geçidinden sorumlu VPN hizmetinizdir. bağlantı. Her zaman açık VPN, VPN kullanmayan bağlantıları da engelleyebilir.

Kullanıcı deneyimi

Android 8.0 veya sonraki sürümlerde sistem, cihazı kullanan kişi her zaman açık VPN'den haberdar olsun:

  • Her zaman açık VPN bağlantıları koptuğunda veya bağlanamadığında, kapatılamayan bildirimle karşılaşabilirsiniz. Bildirime dokunduğunuzda, ve daha fazlasını açıklar. VPN bağlantısı yeniden kurulduğunda veya birisi yeniden olduğunda bildirim kaybolur her zaman açık VPN seçeneğini kapatır.
  • Her zaman açık VPN, cihazı kullanan kişinin herhangi bir ağı engellemesine olanak tanır VPN'i kullanmayan bağlantılar. Bu seçenek etkinleştirildiğinde Ayarlar Uygulama, VPN'den önce kullanıcıları internet bağlantısının olmadığı konusunda uyarıyor bağlanır. Ayarlar uygulaması, cihazı kullanan kişiden devam etmesini veya iptal et.

Her zaman açık bağlantıyı başka bir insan değil de sistem başlatıp durdurduğu için, Uygulamanızın davranışını ve kullanıcı arayüzünü uyarlamanız gerekir:

  1. Sistem ve Ayarlar, bağlantıyı kontrol etmesi gerekir.
  2. Her uygulama başlangıcı arasındaki yapılandırmaları kaydedin ve en son ayarlar. Sistem, uygulamanızı istek üzerine başlattığından, kullanıcı her zaman bir bağlantı yapılandırmak istemeyebilir.

Ayrıca, bir yapılandırma dosyasını yapılandırmak için yönetilen yapılandırmaları da bağlantı. Yönetilen yapılandırmalar, bir BT yöneticisinin VPN'inizi uzaktan yapılandırmasına yardımcı olur.

Her zaman açık olduğunu algıla

Android, sistemin VPN'inizi başlatıp başlatmadığını doğrulayan API'ler içermez. geliştirmenizi sağlar. Ancak uygulamanız başlatıldığı bir hizmet örneğini işaretlediğinde sistemin her zaman açık VPN için işaretlenmemiş hizmetler başlattığını bildirmiştiniz. Örnek:

  1. VPN hizmetini başlatmak için bir Intent örneği oluşturun.
  2. Niyete fazladan bir şey ekleyerek VPN hizmetini işaretleyin.
  3. Hizmetin onStartCommand() yönteminde flag'ini intent bağımsız değişkeninin ekstralarına ekleyin.

Engellenen bağlantılar

Cihazı kullanan bir kişi (veya bir BT yöneticisi), tüm trafikte VPN'i kullanmaya zorlayabilir. Sistem, VPN kullanmayan tüm ağ trafiğini engeller. cihaz, VPN seçeneklerinde VPN'si olmayan bağlantıları engelle anahtarını bulabilir Ayarlar'da kontrol edin.

Her zaman açık özelliğini devre dışı bırak

Uygulamanız şu anda her zaman açık VPN'yi desteklemiyorsa bu özelliği devre dışı bırakabilirsiniz (Android'de 8.1 veya daha yeni bir sürüm) SERVICE_META_DATA_SUPPORTS_ALWAYS_ON hizmet meta verilerini false hizmetine gönderir. Aşağıdaki uygulama manifesti örneğinde, meta veri öğesidir:

<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>

Uygulamanız her zaman açık VPN'yi devre dışı bıraktığında sistem, seçenekler kullanıcı arayüzünü devre dışı bırakır Ayarlar'da kontrol edin.

Uygulama başına VPN

VPN uygulamaları, VPN bağlantısı. İzin verilenler listesi veya izin verilmeyenler listesi oluşturabilirsiniz. ancak her ikisi birden değil. İzin verilen veya verilmeyen listeler oluşturmazsanız sistem, VPN üzerinden gelen trafiktir.

Bağlantı kurulmadan önce VPN uygulamanız listeleri ayarlamalıdır. Şu durumda: listeleri değiştirmeniz ve yeni bir VPN bağlantısı kurmanız gerekir. Uygulama, Cihazda yüklü olarak gelir.

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();

İzin verilen uygulamalar

Bir uygulamayı izin verilenler listesine eklemek için şu numarayı arayın: VpnService.Builder.addAllowedApplication(). Eğer Listede bir veya daha fazla uygulama varsa yalnızca listedeki uygulamalar VPN kullanır. Listede olmayan diğer tüm uygulamalar, sistem ağlarını VPN çalışmıyor. İzin verilenler listesi boş olduğunda tüm uygulamalar VPN'i kullanır.

İzin verilmeyen uygulamalar

İzin verilmeyenler listesine bir uygulama eklemek için şu çağrıyı yapın: VpnService.Builder.addDisallowedApplication(). İzin verilmeyen uygulamalar, VPN çalışmıyormuş gibi sistem ağını kullanır. Diğer tüm uygulamalar VPN\u0027i kullanır.

VPN'yi atla

VPN'niz, uygulamaların VPN'i atlayıp kendi ağını seçmesine izin verebilir. Alıcı: VPN'yi atlayın, şu durumlarda VpnService.Builder.allowBypass() adlı restoranı arayın: VPN arayüzü kurma. VPN hizmeti. Bir uygulama, işlemini veya bir soketi belirli bir işleme bağlamazsa ağında, uygulamanın ağ trafiği VPN üzerinden devam eder.

Belirli bir ağa bağlanan uygulamaların, birisi VPN'den geçmeyen trafiği engeller. Trafiği belirli bir ağ, uygulamalar çağrı yöntemleri, ConnectivityManager.bindProcessToNetwork() veya Prizi bağlamadan önce Network.bindSocket().

Örnek kod

Android Açık Kaynak Projesi, ToyVPN adlı örnek bir uygulama içerir. Bu uygulamada, VPN hizmetinin nasıl ayarlanıp bağlanacağı gösterilmektedir.