გვირაბის საკუთარი პაკეტების გვირაბის გარეთ შენახვის ორი გზა არსებობს: დაიცავით სატრანსპორტო სოკეტი ან ამოიღეთ მთელი აპი VPN-იდან. ისინი სხვადასხვა პრობლემას ხსნიან და უფრო ფართოს არჩევა იმიტომ, რომ მისი მიერთება უფრო ადვილია, სწორედ ის გზაა, რომლითაც აპები ვერ ამჩნევენ, რომ კარგავენ წვდომას ლოკალურ ქსელზე და გაყოფილ DNS-ზე. დაიწყეთ იმით, რაც გვირაბის გარეთ უნდა დარჩეს, შემდეგ აირჩიეთ ყველაზე მცირე მოცულობა, რომელიც ამას აღწევს.

რას შლის protect() გვირაბიდან

VpnService.protect() არის გამოძახება თითო სოკეტზე. თქვენ გადასცემთ მას გვირაბის მატარებელ სოკეტს ან დესკრიპტორს და Android აღნიშნავს ამ სოკეტს ისე, რომ მისი ტრაფიკი VPN ინტერფეისის ნაცვლად ქვედა ქსელს იყენებდეს. ყველაფერი დანარჩენი, რასაც აპი აგზავნის, კვლავ ჩვეულებრივ VPN მარშრუტს მიჰყვება.

სწორედ ეს ვიწრო მოცულობაა არსი. დაცული სოკეტი არ ცვლის, როგორ ხსნის სახელებს თქვენი HTTP კლიენტი, რომელ ინტერფეისს იყენებს თქვენი ანალიტიკის გამოძახებები ან რა ხდება მოგვიანებით გახსნილ მეორე კავშირთან.

სამი პირობა, რომლებიც განსაზღვრავს მოცულობას

პირველი პირობაა, მხოლოდ გვირაბის ტრანსპორტი უნდა გავიდეს თუ არა. თუ აპის დარჩენილი ტრაფიკი კვლავ VPN-ით უნდა გაიაროს, სოკეტის დაცვა სწორი მოცულობაა. მეორე პირობაა, აკონტროლებთ თუ არა სოკეტის შექმნას. ბიბლიოთეკა, რომელიც საკუთარ სოკეტს შიგნით ღრმად ხსნის, არ გიტოვებთ ადგილს, რომ გამოიძახოთ protect(), თუ ის hook-ს არ ამხელს ან მზა სოკეტს არ იღებს. მესამე პირობაა, აპმა პირდაპირ უნდა მიაღწიოს ლოკალურ ქსელს თუ captive portal-ს, რაც გვირაბის ცოცხლად შენარჩუნებისგან განსხვავებული მოთხოვნაა.

აპის გამორიცხვა addDisallowedApplication()-ით უხეში იარაღია. ის VPN-იდან შლის აპის ყველა კავშირს, მათ შორის იმათაც, რომელთა შემოწმებაც გინდოდათ, და ზოგიერთ მოწყობილობაზე ლოკალური აღმოჩენის ქცევასაც ცვლის.

მესამე ვარიანტია ტრანსპორტის არჩეულ ქსელზე მიბმა bindProcessToNetwork()-ით ან სოკეტის დონის ქსელური სახელურით. ეს სასარგებლოა, როცა მოწყობილობას ერთდროულად აქვს Wi-Fi და მობილური ქსელი და გსურთ გვირაბი კონკრეტული ასასვლელი არხით წავიდეს.

გამოიძახეთ ის, სანამ ტრანსპორტი იქმნება

გამოიძახეთ protect() იმავე ბლოკში, რომელიც ტრანსპორტს ქმნის,connect() ან send()-მდე. თუ გამოძახება false-ს აბრუნებს, დახურეთ სოკეტი და ჩააფლავეთ კონფიგურაცია; გაგრძელება გტოვებთ ტრანსპორტთან, რომლის პაკეტებიც შეიძლება თქვენსავე ინტერფეისში დაბრუნდეს.

