VPN per aplikasi di Android: mengecualikan aplikasi bukan memblokirnya
Daftar per aplikasi di layar milik satu pemilik terowongan, dan mengecualikan aplikasi mengarahkannya di sekitar terowongan itu, bukan keluar dari jaringan. Mulailah dari sana.
Dua orang mengajukan pertanyaan yang sama dan mendapat jawaban yang tidak sejalan, karena mereka berdiri di tempat berbeda. Yang satu membuka layar pengaturan VPN sistem dan menyunting daftar aplikasi. Yang lain menulis VpnService.Builder.addDisallowedApplication() di editor. Keduanya menyebutnya filter VPN per aplikasi. Hanya satu dari mereka yang memiliki kendali yang mereka gambarkan, dan tidak satu pun sedang memblokir apa pun.
Mulailah dari layar yang dilihat pengguna
Buka Pengaturan, temukan entri VPN dan lihat koneksi yang benar-benar aktif. Jika klien menawarkan daftar per aplikasi, daftar itu milik terowongan klien itu sendiri. Platform tidak menerbitkan API umum yang memungkinkan aplikasi tak terkait membaca atau menyunting pilihan aplikasi VPN lain, jadi aplikasi kedua tidak dapat memperbaiki daftar itu untuk pengguna.
Inilah percabangan pertama dalam penelusuran. Jika VPN yang terpasang tidak punya pengaturan itu, tidak ada yang perlu dikodekan: fitur itu tidak ada pada produk yang memiliki terowongan. Jika punya, perbaikan yang benar ada di layar itu, dilakukan oleh orang yang bisa membukanya.
Ikuti paket ke dalam terowongan
Saat aplikasi Anda sendiri membangun terowongan, ia membuat antarmuka TUN dan menyatakan lalu lintas aplikasi mana yang masuk ke dalamnya. Panggilan keanggotaan terjadi sebelum antarmuka dibangun, dan setelah itu rangkaian aturan tetap untuk sesi tersebut:
val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish() // membership decided herePanggilan itu hanya berlaku untuk terowongan yang baru dibuat aplikasi Anda dan tidak untuk hal lain. Itu bukan kebijakan seluruh perangkat, tidak bertahan untuk klien lain, dan tidak dapat menjangkau VPN orang lain. Ketika panggilan pembangun melempar pengecualian karena paket tidak dapat diselesaikan, antarmuka tidak pernah dibangun, yang merupakan kegagalan bersih, bukan kegagalan senyap.
Mengapa pengecualian tampak seperti blokir
Aplikasi yang dikecualikan dirutekan di sekitar terowongan Anda ke jaringan di bawahnya. Itu kebalikan dari memblokirnya: lalu lintas tetap keluar dari perangkat, hanya di luar antarmuka yang Anda kendalikan. Aplikasi bergaya tembok api melakukan sebaliknya. Ia menerima lalu lintas aplikasi ke terowongannya lalu membuang paket, atau menolak meneruskannya, sehingga antarmukanya sama dan arah kebijakannya terbalik.
Pekerjaan di balik pembalikan itu bukan sebuah flag konfigurasi. Anda membaca paket IP dari deskriptor terowongan, memutuskan per aliran, lalu meneruskannya melalui soket terlindungi atau membuangnya. Apa pun yang tidak Anda tangani berhenti begitu saja, dan itulah sebabnya terowongan setengah jadi tampak seperti jaringan rusak, bukan filter yang bekerja. Jika tujuan Anda adalah blokir, anggarkan penanganan paket, layanan latar depan, dan kebijakan tertulis untuk lalu lintas yang tidak dapat Anda klasifikasikan.
Apa yang rusak saat Anda membangunnya sendiri
Android umumnya hanya mengizinkan satu VPN aktif pada satu waktu, jadi terowongan penyaring Anda dan terowongan privasi bersaing untuk slot yang sama kecuali produknya mendukung perantaian. VPN selalu aktif dengan blokir koneksi mengubah cara kegagalan dengan cara yang penting di sini: lalu lintas yang tidak dapat masuk ke terowongan dibuang alih-alih dikirim langsung, yang diinginkan rancangan pencegahan kebocoran dan yang jarang diharapkan sesi debugging.
Visibilitas paket adalah jebakan kedua. Menyelesaikan nama paket aplikasi bisa gagal dengan NameNotFoundException, dan pada versi Android yang lebih baru, kumpulan paket yang dapat Anda lihat bergantung pada kueri yang Anda deklarasikan. Tangani pengecualian itu alih-alih menganggap setiap nama dapat diselesaikan, dan baca ulang daftar saat aplikasi dipasang atau dihapus alih-alih menyimpannya di cache selamanya.
Perangkat terkelola menambahkan pemilik ketiga. Kebijakan mobilitas perusahaan dapat menetapkan VPN per aplikasi atau profil selalu aktif, dan aplikasi biasa tidak dapat menimpanya. Periksa apakah perangkat dikelola sebelum men-debug kode Anda sendiri, karena dalam kasus itu daftar yang Anda coba ubah mungkin tidak dapat disunting oleh siapa pun yang memegang telepon.
Ujilah dengan aplikasi yang Anda kendalikan
Jangan menguji dengan aplikasi yang Anda coba saring. Gunakan aplikasi kedua yang perilaku jaringannya dapat Anda amati, dan periksa apakah lalu lintasnya keluar melalui terowongan Anda sementara lalu lintas target tidak. Jika keduanya tetap di dalam, kebijakannya bekerja dan target dikecualikan; jika tidak ada yang keluar, terowongannya sendiri yang salah dan daftar aplikasi bukan masalahnya.
Lalu putuskan mana dari tiga hal yang sebenarnya Anda bangun. Terowongan per aplikasi adalah API pembangun, dengan daftar sebagai bagian dari profil Anda. Tembok api perangkat adalah penanganan paket plus siklus hidup yang dapat Anda pertahankan. Mengubah VPN orang lain sama sekali bukan jalur yang didukung, dan jawaban jujurnya di sana adalah bahwa pengaturan itu milik produk tersebut.