Tasker ir WireGuard: tinkamo Intent siuntimas vienam tuneliui
Tasker gali paprašyti WireGuard per nuotolinio valdymo imtuvą pakelti vieną pavadintą tunelį. Valdikliui vis dar reikia CONTROL_TUNNELS leidimo.
Paleidus WireGuard veiklą programa iškeliama į priekį, o ne pakeliamas konkretus tunelis. Automatizavimas, kuris atidaro programėlę ir laukia, praeis testą ir nepavyks pirmą kartą, kai telefonas jau yra pagrindiniame ekrane. WireGuard siūlo palaikomą nuotolinio valdymo kelią pavadintiems tuneliams, ir jis siauresnis, nei teigia dauguma receptų. Žemiau pateiktas kontrolinis sąrašas eina tuo keliu nuo leidimo iki stebimo rezultato.
Patikrinkite, ar įjungtas nuotolinis valdymas
Nuotolinio valdymo imtuvas ne visada klausosi. WireGuard nustatymuose yra parinktis, įjungianti nuotolinį tunelių valdymą, ir kol ji neįjungta, imtuvas ignoruoja užklausas, o ne garsiai sugenda. Numatytasis nustatymas yra tyčinis, nes eksportuotas imtuvas, galintis pakelti tunelius, būtų saugumo spraga kiekviename įrenginyje, kuriame įdiegta programėlė. Įjunkite ją per sąsają ir užsirašykite, kad tai padarėte, nes tai nustatymas, kurį būsimas naudotojas gali išjungti nežinodamas, kas nuo jo priklausė.
Aukščiau esantis imtuvas apdoroja tik pavadintas UP ir DOWN užklausas, todėl čia nėra kelio sukurti tunelį ar redaguoti jo konfigūraciją. Prieš juo pasikliaudami patvirtinkite, kad komponentas yra įdiegtame rinkinyje: adb shell dumpsys package com.wireguard.android | grep -i receiver išvardija deklaruotus imtuvus, o rinkinys be nuotolinio valdymo imtuvo niekada neatsakys. Jei darbo eigai reikia kito galinio taško ar kito partnerio, tai kitas tunelis ir atskiras rankinis nustatymas programėlės viduje.
Patikrinkite, kokį leidimą turi valdiklis
WireGuard saugo imtuvą pavojingu leidimu, com.wireguard.android.permission.CONTROL_TUNNELS, kurį turi turėti valdanti programėlė. Savas transliacijos siuntimas negali sukurti leidimo, kurio siuntėjas niekada nedeklaravo arba kuris jam niekada nebuvo suteiktas. Tai žingsnis, kai automatizavimo receptai tyliai daro prielaidą apie galimybę, kurios automatizavimas neturi.
Prieš rašydami užduotį patikrinkite abi puses. Pirmoji komanda išvardija deklaruotą leidimą, o antroji parodo, ar valdiklio paketas jį iš tikrųjų turi. Valdiklis, kuris deklaruoja leidimą savo manifeste, bet jam jis niekada nebuvo suteiktas vykdymo metu, vis tiek nepavyksta, o nesėkmė ateina kaip tyla, o ne kaip dialogas.
adb shell pm list permissions -g -d | grep -i control_tunnels
adb shell dumpsys package net.dinglisch.android.taskerm | grep -i control_tunnels
Jei valdiklis neturi leidimo, naudokite integraciją, kurią programėlė iš tikrųjų palaiko, o ne kurkite transliaciją rankomis. Intent išsiuntimas ir sėkmingo kvietimo pamatymas įrodo tik tai, kad Android jį priėmė, o ne kad WireGuard pagal jį veikė. Nepatvirtintą siuntimą traktuokite kaip nežinomą, o ne kaip sėkmę.
Suderinkite Intent laukus su įdiegta programėle
Keturi laukai neša visą užklausą, ir kiekvienas turi nesėkmės būdą, kuris atrodo lygiai taip pat kaip kiti. Taisyklingai nustatykite veiksmą, tunelio papildomą lauką, paketą ir tikslą kaip vieną rinkinį.
Action: com.wireguard.android.action.SET_TUNNEL_UP
Extra: tunnel:lab-wg
Package: com.wireguard.android
Target: Broadcast Receiver
Veiksmas įvardija UP arba DOWN ir nieko daugiau, papildomas laukas neša tikslų sukonfigūruotą tunelio pavadinimą, paketas apriboja pristatymą WireGuard, o tikslas turi būti imtuvas, o ne veikla. Tunelio pavadinimas su rašybos klaida sukuria tokią pačią tylą kaip išjungtas imtuvas, todėl perskaitykite pavadinimą programėlėje prieš darydami išvadą, kad automatizavimas sugedo. DOWN veiksmas yra com.wireguard.android.action.SET_TUNNEL_DOWN su tuo pačiu papildomu lauku ir paketu. Testuodami siųskite po vieną užklausą, nes dvi transliacijos, lenktyniaujančios viena su kita, sukuria būseną, kurios niekas negali priskirti.
Išbandykite tą pačią užklausą iš įrenginio apvalkalo, kad atskirtumėte Intent nuo automatizavimo. Jei ta komanda nepavyksta, o Tasker užduotis pavyksta, skirtumas yra siuntėjo leidimas, o ne laukų reikšmės.
adb shell am broadcast -a com.wireguard.android.action.SET_TUNNEL_UP -e tunnel lab-wg --receiver-permission com.wireguard.android.permission.CONTROL_TUNNELS
Patikrinkite, ko neapima trigeris
Programėlės paleidimo arba išėjimo į priekį įvykis gali paprašyti ryšio, bet programėlė jau galėjo bandyti vardo paiešką ar pradinę užklausą, kol tas įvykis dar neapdorotas. Trigeris suveikia, kai sistema pastebi būsenos pokytį, tai yra po to, kai programėlė pradėjo dirbti. Jei programėlė niekada neturi bendrauti už tunelio ribų, paleidimo trigeris nėra blokavimo taisyklė ir jo negalima tokia padaryti pridedant delsą. Sukonfigūruokite palaikomą visada įjungto arba pagal programėlę principą blokavimo elgsenai, o trigerį palikite tik patogumui.
Blokavimo elgsena gyvena visai kitur. adb shell settings get global always_on_vpn_app įvardija paketą, užfiksuotą kaip visada įjungtą, o adb shell dumpsys connectivity | grep -i vpn rodo VPN tinklus, kuriuos sistema šiuo metu seka. Nė vieno iš jų negali pakeisti paleidimo trigeris.
Tas pats samprotavimas galioja ir kitame sesijos gale. Tunelio nuleidimas dėl to, kad vienas langas prarado fokusą, sugriauna foninį darbą, autentifikavimo pagalbininkus ir bet kurią kitą programėlę, kuri rėmėsi ryšiu. Apibrėžkite tyčinę sesijos pabaigą, o ne fokuso pasikeitimą, ir venkite greitų UP ir DOWN sekų, kai automatizavimas keičia kontekstus.
Tikrinkite rezultatą, o ne siuntimą
Transliacija, kuri grįžta be klaidos, buvo priimta Android ir nieko daugiau. Skaitykite tunelio būseną iš programėlės, o darbo eigos pasirengimą – iš to, ko iš tikrųjų reikia kitam žingsniui. Tai du skirtingi patikrinimai, ir pirmojo praėjimas nereiškia antrojo.
Skaitykite ir sąsajos būseną tiesiogiai: adb shell ip -brief addr show tun0 išspausdina tunelio sąsają ir jos adresą, o sąsaja, egzistuojanti be adreso, yra pakelta, bet nepanaudojama. Tada patikrinkite pačią privačią paslaugą, nes tunelis, pakeltas be rankos paspaudimo ar be maršruto, vis tiek nepavyksta užduotyje, kuri buvo svarbi. Automatizavimui, valdančiam vieną pavadintą ryšį savo tikrosios leidimo ribos viduje, nereikia liesti sąsajos, vykdyti root komandos ar silpninti Android tinklo apsaugų.