USB Reverse Tethering with Android (No Root) and Linux

Ovvero come collegare ad Internet uno smartphone Android (senza root) tramite cavo usb ed una macchina Linux

Se disponete a casa di una connessione ADSL/Fibra e volete collegare ad internet il vostro smartphone senza utilizzare WIFI e 2G/3G/4G, perché ad esempio il WIFI è rotto o vi funziona in maniera troppo instabile ed al contempo non volete consumare il traffico dati (2G/3G/4G) della vostra sim, oppure semplicemente perché un uso prolungato delle onde elettromagnetiche che il vostro corpo assorbe sottoforma di WIFI o 2G/3G/4G vi provoca un fastidioso mal di testa, questa guida vi permetterà di utilizzare un comune cavo usb connesso ad una macchina linux e naturalmente al vostro smartphone per "inoltrare" a quest'ultimo la connessione internet della macchina linux. Durante il collegamento il vostro smartphone tra l'altro sarà in carica. 
Questa guida ha inoltre la peculiarità di funzionare senza necessariamente possedere i permessi di root del vostro smartphone e quindi senza dover modificare nulla che ne comprometta la garanzia o rischi di danneggiarlo per procedure errate.

Perché Linux al posto di Windows

Perché sfrutteremo una macchina Linux anziché una con installato Windows? Innanzitutto perché Linux è molto più stabile di Windows e poi perché è possibile acquistare anche per meno di 20 euro un "miniPC" grande quanto una carta di credito (basato su CPU ARM, come ad esempio Raspberry PI e Orange PI) da usare come macchina Linux che consuma meno di 5 Watt di energia elettrica.  Ciò permette di lasciare il "miniPC" sempre acceso e posto nei luoghi più comodi per il collegamento, senza dover scomodare l'utilizzo di un intero PC desktop o notebook per raggiungere lo scopo prefissato.

Cosa è necessario

- Smartphone Android versione 5 (o superiore) con connessione 2G/3G/4G (la connessione dati servirà solo temporaneamente per ovviare alla mancanza di alcune modifiche che richiedono i permessi di root)

- Macchina linux collegata ad internet (PC desktop, notebook o miniPC che sia)

- Comune cavo usb in dotazione allo smartphone (eventualmente si può sostituire con un cavo più lungo e quindi più comodo)

- L'app gratuita "OpenVPN for Android" disponibile sul Google Play Store

- Il programma "openvpn" per distribuzioni Linux

- Il file binario di "ADB" (Android Debug Bridge) versione 1.0.32 (o superiore) per la distribuzione Linux utilizzata.

Installazione e configurazione iniziale

1) Installare "openvpn" sulla macchina Linux scelta. Su distribuzioni basate su Debian (tipo Ubuntu e Armbian) basta digitare in una finestra di terminale i seguenti comandi:

sudo apt-get update
sudo apt-get install openvpn

Quindi configurare openvpn a piacere. Ad esempio, il modo più semplice è il seguente (digitare in sequenza i comandi sul terminale Linux):

sudo openvpn --genkey --secret static.key
sudo cp static.key /etc/openvpn/static.key
sudo nano /etc/openvpn/android.conf

e a questo punto copiare e incollare nella finestra di terminale aperta  (e per ora vuota) la seguente configurazione:

dev tun
proto tcp-server
port 13444
ifconfig 192.168.7.28 192.168.7.29
resolv-retry infinite
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
mute-replay-warnings
secret /etc/openvpn/static.key
comp-lzo
verb 3

salvare e chiudere con Ctrl-O --> INVIO --> Ctrl-X.

2) Installare "Android Debug Bridge" sulla macchina linux scelta. Su distrubuzioni basate su Debian basterebbe digitare:

sudo apt-get install android-tools-adb

se non fosse che spesso il file binario "adb" non è aggiornato alla versione 1.0.32 (dopo avere eseguito il comando precedente, basta dare da terminale "adb version" per controllare la versione). Per questo motivo allego qui il file binario eseguibile per distribuzioni Linux x86 (ovvero per PC, testato su Ubuntu 14.04 64bit) e quello per distruzibuzioni Linux armv7 (testato su Orange PI PC).

Una volta scaricato il file adb-x86 o adb-arm a seconda della propria CPU (eliminare l'eventuale estensione del tipo .txt aggiunta dal browser rinominando i file), aprire un terminale e recarsi nella cartella dove è collocato il file ed eseguire i comandi per controllarne il corretto funzionamento e la versione nel seguente modo:

cd cartella_dove_si_รจ_scaricato_il_file
sudo chmod a+x adb-*
./adb-* version

(al posto di "*" scrivete "arm" o "x86" e al posto di "cartella_dove_si_è_scaricato_il_file" scrivete il percorso della cartella effettiva in cui avete messo il file, ad esempio "/home/vostro_nome_utente/Download/").

3) Abilitare il Debug USB sul vostro smartphone. Per far questo aprite il menu delle "impostazioni" delle telefono. Selezionate in basso (spesso l'ultima voce) "Info sul dispositivo" o "Informazioni su". Premete 7 volte in basso su "Versione build". Tornate alle "impostazioni". Entrate in "Opzioni sviluppatore" che saranno ora comparse nelle ultimi voci del menu "impostazioni" del telefono. Attivate ora l’opzione "Debug USB".

4) Digitate in una finestra di terminale della macchina Linux:

lsusb

ora collegate il vostro smartphone con il cavo usb alla vostra macchina Linux e ridigitate il comando:

lsusb

otterrete una voce in più rispetto a prima che corrisponde al vostro smartphone appena collegato, ad esempio:

$ lsusb
...
Bus 002 Device 059: ID 18d1:4e42 Google Inc.

Prendete nota dei numeri che vi compaiono al posto di "18d1:4e42" del nostro esempio. Quindi digitate:

sudo nano /etc/udev/rules.d/51-android.rules

e copiate dentro quanto segue (sostituendo a "18d1" il numero corrispondente che avete appena trovato, ovvero la prima delle 2 sequenze di cifre e numeri separati da ":"):

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

salvate e chiudete come prima. Infine digitate sul terminale:

sudo chmod a+r /etc/udev/rules.d/51-android.rules
sudo service udev restart

5) Ora staccate il cavo USB e installate dal PlayStore l'app "OpenVPN for Android". Aprite quindi il programma e in "impostazioni" deselezionare "riconnetti in caso di cambio rete".

Copiare il contenuto del file "static.key" creato all'inizio di questa guida (per visualizzarlo digitate ad esempio "sudo cat static.key" in un terminale, oppure "sudo nano static.key"). Si ricordi che per copiare e incollare in un terminale si possono usare le scorciatoie da tastiera Ctrl-Maiusc-C e Ctrl-Maiusc-V. 

Quindi creare un nuovo file di testo:

nano smart.conf

copiare all'interno quanto segue:

# Enables connection to GUI
management /data/data/de.blinkt.openvpn/cache/mgmtsocket unix
management-client
management-query-passwords
management-hold
machine-readable-output
#ifconfig-nowarn
verb 4
connect-retry-max 5
connect-retry 5 300
#resolv-retry 60
dev tun
remote 127.0.0.1 13444 tcp-client
comp-lzo
<secret>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
r4543..........
.....45345
-----END OpenVPN Static key V1-----
</secret>
ifconfig 192.168.7.29 255.255.255.255
route 0.0.0.0 0.0.0.0 vpn_gateway
dhcp-option DNS 8.8.4.4
dhcp-option DNS 8.8.4.4
dhcp-option DOMAIN blinkt.de
nobind
persist-tun
#persist-tun also enables pre resolving to avoid DNS resolve problem
#preresolve
# Use system proxy setting
management-query-proxy
# Custom configuration options
# You are on your on own here :)
# These options found in the config file do not map to config settings:
mute-replay-warnings
resolv-retry infinite
keepalive 10 60
ping-timer-rem

avendo cura di sostituire tra le linee:

<secret>
...
</secret>

il contenuto del file "static.key" precedentemente copiato. Infine salvare e chiudere il file "smart.conf" e spostarlo nella memoria dello smartphone.

6) A questo punto aprire l'app "OpenVPN for Android" e importare il file "smart.conf" toccando l'icona in alto a destra dell'app. Infine toccare sull'opzione di modifica del profilo appena creato (icona a forma di matita), selezionare "instradamento (routing)" dal menu in alto, deselezionare "ignora VPN per le reti locali" e selezionare "Utilizza il Routing di default" sotto la voce IPv4.

Funzionamento

Collegare smartphone e macchina Linux con il cavo usb, se la macchina Linux è connessa a internet tramite l'interfaccia "eth0" (caso standard se connessa via cavo LAN, per conferma controllare digitando "sudo ifconfig" su un terminale), allora sempre da terminale Linux recarsi come prima nella cartella in cui si è scaricato il file "adb"  con il comando "cd" ecc. e digitare (ad esempio se il file è adb-x86):

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o eth0 -j MASQUERADE
./adb-x86 devices
./adb-x86 reverse tcp:13444 tcp:13444

anteporre "sudo" a "./adb-x86 devices" se il comando restituisce un errore o un output vuoto.

Infine accendere la connessione dati dello smarphone (2G/3G/4G), avviare l'app "OpenVPN for Android" e tappare sul profilo creato, se leggete poco dopo "SUCCESS" nel file log che si apre vi siete appena connessi via cavo. Potete ora spegnere la connessione dati del telefono (anche se rimane accesa il traffico Internet non eroderà più il volume dei dati prepagati della vostra sim) e navigare ad esempio con un Browser come Chrome o chattare via Whatsapp. Non tutte le app riconoscono la nuova connessione (ad esempio Gmail) e senza root per tali app è necessario mantenere attiva la connessione dati anche se non viene utilizza, perchè, come poco felice limitazione, queste app non prevedono ci possano essere attive altre connessioni oltre a quelle wireless come WIFI e 3G e pertanto effettuano il controllo preliminare se tali connessioni sono presenti prima di avviarsi. Ciò nonostante, anche in questo caso ovvero con connessione dati cellulare attiva, il livello di onde elettromagnetiche assorbite dal vostro corpo scende drasticamente perché non vi è reale e continuo scambio dati su tale linea.

E' possibile automatizzare il tutto in modo da non dovere digitare più comandi sulla macchina Linux una volta inserito il cavo USB, in modo che è sufficiente tappare su un Widget dell'app "OpenVPN for Android" per attivare la connessione via cavo. Vedi qui se sei interessato.

09/11/2016