Come si imposta il pass-through Internet (reverse-tether) su Linux?


19

Ho un HTC Desire S che ha la possibilità di connettersi tramite USB e utilizzare la connessione Internet del computer. Funziona bene su Windows, ma faccio fatica a configurarlo su Ubuntu. Quando collego e seleziono il pass-through Internet dal menu USB, viene creato il dispositivo USB1 e posso eseguire il ping del suo indirizzo IP. Ho provato varie configurazioni di iptables e ho impostato nat, ma non sono sicuro che lo stia facendo bene o che ci sia bisogno di qualche configurazione aggiuntiva ...

Grazie per qualsiasi aiuto.


L'ho fatto funzionare utilizzando una combinazione di informazioni da trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking e translate.googleusercontent.com/… . Risposta sotto.
bluegray,

Risposte:


11

Quanto segue funziona per un po ', ma solo per il browser.

Quando si collega il telefono tramite USB e si sceglie il pass-through Internet, è necessario ottenere un nuovo dispositivo RNDIS (usb0 o usb1). Per ubuntu, modifica / etc / network / interfaces e aggiungi le seguenti righe:

iface usb0 inet dhcp
iface usb1 inet dhcp

Ciò assegnerà automaticamente un IP quando viene aggiunto il dispositivo. Se un indirizzo di rete non viene assegnato automaticamente a usb0 o usb1, è necessario farlo manualmente.

Quindi devi configurare NAT sul tuo computer linux. Qualcosa di simile a:

sudo iptables -A POSTROUTING -t nat -j MASQUERADE
sudo echo 1 > /proc/sys/net/ipv4/ip_forward 

È inoltre necessario un server DNS:

sudo apt-get install bind9

Funziona per alcuni minuti, ma dopo un po 'il telefono smette di cercare HTC Sync e si disconnette.

Per telefoni con root

Puoi connetterti permanentemente se hai un telefono rootato (fre3vo ha funzionato per me). Eseguire quanto segue con adb.

Abilita la modalità usb per rete e adb:

adb shell echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch

Assegnare un IP al dispositivo USB0 sul telefono:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Aggiungi una rotta predefinita. L'IP dovrebbe essere l'IP assegnato a usb0 in linux:

adb shell route add default gw 192.168.99.1 dev usb0

Imposta il server DNS. Questo è il server DNS aperto di google, ma può essere l'IP del tuo computer linux se hai un server DNS:

adb shell setprop net.dns1 8.8.8.8

2
Secondo la leggenda, è possibile simulare la sincronizzazione HTC effettuando le seguenti operazioni: Sui telefoni HTC, quando si collega l'USB e si seleziona il passthrough Internet, attende la sincronizzazione HTC e si arrende. È in ascolto sulla porta 6000. Quindi è sufficiente falsificare la sincronizzazione HTC con netcat. Prova questo dalla riga di comando: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null il valore esadecimale di 00 02 00 00è tutto ciò che sta cercando.
Geffchang,

@geffchang, grazie! Per gli utenti di Windows, quando il cellulare sta tentando di connettersi tramite USB, è possibile eseguire netsh interface ip show configper visualizzare tutti i nomi dell'interfaccia e quindi netsh interface ip show config name="Local Area Connection #2"ottenere solo quell'interfaccia, Local Area Connection #2dovunque si chiami il nuovo adattatore. Puoi rinominarlo per comodità.
Sam Hasler,

3

A fatto questo piccolo bash per automatizzare tutto. Basta collegare il telefono in modalità di ricarica al computer ed eseguire questo bash.

#!/bin/bash
/opt/android-sdk-update-manager/platform-tools/adb shell 'echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch'
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell setprop net.dns1 8.8.8.8

get_ip ()
{
ifconfig usb0 | grep inet | awk '{print $2}' | sed 's/addr://' | grep .
}

echo "waiting for IP on computer usb0"
while [[ `get_ip` < 192 ]];do sleep 2; done
ip=`get_ip`
echo "IP adress is $ip "
/opt/android-sdk-update-manager/platform-tools/adb shell route add default gw $ip dev usb0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

0

Dal momento che non ho accesso alla macchina Linux da solo non posso testare questa soluzione ma puoi provare i passaggi descritti qui (traduzione di Google dal russo) .

Commenti alla traduzione:

  • "rutovanym" significa radicato;
  • BB o BB significa Grande Fratello (desktop);
  • smarta è l'abbreviazione di "smartphone".

