Tasker και WireGuard: η σωστή Intent για ένα tunnel
Το Tasker μπορεί να ζητήσει από το WireGuard να σηκώσει ένα ονομαστικό tunnel μέσω του δέκτη τηλεχειρισμού. Ο ελεγκτής χρειάζεται ακόμα την άδεια CONTROL_TUNNELS.
Η εκκίνηση της δραστηριότητας του WireGuard φέρνει μια εφαρμογή στο προσκήνιο, δεν σηκώνει ένα συγκεκριμένο tunnel. Ένας αυτοματισμός που ανοίγει την εφαρμογή και περιμένει θα περάσει στη δοκιμή και θα αποτύχει την πρώτη φορά που το τηλέφωνο βρίσκεται ήδη στην αρχική οθόνη. Το WireGuard εκθέτει μια υποστηριζόμενη διαδρομή τηλεχειρισμού για ονομαστικά tunnel, και είναι στενότερη απ’ όσο υποθέτουν οι περισσότερες συνταγές. Η λίστα ελέγχου παρακάτω ακολουθεί αυτή τη διαδρομή από την άδεια στο παρατηρούμενο αποτέλεσμα.
Ελέγξτε ότι ο τηλεχειρισμός είναι ενεργοποιημένος
Ο δέκτης τηλεχειρισμού δεν ακούει πάντα. Οι ρυθμίσεις του WireGuard περιλαμβάνουν μια επιλογή που ενεργοποιεί τον τηλεχειρισμό των tunnel, και όσο αυτή η επιλογή είναι κλειστή ο δέκτης αγνοεί τα αιτήματα αντί να αποτυγχάνει ηχηρά. Η προεπιλογή είναι σκόπιμη, γιατί ένας εξαγόμενος δέκτης που θα μπορούσε να σηκώνει tunnel θα ήταν τρύπα ασφαλείας σε κάθε συσκευή που εγκατέστησε την εφαρμογή. Ενεργοποιήστε την από τη διεπαφή και σημειώστε ότι το κάνατε, γιατί είναι μια ρύθμιση που ένας μελλοντικός χρήστης μπορεί να κλείσει χωρίς να ξέρει από τι εξαρτιόταν.
Ο δέκτης πιο πάνω χειρίζεται μόνο ονομαστικά αιτήματα UP και DOWN, οπότε εδώ δεν υπάρχει διαδρομή για δημιουργία tunnel ή επεξεργασία της διαμόρφωσής του. Επιβεβαιώστε ότι το στοιχείο υπάρχει στην εγκατεστημένη έκδοση πριν βασιστείτε σε αυτό: το adb shell dumpsys package com.wireguard.android | grep -i receiver απαριθμεί τους δηλωμένους δέκτες, και μια έκδοση χωρίς τον δέκτη τηλεχειρισμού δεν θα απαντήσει ποτέ. Αν η ροή εργασίας χρειάζεται άλλο τελικό σημείο ή άλλο peer, αυτό είναι άλλο tunnel και ξεχωριστή χειροκίνητη ρύθμιση μέσα στην εφαρμογή.
Ελέγξτε την άδεια που έχει ο ελεγκτής
Το WireGuard προστατεύει τον δέκτη με μια επικίνδυνη άδεια, την com.wireguard.android.permission.CONTROL_TUNNELS, την οποία πρέπει να έχει η εφαρμογή που ελέγχει. Μια δική σας εκπομπή δεν μπορεί να κατασκευάσει μια άδεια που ο αποστολέας δεν δήλωσε ποτέ ή δεν του δόθηκε ποτέ. Αυτό είναι το βήμα όπου οι συνταγές αυτοματισμού υποθέτουν σιωπηρά μια δυνατότητα που ο αυτοματισμός δεν έχει.
Ελέγξτε και τις δύο πλευρές πριν γράψετε την εργασία. Η πρώτη εντολή απαριθμεί τη δηλωμένη άδεια, και η δεύτερη δείχνει αν το πακέτο του ελεγκτή την έχει πραγματικά. Ένας ελεγκτής που δηλώνει την άδεια στο manifest του αλλά δεν του δόθηκε ποτέ κατά την εκτέλεση αποτυγχάνει ακόμα, και η αποτυχία έρχεται ως σιωπή και όχι ως διάλογος.
adb shell pm list permissions -g -d | grep -i control_tunnels
adb shell dumpsys package net.dinglisch.android.taskerm | grep -i control_tunnels
Αν ο ελεγκτής δεν έχει την άδεια, χρησιμοποιήστε την ενσωμάτωση που υποστηρίζει πραγματικά η εφαρμογή αντί να χτίσετε μια εκπομπή με το χέρι. Το να στείλετε μια Intent και να δείτε ότι η κλήση πέτυχε αποδεικνύει μόνο ότι το Android την αποδέχτηκε, όχι ότι το WireGuard ενήργησε βάσει αυτής. Αντιμετωπίστε μια μη επαληθευμένη αποστολή ως άγνωστη, όχι ως επιτυχία.
Ελέγξτε τα πεδία της Intent με την εγκατεστημένη εφαρμογή
Τέσσερα πεδία μεταφέρουν ολόκληρο το αίτημα, και καθένα έχει έναν τρόπο αποτυχίας που μοιάζει ακριβώς με τους άλλους. Πετύχετε τη δράση, το extra του tunnel, το πακέτο και τον στόχο σωστά ως σύνολο.
Action: com.wireguard.android.action.SET_TUNNEL_UP
Extra: tunnel:lab-wg
Package: com.wireguard.android
Target: Broadcast Receiver
Η δράση ονομάζει UP ή DOWN και τίποτα άλλο, το extra μεταφέρει το ακριβές διαμορφωμένο όνομα του tunnel, το πακέτο περιορίζει την παράδοση στο WireGuard, και ο στόχος πρέπει να είναι ο δέκτης και όχι μια δραστηριότητα. Ένα όνομα tunnel με τυπογραφικό λάθος παράγει την ίδια σιωπή με έναν απενεργοποιημένο δέκτη, οπότε διαβάστε το όνομα στην εφαρμογή πριν συμπεράνετε ότι ο αυτοματισμός είναι χαλασμένος. Η δράση DOWN είναι η com.wireguard.android.action.SET_TUNNEL_DOWN με το ίδιο extra και πακέτο. Στέλνετε ένα αίτημα κάθε φορά κατά τη δοκιμή, γιατί δύο εκπομπές που συναγωνίζονται παράγουν μια κατάσταση που κανείς δεν μπορεί να αποδώσει.
Δοκιμάστε το ίδιο αίτημα από ένα κέλυφος στη συσκευή για να διαχωρίσετε την Intent από τον αυτοματισμό. Αν αυτή η εντολή αποτυγχάνει ενώ η εργασία του Tasker πετυχαίνει, η διαφορά είναι η άδεια του αποστολέα και όχι οι τιμές των πεδίων.
adb shell am broadcast -a com.wireguard.android.action.SET_TUNNEL_UP -e tunnel lab-wg --receiver-permission com.wireguard.android.permission.CONTROL_TUNNELS
Ελέγξτε τι δεν καλύπτει το έναυσμα
Ένα συμβάν εκκίνησης εφαρμογής ή προσκηνίου μπορεί να ζητήσει σύνδεση, αλλά η εφαρμογή μπορεί να έχει ήδη επιχειρήσει αναζήτηση ονόματος ή αρχικό αίτημα πριν χειριστεί αυτό το συμβάν. Το έναυσμα ενεργοποιείται όταν το σύστημα αντιληφθεί την αλλαγή κατάστασης, που είναι αφού η εφαρμογή άρχισε να δουλεύει. Αν η εφαρμογή δεν πρέπει ποτέ να επικοινωνεί έξω από το tunnel, ένα έναυσμα εκκίνησης δεν είναι κανόνας αποκλεισμού και δεν μπορεί να γίνει τέτοιος προσθέτοντας καθυστέρηση. Διαμορφώστε μια υποστηριζόμενη πολιτική μόνιμης ενεργοποίησης ή ανά εφαρμογή για τη συμπεριφορά αποκλεισμού, και κρατήστε το έναυσμα μόνο για ευκολία.
Η συμπεριφορά αποκλεισμού ζει κάπου εντελώς αλλού. Το adb shell settings get global always_on_vpn_app ονομάζει το πακέτο που έχει καρφιτσωθεί ως μόνιμα ενεργό, και το adb shell dumpsys connectivity | grep -i vpn δείχνει τα δίκτυα VPN που παρακολουθεί τώρα το σύστημα. Κανένα από αυτά δεν είναι κάτι που μπορεί να υποκαταστήσει ένα έναυσμα εκκίνησης.
Η ίδια λογική ισχύει στο άλλο άκρο της συνεδρίας. Το να κατεβάσετε το tunnel επειδή ένα παράθυρο έχασε την εστίαση σπάει την εργασία στο παρασκήνιο, τους βοηθούς ταυτοποίησης και κάθε άλλη εφαρμογή που βασιζόταν στη σύνδεση. Ορίστε ένα σκόπιμο τέλος συνεδρίας αντί για αλλαγή εστίασης, και αποφύγετε γρήγορες ακολουθίες UP και DOWN όταν ο αυτοματισμός αλλάζει περιβάλλοντα.
Ελέγξτε το αποτέλεσμα, όχι την αποστολή
Μια εκπομπή που επιστρέφει χωρίς σφάλμα έχει γίνει αποδεκτή από το Android και τίποτα περισσότερο. Διαβάστε την κατάσταση του tunnel από την εφαρμογή, και διαβάστε την ετοιμότητα της ροής εργασίας από αυτό που χρειάζεται πραγματικά το επόμενο βήμα. Είναι δύο διαφορετικοί έλεγχοι, και το να περάσετε τον πρώτο δεν συνεπάγεται τον δεύτερο.
Διαβάστε και την κατάσταση της διεπαφής απευθείας: το adb shell ip -brief addr show tun0 εκτυπώνει τη διεπαφή του tunnel και τη διεύθυνσή της, και μια διεπαφή που υπάρχει χωρίς διεύθυνση είναι πάνω χωρίς να είναι χρησιμοποιήσιμη. Στη συνέχεια επαληθεύστε την ίδια την ιδιωτική υπηρεσία, γιατί ένα tunnel που είναι πάνω χωρίς handshake ή χωρίς διαδρομή εξακολουθεί να αποτυγχάνει στην εργασία που είχε σημασία. Ένας αυτοματισμός που ελέγχει μία ονομαστική σύνδεση μέσα στα πραγματικά όρια άδειάς του δεν χρειάζεται να αγγίξει τη διεπαφή, να τρέξει εντολή root ή να αποδυναμώσει τις προστασίες δικτύου του Android.