ფორმა საკმარისად მცირეა, რომ ერთ ადგილას შენარჩუნდეს:

DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
    transport.close();
    throw new IOException("transport not protected");
}
transport.connect(serverAddress);

სამი დეტალი კბენს აქ. პირველი,boolean ერთადერთი სიგნალია, რომელსაც იღებთ, ამიტომ ჩაწერეთ მარცხი საკმარისი კონტექსტით, რომ გაარჩიოთ გაუქმებული თანხმობა უარყოფილი გამოძახებისგან. მეორე,protect() ფარავს სოკეტს და არა დესკრიპტორის ნომერს: თუ სოკეტს დახურავთ და მოგვიანებით იმავე მთელ რიცხვს სხვა სოკეტისთვის გამოიყენებთ, ახალი სოკეტი დაცული არ არის. მესამე, როცა native ბიბლიოთეკა ხსნის ტრანსპორტს, დაიცავით დესკრიპტორი მანამ, სანამ native კოდი დაუკავშირდება, თორემ მარშრუტი შესაძლოა უკვე არჩეული იყოს.VpnService-ის ცნობარი არის ადგილი, სადაც ადასტურებთ, თუ რომელ გადატვირთვებს გთავაზობთ სინამდვილეში თქვენი სამიზნე API დონე.

გამოსცადეთ დაბლოკილი გზა და არა მხოლოდ ბედნიერი

შეამოწმეთ გვირაბის აწეული მდგომარეობით, რადგან ეს ერთადერთი მდგომარეობაა, როცა ორი გზა შეიძლება განსხვავდებოდეს. გაგზავნეთ ერთი მოთხოვნა დაცული ტრანსპორტით და ერთიც კოდის გზიდან, რომელსაც არასოდეს გამოუძახია protect(), შემდეგ შეადარეთ, რას ხედავს შორეული მხარე: დაცული კავშირი უნდა მოვიდეს ქვედა ქსელით როგორც წყაროთი, ხოლო დაუცველი აჩვენებს თავად გვირაბის მისამართს და მოძრაობს გვირაბის ბაიტურ მთვლელებს. მოწყობილობაზე ss ან netstat-ს იგივე გაყოფა აჩვენებს, სანამ რამე რადიოდან გავა.

გაუქმება ცალკე გამოსცადეთ, რადგან თანხმობის ცვლილება ანგრევს ინტერფეისს თქვენი სოკეტის კოდის შეხების გარეშე. გააუქმეთ VPN-ის თანხმობა ან შეაჩერეთ სერვისი, თავიდან ააგეთ ტრანსპორტი და დაადასტურეთ, რომ protect() კვლავ აბრუნებს true-ს და ტრანსპორტი ხელახლა უკავშირდება, როგორც კი თანხმობა კვლავ მიეცემა.

თუ დაცული მოთხოვნა მაინც მიჰყვება გვირაბს, დაცვის გამოძახება, სავარაუდოდ, ხდება მას შემდეგ, რაც სოკეტი უკვე მარშრუტიზებულია. გადაიტანეთ უფრო ადრე და ხელახლა გამოსცადეთ.

შეინახეთ გადაწყვეტილება ჩაწერილი ტრანსპორტის კონფიგურაციის გვერდით: რომელი სოკეტებია დაცული, რომელი აპის ტრაფიკია გამორიცხული და რას აკეთებს აპი, როცა დაცვა ვერ ხერხდება. სწორედ ეს ხაზი უშლის ხელს მოგვიანებით რეფაქტორს გააფართოოს გამორიცხვა მთელ აპზე იმიტომ, რომ ერთი ტესტი ვარდებოდა. ის ასევე აძლევს შემდეგ ადამიანს განზრახვის შემოწმების გზას მანიფესტის უკუღმა ინჟინერიის გარეშე.

დაკავშირებული სტატიები