VpnService protect() mı uygulama hariç tutma mı: yönlendirmeyi asıl hangisi düzeltir
Tüneli taşıyan soketi koruyun ya da tüm uygulamayı hariç tutun: Android VPN'inizin hangi kapsama ihtiyacı olduğunu belirleyen üç koşul.
Tünelin kendi paketlerini tünelin dışında tutmanın iki yolu vardır: taşıma soketini korumak ya da tüm uygulamayı VPN'den çıkarmak. Farklı sorunları çözerler ve bağlaması daha kolay diye daha geniş olanı seçmek, uygulamaların yerel ağ erişimini ve bölünmüş DNS'i fark etmeden kaybetmesinin tam nedenidir. Tünelin dışında kalması gerekenle başlayın, sonra bunu başaran en küçük kapsamı seçin.
protect() tünelden neyi çıkarır
VpnService.protect() soket başına yapılan bir çağrıdır. Tüneli taşıyan soketi ya da tanımlayıcıyı ona verirsiniz ve Android o soketi, trafiği VPN arayüzü yerine altındaki ağı kullanacak şekilde işaretler. Uygulamanın gönderdiği diğer her şey normal VPN yolunu izlemeye devam eder.
Asıl mesele bu dar kapsamdır. Korunan bir soket, HTTP istemcinizin adları nasıl çözümlediğini, analiz çağrılarınızın hangi arayüzü kullandığını ya da sonradan açılan ikinci bir bağlantıya ne olduğunu değiştirmez.
Kapsamı belirleyen üç koşul
Birinci koşul, yalnızca tünelin taşımasının mı dışarı çıkması gerektiğidir. Uygulamanın diğer trafiği hâlâ VPN üzerinden gitmeli ise doğru kapsam soket korumasıdır. İkinci koşul, soket oluşturmayı sizin kontrol edip etmediğinizdir. Kendi soketini derinde açan bir kitaplık, bir kanca sunmadıkça ya da hazır kurulmuş bir soketi kabul etmedikçe size protect() çağıracak yer bırakmaz. Üçüncü koşul, uygulamanın yerel ağa ya da yakalama portalına doğrudan ulaşması gerekip gerekmediğidir; bu, tüneli canlı tutmaktan farklı bir gereksinimdir.
Uygulamayı addDisallowedApplication() ile hariç tutmak künt bir araçtır. Uygulamanın kurduğu her bağlantıyı, incelemek istedikleriniz dahil, VPN'den çıkarır ve bazı cihazlarda yerel keşfin davranışını da değiştirir.
Üçüncü seçenek, taşımayı bindProcessToNetwork() ya da soket düzeyinde bir ağ tutamacıyla seçilen bir ağa bağlamaktır. Cihazda aynı anda Wi-Fi ve hücresel varsa ve tünelin belirli bir yukarı akıştan gitmesini istiyorsanız bu kullanışlıdır.
Taşıma oluşturulurken çağırın
protect() çağrısını taşımayı oluşturan aynı blokta, connect() ya da send() öncesinde yapın. Çağrı false dönerse soketi kapatın ve kurulum başarısız olsun; devam etmek, paketleri kendi arayüzünüze yeniden girebilecek bir taşımayla kalmanıza yol açar.
Biçim tek bir yerde tutulacak kadar küçük:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);Burada üç ayrıntı can yakıyor. Birincisi, elde ettiğiniz tek sinyal boolean değerdir, bu yüzden hatayı iptal edilmiş bir izni reddedilmiş bir çağrıdan ayırt edecek kadar bağlamla kaydedin. İkincisi, protect() tanımlayıcı numarasını değil soketi kapsar: soketi kapatıp sonra aynı tam sayıyı başka bir soket için kullanırsanız yeni soket korunmaz. Üçüncüsü, taşımayı yerel bir kitaplık açıyorsa, yerel kod bağlanmadan önce tanımlayıcıyı koruyun, yoksa rota çoktan seçilmiş olabilir. VpnService başvurusu, hedef API düzeyinizin gerçekte sunduğu aşırı yüklemeleri doğrulayacağınız yerdir.
Engellenen yolu da test edin, yalnızca sorunsuz olanı değil
Tünel açıkken doğrulayın, çünkü iki yolun farklılaşabildiği tek durum budur. Bir isteği korunan taşımadan, birini de protect() hiç çağırmamış bir kod yolundan gönderin, sonra uzak ucun gördüğünü karşılaştırın: korunan bağlantı kaynak olarak altındaki ağla gelmelidir, korunmayan ise tünelin kendi adresini gösterir ve tünelin bayt sayaçlarını oynatır. Cihazda ss ya da netstat, herhangi bir şey radyodan çıkmadan önce aynı ayrımı gösterir.
İptali ayrı test edin, çünkü bir izin değişikliği soket kodunuza dokunmadan arayüzü yıkar. VPN iznini iptal edin ya da hizmeti durdurun, taşımayı yeniden kurun ve protect() çağrısının hâlâ true döndüğünü ve izin yeniden verildiğinde taşımanın yeniden bağlandığını doğrulayın.
Korunan istek yine de tüneli izliyorsa koruma çağrısı muhtemelen soket zaten yönlendirildikten sonra yapılıyordur. Daha erken bir noktaya taşıyın ve yeniden test edin.
Kararı taşıma kurulumunun yanında yazılı tutun: hangi soketler korunuyor, hangi uygulama trafiği hariç tutuluyor ve koruma başarısız olduğunda uygulama ne yapıyor. Sonraki bir yeniden düzenlemenin, tek bir test başarısız olduğu için hariç tutmayı tüm uygulamaya genişletmesini engelleyen o satırdır. Ayrıca bir sonraki kişiye manifesti tersine mühendislik yapmadan amacı denetleme yolu verir.