Сиз доменди уруксат тизмесине коштуңуз, сурам сиздин колдонмоңузга жетет, салыштыргыч уруксат берилди деп кайтарат, бирок барак эч качан жүктөлбөйт. Ошол учурда көпчүлүк салыштыргычты кайра жазып, атайын белгилер менен салыштыруу кошо баштайт. Менин тажрыйбамда салыштыргыч адатта туура, ал эми бузулуу бир катмар төмөндө жатат: сиз жараткан DNS жообунда, сиз орноткон маршрутта же сурамды жөнөтүү үчүн колдонгон сокетте. Тизме — жеңил бөлүгү; пакет жолу — уруксат тизмелери бузулган жер.

Салыштыргыч сейрек күнөөлүү

Эң оболу блоктолгонду бузулгандан ажыратуу керек. Блоктолгон ат тез жана көрүнөө түрдө ишке ашпашы керек, анткени браузер ат жок деген жооп алып токтойт. Бузулган ат илинет, IPv6 аркылуу кайра аракет кылат, башка ташууга өтөт жана сизди айланма индикатор менен калтырат. Айланма индикатор көрсөңүз, уруксат тизмеңиз кардар эч нерсе кыла албаган нерсеге жооп берип жатат.

Бош A жазуусу классикалык ката. Нөл жооп менен NOERROR кайтаруу жарактуу жооп сыяктуу көрүнөт, ошондуктан stub чечүүчү аны кабыл алат, браузер кайра аракет кылат, AAAA текшерет, башка чечүүчүнү текшерет жана бир топ кечигип баш тартат. 3 жооп коду, башкача айтканда NXDOMAIN, суроо бөлүмүн кайталап жана транзакция ID син көчүрүп берсе, сүйлөшүүнү дароо бүтүрөт. Аны атайылап четке каккан ар бир ат үчүн колдонуңуз.

IPv6 да демейки маанинин ордуна ошол эле чечимге татыктуу. Эгер A үчүн NXDOMAIN жооп берип, 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 сиз үчүн эмне кылбайт

Анын айланасында долбоорлоодон мурун эки чекти билүү пайдалуу. Эч бир кадимки колдонмо Wi-Fi дын сыртында тутумдук прокси же PAC файлын орното албайт жана бул бөлүк өзгөргөн жок. Колдонмо боюнча жол өзгөрдү: API 29 га чейин VpnService.Builder проксини такыр алып жүрө алган эмес, ал эми API 29 дан баштап setHttpProxy(ProxyInfo.buildPacProxy(uri)) платформага VPN тармагы үчүн баалоочу PAC скриптин берет. Эски API лерди бутага алганда же PAC модели эрежени туюнта албаганда эрежелерди өз кодуңузда баалаңыз. UDP да акысыз эмес: браузерлер SOCKS прокси аркылуу TCP гана жөнөтөт, ал эми SOCKS5 кардарларынын көбү UDP ASSOCIATE ди эч качан ишке ашырышпайт, ошондуктан проксиге негизделген долбоор TCP саламат көрүнгөндө UDP ни таштайт же агызат.

Ушул экинчи чек UDP ге негизделген протоколдун кадимки тармакта иштеп, VPN туташкан учурда ишке ашпай калышынын себеби. Эгер туннель UDP алып жүрүшү күтүлсө, жөнөткүч ага жөнөтүү жолун ишке ашырышы керек, башка сокет түрү менен TCP жолун гана эмес.

Ушул тартипте текшериңиз

Тизмени тартип менен иштетип, ишке ашпаган биринчи баскычта токтоңуз, анткени мурункусу кармалбайынча ар бир кийинки текшерүү — ызы-чуу.

  1. Орнотулган маршруттарды тизмелеп, DNS эмес пакеттер TUN интерфейсине такыр киреби же жокпу ырастаңыз.
  2. Бир блоктолгон жана бир бекитилген ат үчүн сурам атын, чечимди жана жооп кодун журналга жазыңыз.
  3. Чечүүчү сокет корголгонун жана тандалган чечүүчү туннелдин ичинен жооп берээрин ырастаңыз.
  4. Интерфейс MTU сун жана кол менен курулган бир жооптун текшерүү суммасын ырастаңыз.
  5. Ошол эле баракты Wi-Fi да жана уюлдук тармакта кайталаңыз, анткени оператордун чечүүчүлөрү жана жол MTU су айырмаланат.

Бешөө тең кармалып, барак дагы эле илинип турса, кийинки шектүү — жөнөткүчтүн өзү: кармалган сурамды кармалган жооп менен салыштырып, жетишпеген байт санын же жарым жабык сокетти издеңиз. VpnService.Builder маалымдамасы маршрут, DNS жана MTU келишимдерин камтыйт, ал эми protect() — builder параметри эмес, өзүнчө VpnService чакырыгы; туташкан интерфейс биринчи келишим аткарылганын гана билдирет.

Тектеш макалалар