Додадовте домен на листата на дозволени, барањето стигнува до вашата апликација, споредувачот враќа дозволено, а страницата сепак никогаш не се вчитува. Во тој момент повеќето почнуваат да го препишуваат споредувачот и да додаваат споредби со џокери. Според моето искуство споредувачот обично е точен, а дефектот лежи еден слој подолу: во одговорот DNS што сте го синтетизирале, во маршрутата што сте ја инсталирале или во сокетот што сте го користеле за проследување на барањето. Листата е лесниот дел; патеката на пакетот е местото каде што листите на дозволени се кршат.

Споредувачот ретко е виновникот

Првото нешто што треба да се одвои е блокирано од расипано. Блокираното име треба брзо и видливо да пропадне, бидејќи прелистувачот добива одговор дека името не постои и запира. Расипаното име виси, повторува обиди преку IPv6, преминува на друг транспорт и ве остава со вртечки индикатор. Ако видите вртечки индикатор, вашата листа на дозволени најверојатно одговара со нешто со што клиентот не може ништо да направи.

Празниот запис A е класичната грешка. Враќањето NOERROR со нула одговори изгледа како валиден одговор, па stub резолверот го прифаќа, прелистувачот повторува, пробува AAAA, пробува друг резолвер и се откажува многу подоцна. Кодот на одговор 3, односно NXDOMAIN, со повторен дел за прашање и копиран ID на трансакцијата, веднаш ја завршува конверзацијата. Користете го за секое име што намерно го одбивате.

IPv6 исто така заслужува истата одлука, а не стандардна вредност. Ако одговорите NXDOMAIN за A и пуштете AAAA, клиентот може да стигне до блокираното име преку IPv6 и филтерот истекува. Некои имплементации на блокирани барања AAAA одговараат со loopback адреса за врската веднаш да пропадне наместо да премине на резерва. Изберете една политика, примени ја на двата типа записи и логирајте ги двата.

Маршрута што фаќа сè поседува сè

Дизајнот само со DNS никогаш не додава addRoute("0.0.0.0", 0), па во интерфејсот TUN влегуваат само барања, а сето останато продолжува да ја користи основната мрежа. Тоа е безбедната форма и објаснува зошто некои листи на дозволени изгледаат како да работат на Wi-Fi а паѓаат на мобилната мрежа.

Во моментот кога постои стандардна маршрута, секој тек е ваш. TCP пакет што пристигнува на интерфејсот и не е ниту проследен ниту одговорен стои во редот додека на клиентот не му истече времето, а нема грешка за логирање бидејќи ништо не згреши. Гледав како некој поминува цело попладне на расипана листа на дозволени што всушност беше проследувач што недостасува за порта 443. Логирајте го протоколот и дестинацијата на секој пакет што ќе одлучите да го отфрлите.

Сокетот на резолверот мора да излезе од тунелот

Проследувањето е местото на следната замка. Резолверите на операторот често живеат на приватна адреса до која тунелот не стигнува, па барањето што го проследувате оди никаде и апликацијата пријавува истек на време за читање. Испраќајте одобрени барања до резолвер за кој знаете дека е достапен и прво предајте го тој сокет на VpnService.protect(). Незаштитен сокет го враќа барањето во вашиот сопствен тунел, каде што повторно стигнува до апликацијата и кружи додека не се активира таймерот.

Дефектот изгледа идентично како прекин на мрежата, и затоа опстојува толку долго во извештаите за грешки. Држете бројачи за испратени барања и примени одговори: ако првиот број расте а вториот останува на нула, гледате во сокетот, не во листата.

Големината и контролните суми паѓаат без порака

Тивките отфрлања доаѓаат и од големината. Одговор DNS со голем сет одговори или ракување TCP со дарежливи опции може да го надмине MTU на патеката што никогаш не сте го поставиле експлицитно; фрагментот исчезнува нагоре и клиентот или повторува со помало или престанува да обидува. Поставувањето на MTU на интерфејсот на 1280 е конзервативен избор што издржува повеќето мобилни патеки, а експлицитноста е подобра од наследена стандардна вредност што никој не ја измерил.

Ако сами градите пакети, контролната сума е другиот тивок убиец. UDP контролна сума пресметана врз псевдозаглавје што ја испушта должината на UDP или полето за протокол дава пакет што на вашата страна изгледа правилно, а примачот го отфрла без трага. Споредете го вашето псевдозаглавје со спецификацијата поле по поле и отпечатете ја пресметаната контролна сума за еден познат тек додека отстранувате грешки.

Што VpnService нема да направи за вас

Две граници вреди да се знаат пред да се проектира околу нив. Ниту една обична апликација не може да инсталира системски прокси или PAC датотека надвор од Wi-Fi, а тој дел не е променет. Патеката по апликација е променета: пред API 29 VpnService.Builder воопшто не можеше да носи прокси, а од API 29 setHttpProxy(ProxyInfo.buildPacProxy(uri)) ѝ дава на платформата PAC скрипта за оценување за мрежата VPN. Оценувајте ги правилата во сопствениот код кога целите на постари API-ја или кога PAC моделот не може да го изрази правилото. Ни UDP не е бесплатен: прелистувачите испраќаат само TCP низ SOCKS прокси, а повеќето клиенти SOCKS5 никогаш не имплементираат UDP ASSOCIATE, па дизајнот заснован на прокси го отфрла или го пропушта UDP додека TCP изгледа здраво.

Таа втора граница е причината зошто протокол заснован на UDP може да работи на обична мрежа и да пропадне во моментот кога вашиот VPN се поврзува. Ако се очекува тунелот да носи UDP, проследувачот мора да ја имплементира патеката за проследување за него, не само патеката TCP со друг тип на сокет.

Проверувајте по овој редослед

Работете низ листата по ред и застанете на првата фаза што пропаѓа, бидејќи секоја подоцнежна проверка е шум додека претходната не издржи.

  1. Наведете ги инсталираните маршрути и потврдете дали пакетите што не се DNS воопшто влегуваат во интерфејсот TUN.
  2. Логирајте го името на барањето, одлуката и кодот на одговор за едно блокирано и едно одобрено име.
  3. Потврдете дека сокетот на резолверот е заштитен и дека избраниот резолвер одговара од внатрешноста на тунелот.
  4. Потврдете го MTU на интерфејсот и контролната сума на еден рачно изграден одговор.
  5. Повторете ја истата страница на Wi-Fi и на мобилната мрежа, бидејќи резолверите на операторот и MTU на патеката се разликуваат.

Ако сите пет издржат а страницата сè уште виси, следниот осомничен е самиот проследувач: споредете фатено барање со фатен одговор и барајте број на бајти што недостасува или наполу затворен сокет. Референцата за VpnService.Builder ги покрива договорите за маршрута, DNS и MTU, а protect() е одделен повик VpnService, а не опција на builder-от; поврзан интерфејс значи само дека првиот договор е исполнет.

Поврзани статии