Comment configurer la connexion Internet (reverse-tether) sur Linux?

19

J'ai un HTC Desire S qui a la possibilité de se connecter via USB et d'utiliser la connexion Internet de l'ordinateur. Cela fonctionne très bien sur Windows, mais j'ai du mal à le configurer dans Ubuntu. Lorsque je me connecte et sélectionne la connexion Internet dans le menu USB, le périphérique USB1 est créé et je peux cingler son adresse IP. J'ai essayé diverses configurations iptables et mis en place nat, mais je ne sais pas si je le fais bien, ou s'il doit y avoir une configuration supplémentaire ...

Merci pour toute aide.

bleu-gris
la source
Je l'ai fait fonctionner en utilisant une combinaison d'informations de trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking et translate.googleusercontent.com/… . Réponse ci-dessous.
bluegray

Réponses:

11

Ce qui suit fonctionne pendant un certain temps, mais uniquement pour le navigateur.

Lorsque vous branchez votre téléphone via USB et choisissez la connexion Internet, vous devez obtenir un nouvel appareil RNDIS (USB0 ou USB1). Pour ubuntu, éditez / etc / network / interfaces et ajoutez les lignes suivantes:

iface usb0 inet dhcp
iface usb1 inet dhcp

Cela attribuera automatiquement une adresse IP lorsque le périphérique est ajouté. Si une adresse réseau n'est pas attribuée automatiquement à usb0 ou usb1, vous devez le faire manuellement.

Ensuite, vous devez configurer NAT sur votre ordinateur Linux. Quelque chose comme:

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

Vous avez également besoin d'un serveur DNS:

sudo apt-get install bind9

Cela fonctionne pendant quelques minutes, mais après un certain temps, le téléphone abandonne la recherche de HTC Sync et se déconnecte.

Pour les téléphones rootés

Vous pouvez vous connecter de façon permanente si vous avez un téléphone rooté (fre3vo a fonctionné pour moi). Exécutez ce qui suit avec adb.

Activez le mode USB pour le réseau et ADB:

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

Attribuez une IP à l'appareil usb0 sur le téléphone:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Ajoutez un itinéraire par défaut. L'IP doit être l'IP attribuée à usb0 sous linux:

adb shell route add default gw 192.168.99.1 dev usb0

Définissez le serveur DNS. Il s'agit du serveur DNS ouvert de Google, mais il peut s'agir de l'IP de votre ordinateur Linux si vous avez un serveur DNS:

adb shell setprop net.dns1 8.8.8.8
bleu-gris
la source
2
Selon la légende, vous pouvez simuler la synchronisation HTC en procédant comme suit: Sur les téléphones HTC, lorsque vous branchez l'USB et sélectionnez Internet passthrough, il attend la synchronisation HTC et abandonne. Il écoute sur le port 6000. Il vous suffit donc de simuler la synchronisation HTC avec netcat. Essayez ceci sur la ligne de commande: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null la valeur hexadécimale de 00 02 00 00est tout ce qu'il recherche.
geffchang
@geffchang, merci! Pour les utilisateurs de Windows, lorsque le mobile essaie de se connecter via l'USB, vous pouvez exécuter netsh interface ip show configpour voir tous les noms d'interface, puis netsh interface ip show config name="Local Area Connection #2"pour obtenir uniquement cette interface, où Local Area Connection #2est le nom de la nouvelle carte. Vous pouvez renommer cela pour plus de commodité.
Sam Hasler
3

A fait cette petite bash pour tout automatiser. Branchez simplement votre téléphone en mode de charge sur votre ordinateur et exécutez cette 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
DaMs
la source
0

Comme je n'ai pas accès à la machine Linux moi-même, je ne peux pas tester cette solution mais vous pouvez essayer les étapes décrites ici (traduction Google du russe) .

Commentaires sur la traduction:

  • "rutovanym" signifie enraciné;
  • WB ou BB signifie Big Brother (ordinateur de bureau);
  • smarta est l'abréviation de "smartphone".

Bonne chance!

non-éprouvé
la source
Merci, mais il existe un moyen plus simple que de combler les interfaces.
bluegray
0

Ok, voici exactement ce que j'ai fait, aucun enracinement de HTC souhaité:

Configurer bind9 et NAT etc ...

note: 1: si vous faites simplement sudo echo 1> / proc / sys / net / ipv4 / ip_forward, vous obtiendrez une erreur d'autorisation, voici donc un script pour le processus 2: vous pouvez rendre iptables plus spécifique sur la façon dont il fait les choses en ajout de paramètres pour des appareils spécifiques.


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

branchez maintenant votre téléphone et sélectionnez «Internet pass through»

attendez que l'appareil apparaisse dans: ifconfig vérifiez qu'il est également dans: arp

J'ai trouvé que je devais débrancher l'appareil puis le rebrancher pour qu'il apparaisse dans arp, les choses ne fonctionnent pas correctement si arp n'affiche pas l'appareil.

L'appareil attendra alors que HTC Sync lui envoie un message, vous devez donc vous moquer du message HTC Sync:


#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

Je peux écrire une version de ceci en utilisant D-Bus pour que cette dernière partie s'exécute automatiquement lorsque l'appareil est branché, etc.

Ok, voici mon travail en cours, je n'ai rien trouvé de générique sur d-bus donc j'ai opté pour une solution de piratage en utilisant udev .. Ce n'est pas parfait, par exemple la commande est exécutée deux fois, donc j'ai Je vais devoir voir si je peux filtrer un peu mieux les paramètres correspondants, ajouter également un délai d'attente sur le dernier script, juste en cas et voir si je peux remplacer arp par quelque chose de mieux, disons en regardant dans / proc

here.s mon fichier .rules de /etc/udev/rules.d j'ai créé


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

Vous pouvez l'appeler comme vous voulez, mais NE LA COMMENCEZ PAS AVEC UN NUMÉRO, de cette façon, elle s'exécute en dernier.

Ajoutez ce qui suit au fichier en tant que sudo en utilisant un éditeur de votre choix, etc.


#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

En gros, si vous ne voyez pas ces 3 'r,


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

Ensuite, vous aurez besoin de deux autres fichiers, l'un pour enchaîner l'autre, car RUN de udev bloquera tout le reste (même s'il est exécuté en dernier !!) ... hmm ... de toute façon:

J'ai créé les fichiers dans mon répertoire personnel pour l'instant "/ home / olli /" ... alors n'oubliez pas de remplacer le bit '/ home / olli /' par où vous créez les fichiers:

donc pour moi, cd dans mon répertoire personnel.


cd ~

créer un fichier appelé


chain_mock_htc_sync.sh

contenant les éléments suivants:



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

le rendre exécutable


chmod +x chain_mock_htc_sync.sh

créer un autre fichier appelé


mock_htc_sync.sh

contenant les éléments suivants


#!/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

Rendez-le exécutable:

chmod +x mock_htc_sync.sh

J'espère que je devrais avoir une belle version rangée dès que pos. (probablement demain).

user2330377
la source
0

Pour le partage de connexion inversé USB avec Android et Linux sans root, voir ma réponse ici

salutepc
la source