April 12, 2020

როგორ მოვატყუოთ პროვაიდერი და გვერდით აუაროთ DPI-ს?

DPI (Deep Packet Inspection) — არის ტექნოლოგია, რომლის საშუალებითაც შეგიძლიათ შეაგროვოთ სტატისტიკური ინფორმაცის შეგროვება პაკეტებიდან, შეამოწმოთ ისინი და, რა თქმა უნდა, გაფილტროთ ინფორმაცია, პაკეტის შინაარსიდან გამომდინარე. ზოგჯერ ოპერატორები მთელ ოქმებს ამ ტექნოლოგიით აფილტრებენ, მაგალითად BitTorrent.

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

DPI-ს გვერდით ავლა

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

HTTP

ტიპიური HTTP მოთხოვნა (ეს იგზავნება ყველა ცნობილი ბრაუზერის მიერ) შემდეგნაირად:

GET /index.php HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: keep-alive

ყველა სათაური იწყება მთავრული ასოებით, შემდეგ მოდის ორი წერტილი, შემდეგ ერთი გამოტოვება, სათაურის მნიშვნელობა და ხაზის ბოლოს, როგორც CRLF (\ r\n).

გადახედეთ RFC 7230:

Each header field consists of a case-insensitive field name followed
by a colon (":"), optional leading whitespace, the field value, and
optional trailing whitespace.

ამის თანახმად, სათაურიები არ არიან მგრძნობიარები რეგისტრორისადმი, და ორი წერტილის შემდეგ შეიძლება იყოს ნებისმიერი რაოდენობის სივრცე/დაშორება. ეს იმას ნისნავს რომ, DPI შეიძლება გავტეხოთ «Host:»-შეცვლით «hOsT:»-ზე.

Большинство серверов примет пакет и если заменить символ конца строки с CRLF (\r\n) на LF (\n).

სერვერების უმეტესობა მიიღებს პაკეტს და თუ ხაზის სიმბოლოების ბოლოს შეცვალეთ CRLF(\ r\n)-ი LF (\n)-ზე.

HTTPS

HTTPS- ის შემთხვევაში, DPI ეძებენ დაუშიფრავ SNI ველს, რომელიც შეიცავს საიტის მისამართს. შესაძლებელია SNI ველის შეცვლა, მაგრამ ამისათვის აუცილებელია სისტემის ბიბლიოთეკების მოდიფიცირება, ამიტომ HTTPS დაბლოკვის გვერდით ავლისთვის გამოიყენება პაკეტების ფრაგმენტაცია. რომელიც, შიეძლება გამოიყენებოდეს HTTP-სათვისაც. საქმე იმაშია, რომ თითქმის ყველა DPI-ს შეუძლია მხოლოდ ჩალკე აღებულ პაკეტებთან მუშაობა, და მათ არ შეუძლიათ წაიკითხონ ყველა კავშირი, ასე რომ უბრალოდ საკმარისია გაუგზავნოთ მოთხოვნა საიტს რამდენიმე TCP პაკეტის სახით.

DNS

ყველა წინა მეთოდი არ ვარგა, თუ საიტის მისამართი არასწორად არის განსაზღვრული DNS სერვერის დონეზე. საქმე იმაშია, რომ მრავალი ოპერატორი DNS მოთხოვნების გადამისამართებას ახდენს მათ სერვერზე და თუ საიტი დაბლოკილია, ისინი უგზავნიან არასწორ პასუხს. იგი წყდება DNS over HTTPS პროტოკოლის გამოყენებით.

როგორ მოვატყუოთ და გვერდით ავუაროთ DPI-ს?

Windows-ისა და Linux-ისთვის, არსებობს უკვე არსებობს ამ პრობლემის მოგვარება, როგორცაა GoodbyeDPI და GreenTunnel, მაგრამ android- სთვის ბოლო დრომდე მსგავსი არაფერი ყოფილა, ამიტომ გადავწყვიტე შემექმნა საკუთარი პროგრამა და გამოვიდა DPITunnel.

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

როგორ გამოვიყენოთ DPITunnel?

Если есть root, то в настройках программы выбрать «Установить DPITunnel прокси глобально» и нажать кнопку на главном экране, если root нет, то нажать кнопку на главном экране и выставить прокси в ручную в настройках WiFi или APN. Адрес прокси: 127.0.0.1, порт тот, что указан в настройках программы.

თუ გაქვთ root, მაშინ პროგრამის პარამეტრებში აირჩიეთ "Install DPITunnel proxy globally" და დააჭირეთ ღილაკს მთავარ ეკრანზე, თუ root არ გაქვთ, მაშინ დააჭირეთ ღილაკს მთავარ ეკრანზე და დააყენეთ პროქსი თქვენით, WiFi ან APN პარამეტრებში. პროქსი მისამართი: 127.0.0.1, პორტი არის ის,რომელიც პროგრამის პარამეტრებში არის მითითებული.

ცნობილი ბაგები

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