Connecter le FreeRunner au web via USB

De openmoko-fr.

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