Connecter le FreeRunner au web via USB
Inspirée de cette page [1] Pour tout autres questions sur le sujet, allez nous la poser sur le forum [2]
Procédures testées avec les distributions ci-dessous. Pour d'autres distributions, n'hésitez pas à contribuer ;)
Sommaire |
Un peu de théorie
Vous venez de connecter votre Freerunner à votre PC par un câble USB, félicitation; par ce geste anodin , vous venez de créer un nouveau réseau! Ce qui fait de vous un administrateur réseau; rassurez vous ce n'est pas douloureux.
Voyons de quoi se compose votre réseau (en fait vos réseaux)
Le LAN
Vous avez un ordinateur, que nous appellerons le host, qui est connecté à internet via un modem (ou une "box") à l'aide d'une liaison ethernet ou wifi. Vous avez donc créé un réseau appellé LAN. Sur ce réseau peuvent être connectés plusieurs ordinateurs. Ce réseau possède son propre espace d'adressage (généralement en 192.168.0.0 ou 192.168.1.0).
Le FR
Sur le PC host, vous venez de créer un réseau composé de votre host et de votre FR. Ce réseau est distinct du précédent; votre PC host appartient aux 2 réseaux, mais comme il est relié à chacun des réseaux par 2 interfaces différentes, il a 2 adresses (une coté LAN, et une coté FR). Si vous voulez que le FR communique avec internet, il va falloir configurer votre PC host pour qu'il fasse la passerelle entre les 2 réseaux.
les espaces d'adressage
Votre installation ressemble donc à ceci
FR------HOST------box------internet
FR LAN
Le FR étant relié par câble USB, le réseau ainsi créé ne comportera jamais plus que ces 2 éléments
Il est impératif que les espaces d'adressage de ces 2 réseaux soient parfaitement distincts
Pour cela, vous avez 2 options - option 1: utiliser un espace d'adressage de base commun (par ex 192.168.0.0), et le scinder en 2 en utilisant des masques de sous réseau - option 2: utiliser 2 espaces d'adressage de base distinct (par ex 192.168.0.0 d'un coté, et 192.168.9.0 de l'autre)
configuration
option 1: 2 sous réseaux
Partons de l'hypothése que votre box vous impose un réseau de type 192.168.0.0, et que l'adresse du routeur/modem est 192.168.0.1 (à vous d'adapter) Par défaut le FR est configuré avec l'adresse 192.168.0.202. Il y a donc un conflit car cette adresse est déjà contenue dans le réseau LAN. Si nous voulons conserver l'adresse du FR, il faut créer un sous réseau coté FR en ne conservant que quelques adresse hautes du résea 192.168.0.0, à l'aide d'un masque, et exclure toute les autres (que nous réserverons pour le LAN).
Ce qui donne coté FR (fichier /etc/network/interfaces):
# Ethernet/RNDIS gadget (g_ether) # ... or on host side, usbnet and random hwaddr auto usb0 iface usb0 inet static address 192.168.0.202 netmask 255.255.255.192 up route add default gw 192.168.0.200 metric 8 up echo nameserver 192.168.0.200 > /etc/resolv.conf down route del default gw 192.168.0.200 metric 8
explications: nous affectons au FR l'adresse 192.168.0.202 nous limitons ensuite l'espace d'adressage de ce réseau à l'aide d'un masque. Ce sous réseau ne comportera donc que les adresses 192.168.0.192 à 192.168.0.254 (c'est plus que suffisant puisque de tout façon nous n'en avons besoin que de 2). Nous définissons ensuite l'adresse de la passerelle pour accéder à toute adresse qui ne serait pas comprise dans la plage ci dessus (internet, ou un autre ordinateur du LAN). La passerelle est à l'adresse 192.168.0.200, qui est en fait l'adresse du port USB de votre PC host (c'est le seul accès vers le monde extérieur pour votre FR, voir croquis) Vous noterez que cette route n'est configurée qu'a la connexion du câble USB de façon à ne pas mette la pagaille lorsque vous travaillez en wifi!
Pour avoir une résolution d'adresse cohérente avec votre politique réseau, il faut mettre dans le fichier /etc/resolv.conf la ligne
nameserver 192.168.0.200; c'est ce qui est fait automatiquement à la connexion du câble usb par la ligne up echo nameserver ....
Les requêtes DNS sont envoyées aux PC HOST, qui transmettra à la box (généralement 192.168.0.1), qui elle même renverra vers les serveurs DNS de votre FAI
Vous pouvez aussi mettre directement l'adresse de votre routeur sur le LAN, la box (192.168.0.1)
Evitez de mettre l'adresse de serveur DNS externe comme on le voit parfois (par ex openDNS). Vous pouvez à la rigueur mettre l'adresse du DNS de votre FAI.
Coté PC host:
Il faut commencer par identifier comment s'appelle la connexion coté USB, ça dépend de la distribution qui tourne sur votre FR. C'est soit usb0, soit eth1 ou eth2 (faire un ifconfig pour le savoir). Prenons le cas eth2, à vous d'adapter.
fichier /etc/network/interfaces
# freerunner SHR allow-hotplug eth2 auto eth2 iface eth2 inet static address 192.168.0.200 netmask 255.255.255.192 up iptables -A POSTROUTING -t nat -s 192.168.0.0/24 -j MASQUERADE up echo 1 > /proc/sys/net/ipv4/ip_forward down iptables -D POSTROUTING -t nat -s 192.168.0.0/24 -j MASQUERADE
Pour la première partie, se rapporter à la config du FR. La deuxième partie permet à votre PC host de faire le lien entre le réseau FR coté USB, et le réseau LAN qui donne accès à internet. Vous constaterez que cette configuration s'active à la connexion du câble USB, et se désactive à sa connexion.
Reste encore un détail à régler: si vous souhaitez contacter votre FR depuis un autre PC du LAN. Ce PC ne va pas savoir qu'il doit passer par le PC host pour joindre le sous réseau du FR (et en particulier l'adresse 192.168.0.202). Qu'a cela ne tienne, il suffit d'indiquer dans le fichier interface du PC concerné:
up route add -net 192.168.0.192/25 gw 192.168.0.200
Ce qui signifie: pour toute adresse au delà de 192.168.0.125, il faut passer par le PC host. Vous pourrez ainsi établir un connexion avec votre FR.
Note :
Dans mon cas (réseau freebox), j'ai du utiliser un sous réseau plus petit car le sous réseau proposé contient l'adresse de la freebox (192.168.0.254) qui se trouve ainsi injoignable. J'ai donc choisi le sous réseau 192.168.0.192/27, ce qui donne 255.255.255.224 comme masque de sous réseau. (il s'agit en fait du plus petit sous réseau commençant à 192.168.0.192 qui ne contienne pas 192.168.0.254)
option 2: 2 réseaux
Dans ce cas nous partons toujours du principe que vous êtes en 192.168.0.0 en réseau interne (entre votre pc et le routeur qui vous fournit internet). Dans cette option, nous allons créer coté FR un espace d'adressage complètement différent de celui du LAN Prenons par exemple le 192.168.9.0 qui est rarement utilisé par les modem/routeur, vous pouvez changer à votre convenance.
Voici un schéma sommaire pour comprendre:
__________ 192.168.9.0 ___ 192.168.0.0 ________ Ip FAI
Freerunner------------------ Pc ---------------- routeur-----------Internet
Configuration du pc host
Le PC host sert de passerelle, donc il doit avoir une interface en 192.168.0.x (votre interface normale, si vous êtes déjà connecté au net)
Il nous reste maintenant à configurer l'interface côté réseau du pc qui est frontale au freerunner. Commençons par identifier son nom: faire un 'ifconfig -a' avant d'avoir branché le freerunner puis après, l'interface qui apparait est celle coté freerunner.
fichier /etc/network/interfaces
# PC USB config : connect to the freerunner SHR allow-hotplug eth2 auto eth2 iface eth2 inet static address 192.168.9.200 netmask 255.255.255.192 up iptables -A POSTROUTING -t nat -s 192.168.9.0/24 -j MASQUERADE up echo 1 > /proc/sys/net/ipv4/ip_forward down iptables -D POSTROUTING -t nat -s 192.168.9.0/24 -j MASQUERADE
Bien sûr il faut remplacer eth2 par l'interface en question correspondant au freerunner. (
Notre pc est donc maintenant sur le réseau en 192.168.9.0 côté freerunner et eth2 (avec comme adresse 192.168.0.200), et de l'autre au réseau 192.168.0.0 (le LAN, qui donne accés à internet)
Configuration du freerunner
Ce qui donne coté FR (fichier /etc/network/interfaces):
# Ethernet/RNDIS gadget (g_ether) # ... or on host side, usbnet and random hwaddr auto usb0 iface usb0 inet static address 192.168.9.202 netmask 255.255.255.0 up route add default gw 192.168.9.200 metric 8 up echo nameserver 192.168.9.200 > /etc/resolv.conf down route del default gw 192.168.9.200 metric 8
Dans ce fichier on voit que le freerunner a une adresse ip de 192.168.9.202 et qu'il a comme passerelle notre pc host via l'adresse 192.168.9.200. Il peut donc se connecter au LAN, et à internet. N'oubliez pas que vous avez changé l'adresse ip de votre FR (192.168.0.202 par défaut sur la quasi totalité des distributions). Il faut s'en souvenir si vous essayez d'appliquer un tuto qui donne cette adresse.
tests
Nous allons procéder par étape:
tester la connection entre le PC host et le FR
coté FR:
ping 192.168.9.200
coté PC:
ping 192.168.9.202
test de l'accés à internet du FR
Depuis le FR (en direct ou via ssh)
ping 74.125.19.147
Il s'agit d'une adresse de google qui est normalement toujours active.
Dernier test pour vérifier la résolution d'adresse:
ping www.google.fr
Vous noterez que dans la configuration proposée, la résolution d'adresse est effectuée par le DNS configuré pour votre LAN. Nous n'utilisons pas de serveur DNS spécifique pour le FR comme on peut le voir quelquefois (en tant qu'administrateur réseau, vous devez maîtriser la résolution d'adresse et ne pas la confier à n'importe qui).
Si la résolution d'adresse ne fonctionne pas, vous pouvez ajouter la ligne
nameserver 192.168.0.1
dans le fichier /etc/resolv.conf du FR (en adaptant avec l'adresse de votre box sur le LAN, 192.168.0.1 étant un cas courant) Si ça ne fonctionne toujours pas, recopiez le contenu du fichier resolv.conf du PC HOST dans celui du FR.
Variante : par Knetwormanager
Voici comment faire pour que, par la suite, votre moko soit automatiquement connecté à internet en ayant uniquement branché le cable usb à votre ordinateur (testé sous Kubuntu, cela doit être très proche pour les gens sous kde4 ou sous ubuntu):
En console :
sudo kate /etc/sysctl.conf
et décommentez la ligne ci-dessous(c'est à dire, enlevez le # du début de ligne) :
net.ipv4.ip_forward=1
Sauvegardez et fermez kate
Maintenant on crée des regles iptable pour notre moko :
sudo iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
On sauvegarde ces regles dans un ficher :
sudo iptables-save > iptables.rules
On se met à un bon endroit (oui je le fais en deux fois car chez moi il ne voulait pas le faire directement au bon endroit) :
sudo mv iptables.rules /etc/
Puis on fais en sorte que ces règles soient appliquées à chaque démarrage :
sudo kate /etc/network/if-up.d/iptables
Mettez y ceci :
#!/bin/bash iptables-restore < /etc/iptables.rules
Sauvegardez, quittez puis rendez ce fichier exécutable:
sudo chmod +x /etc/network/if-up.d/iptables
Enfin, la dernière partie :
La définition de l'adresse ip du moko(ah cette sacrée adresse ip... bien connue en France..(elle est belle la france tiens! lois de #*$!.. enfin..revenons à nos moutons)
Trouvez la petite icône en forme de prise réseau dans votre systray (barre d'icônes miniatures) qui vous permet de vous connecter à un réseau sans fil par exemple.
Faites un clic gauche, "Gérer les connexions" , dans l'onglet "filaire" faites "ajouter", changez l'icône et choisissez celle du moko(si si c'est in-dis-pen-sable :) se trouvant dans la catégorie "périphériques"
Ensuite, donnez lui un nom, cochez "connecter automatiquement", puis dans l'onglet "Ethernet" pour "restreindre à l'interface" choisissez celle qui correspond au moko quand vous le branchez (le networkmanager vous donne le nom de l'interface quand on branche son moko),
Passez ensuite à l'onglet "Adresse IP", choisissez "configuration manuelle", Adresse ip : 192.168.0.200. Le masque "255.255.255.0" qui se met automatiquement convient parfaitement.
Ensuite, c'est tout bon. Vous pouvez donc valider en cliquant sur "OK", fermer cette interface de configuration et redémarrer votre ordinateur pour que les changements prennent effet. (ca fait débutant de dire de redémarrer, mais comme je ne suis pas sûr de moi... :) )
Puis après que votre ordinateur a bien redémarré branchez votre moko. Là le networkmanager va essayer de configurer cette nouvelle connexion mais comme il est encore un peu benêt, il ne va pas y arriver (cela devrait être corrigé un jour j'espère..). Mais c'est pas grave : cliquez sur le nom donné à la connexion dans la liste la plus en bas dans l'icône du networkmanager et là cela va marcher tout de suite.
Pour vérifier que votre moko a bien accès à internet vous n'avez simplement qu'à lancer tangogps, par exemple, et voir si les tuiles manquantes sont téléchargées!
Tada!! C'est tout bon!! Maintenant ce sera beaucoup plus simple! Et puis pour se connecter en ssh il ne vous reste plus qu'à faire un "ssh root@192.168.0.202" en console et hop! (testé sous kubuntu 9.10 mais cela devrait également marcher sur la 9.04)
Pour des explications allez sur ce fil http://openmoko-fr.org/forum/viewtopic.php?id=886
LA SECTION QUI SUIT EST OBSOLETE
Sur le PC hôte
Il faut installer: usbutils pour bénéficier de la connexion
tester la connexion
# pc hote en root iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 sysctl -w net.ipv4.ip_forward=1 ip addr add 192.168.0.200/24 dev usb0 ifconfig usb0 up
puis on se connecte en SSH au freerunner (utilisateur normal)
# pc hote en utilisateur normal ssh root@192.168.0.202
On peut alors lancer des commande comme si on était sur le freerunner
Ensuite on teste via des ping :
# freerunner : test de la connexion au PC ping 192.168.0.200
# freerunner : test de la connexion à une adresse ip hors réseau local (ici google) ping 74.125.19.147
# freerunner : verification de la configuration DNS ping www.google.com
Si cette dernière commande ne fonctionne pas, on peut tenter de rajouter un DNS public comme suit:
# freerunner echo nameserver 208.67.222.222 > /etc/resolv.conf
sous Mandriva
Testé avec Mandriva2008.1 (version free x86_64)
1. Lancer le Centre de Contrôle Mandriva :
- menu outils > outils système > configurer votre ordinateur
- ou
- taper "mcc" en ligne de commande
2. Aller dans Réseau & Internet puis partager la connexion internet avec d'autres machines locales
- Il suffit ensuite de suivre l'assistant :
- confirmer l'interface détectée comme connectée à internet (généralement la carte ethernet ou wifi)
- configurer l'interface détectée pour le neo (usb0) : adresse IP = 192.168.0.200 et masque = 255.255.255.252
- désactivez ce qui concerne DNS, DHCP, proxy-cache et la diffusion d'imprimantes
Et voilà : l'interface usb0, le partage de connexion internet et le firewall sont configurés ! (et la config est conservée après reboot)
sous Debian/Ubuntu
Sur le PC hôte, éditer le fichier /etc/network/interfaces pour avoir :
# freerunner
auto usb0
iface usb0 inet static
address 192.168.0.200
netmask 255.255.255.192
post-up /etc/network/freerunner start
pre-down /etc/network/freerunner stop
Créer le fichier /etc/network/freerunner
#!/bin/sh
#
# configures the freerunner for internet
#
#
DEVICE=usb0
IPADDR=192.168.0.200
REMOTE_IPADDR=192.168.0.202
NETMASK=255.255.255.0
# get first ip for dns
DNSIP=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }' | head -n 1 )
case "$1" in
start)
iptables -A POSTROUTING -t nat -j MASQUERADE -s $REMOTE_IPADDR
iptables -A PREROUTING -t nat -p tcp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP
iptables -A PREROUTING -t nat -p udp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP
if [ "$(cat /proc/sys/net/ipv4/ip_forward)" = "0" ]; then
echo "temoprarely allow ip_forward for openmoko" > /var/run/openmoko.ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward
fi
;;
stop)
iptables -D POSTROUTING -t nat -j MASQUERADE -s $REMOTE_IPADDR
iptables -D PREROUTING -t nat -p tcp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP
iptables -D PREROUTING -t nat -p udp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP
if [ -f /var/run/openmoko.ip_forward ]; then
rm /var/run/openmoko.ip_forward
echo 0 > /proc/sys/net/ipv4/ip_forward
fi
;;
esac
Rendre le fichier /etc/network/freerunner exécutable avec la commande
chmod +x /etc/network/freerunner
Sur le Freerunner
éditer le fichier /etc/network/interfaces pour avoir :
# Ethernet/RNDIS gadget (g_ether) # ... or on host side, usbnet and random hwaddr auto usb0 iface usb0 inet static address 192.168.0.202 netmask 255.255.255.0 network 192.168.0.0 gateway 192.168.0.200 up echo nameserver 208.67.222.222 > /etc/resolv.conf up echo nameserver 208.67.220.220 >> /etc/resolv.conf
Résoudre le problème des LAN en 192.168.0.0
Par Erwin (d'après la mailing officielle http://lists.openmoko.org/pipermail/support/2008-August/001288.html)
Avec les freebox par exemple, le réseau par défaut est 192.168.0.0 et on a pas toujours la possibilité de changer ce paramètre. Voici comment changer le réseau du FR pour que votre table de routage fonctionne dans ces conditions. J'ai trouvé le moyen de changer les fichiers /etc/network/interfaces sur le FR et sur le pc pour utiliser le réseau en 192.168.9.0 qui est surement non utilisé. Extrait de mon fichier sur le FR :
# Ethernet/RNDIS gadget (g_ether)
# ... or on host side, usbnet and random hwaddr
auto usb0
iface usb0 inet static
address 192.168.9.202
netmask 255.255.255.0
network 192.168.9.0
gateway 192.168.9.200
# freebox
up echo nameserver 212.27.40.240 >/etc/resolv.conf
# neufbox
# up echo nameserver 192.168.1.1 >/etc/resolv.conf
Les 4 dernières lignes, bien sûr, sont à adapter à votre configuration pour passer sur les bons dns.
Extrait de mon fichier sur le pc :
iface usb0 inet static
address 192.168.9.200
netmask 255.255.255.192
post-up iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.9.192/26
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -P FORWARD ACCEPT
pre-down iptables -D POSTROUTING -t nat -j MASQUERADE -s 192.168.9.192/26
Pour le netmask à 192, vous pouvez utiliser 0 aussi.
Si vous faites cela, toute machine ayant une ip en 192.168.9.xxx sera sur le même réseau que le Freerunner tandis qu'avec un masque (netmask) en .192 vous avez 4 sous réseaux indépendants sur l'ip 192.168.9.xxx
Remplacez alors 192.168.9.192/26 par 192.168.9.0/24 dans les lignes post-up iptables ... ci-dessus