19 votes

Comment configurer un accès à Internet (reverse-tether) sous Linux ?

J'ai un HTC Desire S qui a l'option de se connecter via usb, et d'utiliser la connexion internet de l'ordinateur. Cela fonctionne bien sous Windows, mais j'ai du mal à le configurer sous Ubuntu. Lorsque je me connecte et que je sélectionne internet pass-through dans le menu usb, le périphérique usb1 est créé et je peux envoyer un ping à son adresse IP. J'ai essayé diverses configurations d'iptables et la mise en place de nat, mais je ne suis pas sûr que je le fasse correctement, ou s'il doit y avoir une configuration supplémentaire...

Merci pour toute aide.

11voto

bluegray Points 317

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

Lorsque vous branchez votre téléphone via usb et choisissez Internet pass-through, vous devriez obtenir un nouveau périphérique RNDIS (usb0 ou usb1). Pour ubuntu, éditez /etc/network/interfaces et ajoutez les lignes suivantes :

iface usb0 inet dhcp
iface usb1 inet dhcp

Cela permettra d'attribuer une IP automatiquement 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 le 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 au bout d'un moment, le téléphone ne cherche plus HTC Sync et se déconnecte.

Pour les téléphones enracinés

Vous pouvez vous connecter en permanence si vous avez un téléphone enraciné (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 au périphérique usb0 du téléphone :

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Ajouter une route par défaut. L'IP doit être l'IP assignée à usb0 dans linux :

adb shell route add default gw 192.168.99.1 dev usb0

Définissez le serveur DNS. C'est le serveur DNS ouvert de google, mais cela peut être l'IP de votre ordinateur linux si vous avez un serveur DNS :

adb shell setprop net.dns1 8.8.8.8

3voto

Lee Points 921

J'ai fait ce petit bash pour automatiser tout ça. Il suffit de brancher votre téléphone en mode charge à votre ordinateur et de lancer ce 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

0voto

nonsleepr Points 374

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

Commentaires sur la traduction :

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

Bonne chance !

0voto

user2330377 Points 9

Ok, voici exactement ce que j'ai fait, pas de rooting 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 de permissions, donc voici un script pour le processus 2 : Vous pouvez rendre iptables plus spécifique sur la façon dont il fait les choses en ajoutant des paramètres pour des périphériques 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

Maintenant, branchez votre téléphone et sélectionnez "Internet pass through".

attendre que l'appareil apparaisse : ifconfig vérifier qu'il est aussi dans : arp

J'ai découvert que je devais débrancher le périphérique puis le rebrancher pour qu'il apparaisse dans arp, les choses ne fonctionnent pas correctement si arp ne montre pas le périphérique.

L'appareil attendra ensuite que HTC Sync lui envoie un message. Vous devez donc vous moquer du message de 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 vais peut-être écrire une version de ceci en utilisant le D-Bus pour que la dernière partie s'exécute automatiquement lorsque le dispositif est branché etc.....

Ok, voici mon travail en cours, je n'ai pas pu trouver quelque chose de 'générique' sur le d-bus donc j'ai opté pour une solution un peu bricolée en utilisant udev . Ce n'est pas parfait, par exemple la commande est exécutée deux fois, donc je vais devoir voir si je peux filtrer les paramètres correspondants un peu mieux, aussi ajouter un timeout sur le dernier script, juste au cas où et voir si je peux remplacer arp avec quelque chose d'un peu mieux, par exemple regarder dans /proc.

Voici le fichier .rules que j'ai créé à partir de /etc/udev/rules.d

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

Vous pouvez l'appeler comme vous voulez, mais ne le commencez pas par un numéro, car il sera exécuté 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 tu ne vois 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, puisque RUN de udev bloquera tout le reste (même s'il est exécuté en dernier ! !)... hmm... enfin bref :

J'ai créé les fichiers dans mon répertoire personnel pour l'instant "/home/olli/" ... donc n'oubliez pas de remplacer la partie '/home/olli/' par l'endroit 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

comprenant 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

Avec un peu de chance, je devrais avoir une version bien rangée bientôt. (probablement demain).

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X