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.
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ı.
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:
- İzin istemek için
VpnService.prepare()
numaralı telefonu arayın (zaman gerekir). - 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. - Uygulamanızın tünelini bağlamak için
DatagramSocket.connect()
numaralı telefonu arayın VPN ağ geçidine bağlanır. - 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. - 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:
- Şu numarayı arayarak korumalı tünel soketini VPN ağ geçidine kapatın:
DatagramSocket.close()
. - Şu kodu kullanarak paket dosyası açıklayıcısını kapatın (boşaltmanız gerekmez)
ParcelFileDescriptor.close()
.
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:
- Sistem ve Ayarlar, bağlantıyı kontrol etmesi gerekir.
- 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:
- VPN hizmetini başlatmak için bir
Intent
örneği oluşturun. - Niyete fazladan bir şey ekleyerek VPN hizmetini işaretleyin.
- Hizmetin
onStartCommand()
yönteminde flag'iniintent
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.