In bocca al lupo!


Grazie, ma c'è un modo più semplice di colmare le interfacce.
bluegray,

0

Ok, ecco esattamente quello che ho fatto, nessun rooting di HTC desiderato:

Setup bind9 e NAT ecc ...

nota: 1: se fai semplicemente sudo echo 1> / proc / sys / net / ipv4 / ip_forward otterrai un errore permessi, quindi ecco uno script per il processo 2: Puoi rendere iptables più specifico su come fa le cose aggiunta di parametri per dispositivi specifici.


cd ~
echo '!/bin/bash
apt-get install bind9
iptables -A POSTROUTING -t nat -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward' > setup_bind9_nat.sh

chmod +x setup_bind9_nat.sh
sudo ./setup_bind9_nat.sh

ora collega il tuo telefono e seleziona "Internet pass through"

attendere che il dispositivo appaia in: ifconfig verificare che sia anche in: arp

Ho scoperto che dovevo scollegare il dispositivo e ricollegarlo perché appaia in arp, le cose non funzionano correttamente se arp non mostra il dispositivo.

Il dispositivo rimarrà quindi in attesa che HTC Sync invii un messaggio, quindi è necessario deridere il messaggio HTC Syncs:


#change this line to be more specific if you have more than one usb network device
phone_usb_device="usb"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer usb"
while [[ `get_ip` < 192 ]];do sleep 2; done
phoneip=`get_ip`
echo "IP adress is $phoneip "

echo -n -e "\x00\x02\x00\x00" | nc -q 2 $phoneip 6000 > /dev/null

Potrei scrivere una versione di questo usando D-Bus in modo che quest'ultima parte venga eseguita automaticamente quando il dispositivo è collegato, ecc ...

Ok, ecco i miei lavori in corso, non sono riuscito a trovare nulla di "generico" su d-bus, quindi ho optato per un po 'di una soluzione di hacking usando udev .. Questo non è perfetto, ad esempio il comando viene eseguito due volte, quindi ho dovrò vedere se riesco a filtrare un po 'meglio i parametri corrispondenti, aggiungere anche un timeout sull'ultimo script, solo in caso di evase e vedere se posso sostituire arp con qualcosa di un po' meglio, diciamo guardando in / proc

ecco il mio file .rules da /etc/udev/rules.d che ho creato


cat /etc/udev/rules.d/htc-desire.rules

Puoi chiamarlo come preferisci ma NON INIZIARLO CON UN NUMERO, in questo modo viene eseguito per ultimo.

Aggiungi quanto segue al file come sudo usando un editor a tua scelta ecc ....


#KERNEL=="usb?" or DRIVERS=="usb" not sure which is best, may need extra mode information too from usb device.
SUBSYSTEM=="net", DRIVERS=="usb", ATTRS{manufacturer}=="HTC", ATTRS{idProduct}=="0ffe", RUN+="/home/olli/chain_mock_htc_sync.sh $kernel"


Ubuntu is setup to create the file with the correct permissions already 


ls -lrt /etc/udev/rules.d/htc-desire.rules 
-rw-r--r-- 1 root root 248 Jun 26 22:09 htc-desire.rules

Fondamentalmente, se non vedi quei 3 'r,


sudo chmod a+r /etc/udev/rules.d/htc-desire.rules 

Quindi avrai bisogno di altri due file, uno per concatenare l'altro, poiché RUN da udev bloccherà tutto il resto (anche se è eseguito per ultimo !!) ... hmm ... comunque:

Ho creato i file nella mia directory home per ora "/ home / olli /" ... quindi ricordati di sostituire il bit '/ home / olli /' con ovunque tu crei i file:

quindi per me, cd nella mia home directory.


cd ~

crea un file chiamato


chain_mock_htc_sync.sh

contenente quanto segue:



#!/bin/bash
/home/olli/mock_htc_sync.sh "$1" &
exit

renderlo eseguibile


chmod +x chain_mock_htc_sync.sh

crea un altro file chiamato


mock_htc_sync.sh

contenente quanto segue


#!/bin/bash
#change this line to be more specific if you have more than one usb network device

phone_usb_device="$1"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer $phone_usb_device"
while [[ `get_ip`  /dev/null

Renderlo eseguibile:

chmod +x mock_htc_sync.sh

Spero di avere una bella versione riordinata non appena pos. (probabilmente domani).


0

Per il tethering inverso USB con Android e Linux senza rooting vedi la mia risposta qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.