VpnService protect() və ya tətbiqi istisna etmək: marşrutlaşdırmanı hansı düzəldir
Tuneli daşıyan soketi qoruyun, ya da bütün tətbiqi istisna edin: Android VPN-inizin hansı əhatəyə ehtiyacı olduğunu təyin edən üç şərt.
Tunelin öz paketlərini tuneldən kənarda saxlamağın iki yolu var: daşıyıcı soketi qorumaq, ya da bütün tətbiqi VPN-dən çıxarmaq. Onlar fərqli problemləri həll edir və daha geniş olanı qurmaq daha asan olduğu üçün seçmək, tətbiqlərin yerli şəbəkə çıxışını və bölünmüş DNS-i fərq etmədən itirməsinin yoludur. Tuneldən kənarda qalmalı olanlardan başlayın, sonra buna nail olan ən kiçik əhatəni seçin.
protect() tuneldən nəyi çıxarır
VpnService.protect() hər soket üçün çağırışdır. Ona tuneli daşıyan soketi və ya deskriptoru verirsiniz və Android həmin soketi işarələyir ki, onun trafiki VPN interfeysi əvəzinə altlıq şəbəkədən istifadə etsin. Tətbiqin göndərdiyi qalan hər şey normal VPN marşrutunu izləyir.
Bu dar əhatə məqsədin özüdür. Qorunan soket HTTP müştərinizin adları necə həll etdiyini, analitika çağırışlarınızın hansı interfeysdən istifadə etdiyini və ya sonradan açılan ikinci bağlantıya nə olduğunu dəyişmir.
Əhatəni təyin edən üç şərt
Birinci şərt yalnız tunel daşıyıcısının çıxmasının lazım olub-olmamasıdır. Tətbiqin digər trafiki yenə VPN-dən keçməlidirsə, soket qoruması düzgün əhatədir. İkinci şərt soket yaradılmasına nəzarət edib-etməməyinizdir. Daxildə öz soketini açan kitabxana bir qarmaq təqdim etmirsə və ya hazır soketi qəbul etmirsə, sizə protect() çağırmaq üçün yer qoymur. Üçüncü şərt tətbiqin yerli şəbəkəyə və ya captive portal-a birbaşa çıxmalı olub-olmamasıdır ki, bu tuneli canlı saxlamaqdan fərqli bir tələbdir.
Tətbiqi addDisallowedApplication() ilə istisna etmək kobud vasitədir. O, tətbiqin açdığı hər bağlantını VPN-dən çıxarır, o cümlədən yoxlamaq istədiklərinizi, və bəzi cihazlarda yerli kəşfin davranışını da dəyişir.
Üçüncü variant daşıyıcını seçilmiş şəbəkəyə bağlamaqdır:bindProcessToNetwork() və ya soket səviyyəsində şəbəkə tutacağı ilə. Bu, cihazda eyni vaxtda Wi-Fi və mobil şəbəkə olduqda və tunelin müəyyən yuxarı kanaldan getməsini istədikdə faydalıdır.
Onu daşıyıcı yaradılarkən çağırın
Çağırın protect()-i daşıyıcının yaradıldığı blokda,connect() və ya send()-dən əvvəl. Əgər çağırış false qaytarırsa, soketi bağlayın və quraşdırmanı uğursuz edin; davam etmək sizi paketləri öz interfeysinizə yenidən girə bilən daşıyıcı ilə qoyur.
Forma bir yerdə saxlamaq üçün kifayət qədər kiçikdir:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);Burada üç detal dişləyir. Birincisi,boolean sizin aldığınız yeganə siqnaldır, ona görə uğursuzluğu ləğv edilmiş razılığı rədd edilmiş çağırışdan ayırmağa yetən kontekstlə qeyd edin. İkincisi,protect() deskriptor nömrəsini deyil, soketi əhatə edir: soketi bağlayıb sonra eyni tam ədədi başqa soket üçün təkrar istifadə etsəniz, yeni soket qorunmur. Üçüncüsü, native kitabxana daşıyıcını açanda, native kod qoşulmadan əvvəl deskriptoru qoruyun, əks halda marşrut artıq seçilmiş ola bilər.VpnService istinadı hədəf API səviyyənizin həqiqətən təqdim etdiyi həddən artıq yükləmələri təsdiqləmək üçün yerdir.
Bloklanmış yolu sınayın, yalnız xoşbəxt yolu deyil
Tunel işləyərkən yoxlayın, çünki iki yolun fərqlənə biləcəyi yeganə vəziyyət budur. Qorunan daşıyıcıdan bir sorğu, heç vaxt protect() çağırmayan kod yolundan da bir sorğu göndərin, sonra uzaq tərəfin gördüyünü müqayisə edin: qorunan bağlantı mənbə kimi altlıq şəbəkə ilə gəlməlidir, qorunmayan isə tunelin öz ünvanını göstərir və tunelin bayt sayğaclarını hərəkət etdirir. Cihazda ss və ya netstat heç nə radiodan çıxmadan əvvəl eyni bölgünü göstərir.
Ləğvi ayrıca yoxlayın, çünki razılıq dəyişikliyi soket kodunuza toxunmadan interfeysi sökür. VPN razılığını ləğv edin və ya xidməti dayandırın, daşıyıcını yenidən qurun və təsdiqləyin ki,protect() hələ də true qaytarır və razılıq yenidən verildikdən sonra daşıyıcı yenidən qoşulur.
Qorunan sorğu yenə də tuneli izləyirsə, qoruma çağırışı yəqin ki, soket artıq marşrutlaşdırıldıqdan sonra baş verir. Onu daha erkənə köçürün və yenidən sınayın.
Qərarı daşıyıcı quraşdırmasının yanında yazılı saxlayın: hansı soketlər qorunur, hansı tətbiq trafiki istisna edilir və qoruma uğursuz olduqda tətbiq nə edir. Bu sətir sonrakı yenidən qurmanın bir test uğursuz olduğu üçün istisnanı bütün tətbiqə genişləndirməsinin qarşısını alan şeydir. O, həm də növbəti şəxsə manifesti tərsinə mühəndislik etmədən niyyəti yoxlamaq imkanı verir.