L'IPv6 de Free chez soi, pour les geeks

Auteur :  x0r Publié le   Nombre de commentaires : 10
Mots-clefs : sysadmin free ipv6 openwrt freebox ndppd

C'est bien connu maintenant, Free offre à tout client la possibilité d'obtenir son propre préfixe IPv6 gratuitement. Celui-ci n'étant pas activé par défaut, il faut aller en faire la demande sur son interface client, puis faire un reboot électrique de la Freebox.

Seulement voilà, la topologie réseau d'un geek est probablement la suivante, où la Freebox est en mode switch et avec un routeur OpenWRT calé entre le LAN et le Net :

<Internet>
    |
    |
[Freebox]------[Routeur OpenWRT]------<LAN>

ce qui n'a absolument rien à voir avec la topologie réseau du commun des mortels, où la Freebox sert de point d'accès Wi-Fi, ainsi que de routeur :

<Internet>-----[Freebox]------<LAN>

Ce guide cherche donc à exposer ce que j'ai moi-même compris, et comment faire fonctionner un réseau IPv6 où la Freebox n'est qu'un switch. On implémentera ainsi une solution permettant de router de l'IPv6 de manière globale, sans avoir recours à du brouting, mais en mettant en place un Neighbor Discovery Protocol Proxy au moyen du démon ndppd. On assurera la configuration automatique des postes en IPv6 avec radvd, même s'il est possible d'utiliser DHCPv6 à la place.

Avant de commencer, je souhaite ajouter que je suis un novice ; si vous trouvez la moindre erreur ou imprécision, n'hésitez pas à le signaler dans les commentaires.

IPv6, oui mais pourquoi ?

L'intérêt principal est de passer de l'espace d'adressage global de 32 bits d'IPv4, à des adresses de 128 bits. Avec la raréfaction des adresses IPv4 (il n'y en a déjà plus en Asie du sud-est), il faut penser à passer à l'Internet du futur tôt ou tard.

% host x0r.fr
x0r.fr has address 83.157.158.108
x0r.fr has IPv6 address 2a01:e35:39d9:e6c0:1::2

Aussi, le FAI attribuant seulement les 64 premiers bits de l'adresse IP, toutes les machines du réseau chez l'abonné choississent (ou se font attribuer) les 64 derniers bits. Donc le FAI attribue en fait une famille de 1,8 × 1019 adresses, contrairement à une seule IPv4.

En gros, ça veut dire que le NAT est obsolète (pas de bizarreries d'ouvertures de ports à faire sur le routeur, par exemple), et que n'importe qui dans le réseau peut héberger le service qu'il souhaite (ou un jeu multijoueurs, pour peu qu'il prenne en charge IPv6...), sans trafiquer le routeur.

Préparatifs

Tout d'abord, il faut vous assurer que le support de l'IPv6 soit activé dans toutes vos machines.

Ensuite, sur votre routeur OpenWRT, vous devez avoir la version Backfire (10.3.1) ou Attitude Adjustment (12.09), et installer le module noyau explicitement, ainsi que les outils associés :

root@routeur:~# opkg install kmod-ipv6 ip6tables kmod-ip6tables ip radvd

Ensuite, sur votre compte Free, activez le support IPv6 et rebootez électriquement (débrancher-rebrancher) la Freebox.

Activation de l'IPv6 chez Free

Munissez-vous également de votre préfixe IPv6. Pour moi, mon adresse IPv4 étant 83.157.158.108, mon préfixe IPv6 est 2a01:e35:39d9:e6c0::/64. La partie en gras du préfixe correspond à l'IPv4 de la Freebox encodée en hexadécimal.

Dans tout le tuto, nous présumerons que votre IPv4 est 81.234.56.78 et que votre préfixe IPv6 est 2a01:e35:1234:5670::/64. Aussi, votre réseau domestique IPv4 est supposé être 192.168.0.0/24.

Configuration des interfaces du routeur

Sur OpenWRT, il faudra attribuer deux adresses IPv6, un côté Freebox, et l'autre côté LAN. Dans /etc/config/network, mettez :

config interface wan        
        option ifname eth0.1
        option proto static
        option ipaddr 81.234.56.78
        option netmask 255.255.255.0
        option gateway 81.234.56.254
        option dns '212.27.40.240 212.27.40.241'
        option ip6addr 2a01:e35:1234:5670::2/126
        option ip6gw 2a01:e35:1234:5670::1

config interface lan            
        option type bridge
        option ifname eth0.0
        option proto static
        option ipaddr 192.168.0.254
        option ip6addr 2a01:e35:1234:5670:1::fe/64
        option netmask 255.255.255.0

Les nouvelles options sont ip6addr et ip6gw, qu'on règlera à la main. La passerelle étant bien entendu la Freebox, qui, malgré le mode routeur désactivé, reste un routeur IPv6.

Ensuite, tapez : /etc/init.d/network restart.

Vérifiez ensuite que la configuration a bien été prise en compte :

root@routeur:~# ifconfig br-lan | grep Global 
          inet6 addr: 2a01:e35:1234:5670:1::fe/64 Scope:Global
root@routeur:~# ifconfig eth0.1 | grep Global
          inet6 addr: 2a01:e35:1234:5670::2/126 Scope:Global

Enfin, activez le forwarding IPv6. Dans /etc/sysctl.conf, ajoutez :

net.ipv6.conf.all.forwarding=1                        

puis faites un sysctl -p.

Attention : les adresses commençant par fe80:: sont des adresses "link-local", qui ne sont valables qu'au sein d'un réseau. Elles ne sont pas routables sur Internet !

Configuration de radvd

Maintenant, une machine peut se connecter en Wi-Fi (par exemple) sur le réseau. Bien qu'il sache générer ses 64 derniers bits, comment obtient-il son préfixe (ses 64 premiers bits, donc) et le routeur par défaut ?

En IPv4, c'était DHCP qui s'occupe de ça. Bien qu'un DHCPv6 existe déjà, on va plutôt mettre en œuvre une fonctionnalité d'ICMPv6, à savoir le Router Sollicitation (RS) et le Router Advertisement (RA). Le routeur envoie des RA régulièrement (toutes les 10 secondes par exemple) pour annoncer aux machines du réseau qu'il est la passerelle par défaut. Lorsqu'une machine arrive sur le réseau, cependant, elle envoie un RS à tout le monde, et le routeur répond immédiatement avec un RA. Ainsi, elle s'autoconfigure.

Pour mettre cela en place, on configure le démon radvd comme suit, dans le fichier /etc/config/radvd :

config interface
    option interface    'lan'
    option AdvSendAdvert    1
    option AdvManagedFlag   0
    option AdvOtherConfigFlag 0
    list client     ''
    option ignore       0

config prefix
    option interface    'lan'
    list prefix     2a01:e35:1234:5670::/64
    option AdvOnLink    1
    option AdvAutonomous    1
    option AdvRouterAddr    0
    option ignore       0

config route
    option interface    lan
    list prefix     2a01:e35:1234:5670::/64
    option ignore       0

config rdnss                     
    option interface        'lan'
    list addr               2a01:e35:1234:5670:1::fe
    option ignore           0

config dnssl                     
    option interface        'lan'
    list suffix             'lan.example.com'
    option ignore           0

La section prefix indique les préfixes qui sont diffusés par le démon; route active les annonces de routes pour le préfixe prefix; rdnss (pour Recursive DNS Servers) donne la liste des adresses de serveurs DNS; enfin, dnssl (comme DNS Search List) donne la liste des suffixes DNS à inclure aux domaines de recherche.

Enfin, faites /etc/init.d/radvd start. Ajoutez-le aux services activés au boot par défaut avec /etc/init.d/radvd enable.

Configuration du proxy NDP

Maintenant, quand une machine se connecte au réseau, elle obtient automatiquement une adresse IPv6, avec son préfixe et sa passerelle par défaut. D'ailleurs, on peut le vérifier :

% /sbin/route -A inet6
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
::1/128                        ::                         Un   0   1     4 lo
2a01:e35:1234:5670:51d:1dff:fecb:46d6/128 ::              Un   0   1   142 lo
2a01:e35:1234:5670::/64        ::                         UAe  256 0     0 wlan0
fe80::51d:1dff:fecb:46d6/128   ::                         Un   0   1     4 lo
fe80::/64                      ::                         U    256 0     0 wlan0
ff00::/8                       ::                         U    256 0     0 wlan0
::/0                           fe80::1337:caff:feba:be00  UGDAe 1024 0   0 wlan0
::/0                           ::                         !n   -1  1   382 lo

L'avant-dernière ligne est celle qui nous intéresse, et qui montre l'adresse lien-local du routeur comme passerelle par défaut.

Mais, en fait, ça ne marche pas encore. Pourquoi ? Vous allez voir.

Pour ceux qui sont familiers avec ARP en IPv4 (en deux mots : le protocole qui permet d'obtenir l'adresse MAC d'une machine en ne connaissant que son adresse IP), c'est géré en IPv6 à l'aide d'ICMPv6 encore une fois, mais avec des paquets Neighbor Solicitation (NS) et Neighbor Advertisement (NA). Or, ces paquets ne traversent généralement pas le routeur. La Freebox suppose d'ailleurs qu'il est le seul routeur du réseau, donc lors de la réponse, il s'attend à ce qu'il soit capable de résoudre l'adresse MAC de la machine source pour lui envoyer ses paquets de retour.

Sur votre routeur, ajoutez dans /etc/sysctl.conf :

net.ipv6.conf.all.proxy_ndp=1

puis, encore une fois, faites un sysctl -p.

En théorie, il ne resterait plus qu'à faire quelques manipulations pour que ça marche... mais cela ne fonctionnera qu'avec des hôtes ayant une adresse IPv6 configurée à la main. Ceux qui se connecteront en Wi-Fi n'auront pas de bol. Chaque nouvelle machine sur le réseau nécessitant une intervention manuelle sur le routeur, cette solution semble maintenant idiote, n'est-ce pas ?

C'est pourquoi nous allons installer un outil appelé ndppd, qui va permettre de proxifier les paquets NS et NA proprement et sans intervention de notre part. Ce package fait pour le moment partie du trunk d'OpenWRT, mais pas encore de la release officielle.

Si vous êtes sous Backfire, tapez ceci :

root@routeur:~# opkg install \
    http://downloads.openwrt.org/snapshots/trunk/brcm47xx/packages/ndppd_0.2.2-2_brcm47xx.ipk

Si vous êtes sous Attitude Adjustment, le paquet est directement disponible dans le dépôt :

root@routeur:~# opkg install ndppd

Mettez dans le fichier /etc/ndppd.conf :

route-ttl 30000

proxy br-lan {
   router yes
   timeout 500   
   ttl 30000

   rule 2a01:e35:1234:5670::/126 {
      auto
   }
}

proxy eth0.1 {
   router no
   timeout 500
   ttl 30000

   rule 2a01:e35:1234:5670::/64 {
      auto
   }
}

Avant de lancer le ndppd, mais seulement si vous êtes sous Backfire, il vous faudra modifier l'initscript d'origine. Sous Attitude Adjustment, un initscript du même acabit est déjà packagé. Voici mon /etc/init.d/ndppd :

#!/bin/sh /etc/rc.common
# Copyright (C) 2007-2011 OpenWrt.org

START=90                             

SERVICE_USE_PID=1
SERVICE_PID_FILE=/var/run/ndppd.pid

start() {                          
        mkdir -p /var/run
        start-stop-daemon -S -x /usr/sbin/ndppd -- -p $SERVICE_PID_FILE -d
}                                                                         

stop() {
        start-stop-daemon -K -x /usr/sbin/ndppd
}

Maintenant, enchaînez /etc/init.d/ndppd enable et /etc/init.d/ndppd start.

Tester la connectivité IPv6

Enfin, testez en pingant Google en IPv6 :

% ping6 -c4 ipv6.google.com
PING ipv6.google.com(par03s02-in-x11.1e100.net) 56 data bytes
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=1 ttl=56 time=86.5 ms
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=2 ttl=56 time=83.8 ms
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=3 ttl=56 time=83.1 ms
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=4 ttl=56 time=91.4 ms

--- ipv6.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 83.107/86.238/91.451/3.285 ms

On voit que ça marche bien. Félicitations !

Problèmes

Firewall par défaut mal adapté

Il arrive que le firewall par défaut bloque tous les paquets ICMPv6 nécessaires, malgré le fait que nous en ayions besoin. Dans ce cas-là, rajouter dans /etc/firewall.user :

ip6tables -I INPUT 1 -p icmpv6 -j ACCEPT
ip6tables -I FORWARD 1 -p icmpv6 -j ACCEPT

puis relancer le firewall avec /etc/init.d/firewall restart.

Outils en ligne

Sources

minicurses 0.3

Auteur :  x0r Publié le   Nombre de commentaires : 0
Mots-clefs : programmation c minicurses minitel

Une nouvelle version de minicurses, gérant plus de fonctions ncurses(3) ainsi que l'affichage d'images au format PNM :

Une rose sur Minitel, dédicacée à ma chère et tendre

Cette image a été convertie en PNM en niveaux de gris à partir d'un JPG grâce à gimp. Je n'ai pas encore pensé à coder un outil de conversion automatique, mais ce serait normalement assez facile à faire en Perl ou en shell.

Téléchargements

ou, toujours, pour ceux qui souhaitent récupérer la toute dernière version de développement :

% hg clone https://bitbucket.org/xtab/minicurses

Un tuto et d'autres informations sont disponibles dans les pages de man sur le wiki.

Changelog

  • Ajout de pages de man pour l'ensemble des fonctions prises en charge
  • Ajout de la gestion des images PNM dans le code, ainsi que les fonctions associées
  • Renommage de A_INVISIBLE en A_INVIS comme dans ncurses
  • Quelques corrections de bugs

minicurses 0.2 : un ncurses pour Minitel

Auteur :  x0r Publié le   Nombre de commentaires : 2
Mots-clefs : programmation c minicurses minitel

Ce week-end, je me suis mis en tête de programmer minicurses, une bibliothèque à la ncurses(3) qui serait parfaitement adapté au Minitel.

On pourrait évidemment se demander pourquoi vouloir réinventer la roue, mais en lisant le man de terminfo(5), je me suis rendu compte que certains attributs, comme par exemple la double hauteur ou la double taille, ne sont pas pris en charge par terminfo et donc par ncurses. C'est pourquoi j'ai décidé de faire ma propre bibliothèque. C'est aussi un bel exercice intellectuel qui amène à réfléchir, notamment sur l'algorithme de la fonction refresh(3).

Le but de cette bibliothèque est d'avoir le plus souvent possible le même manuel que ncurses, sauf que j'ajouterai certaines fonctions pour gérer certains attributs gérés par le Minitel. Je cherche aussi le juste milieu entre des algorithmes simples et des optimisations féroces. Le fait que minicurses soit indépendant de terminfo en fait une bibliothèque plutôt légère, même si elle est plutôt destinée à être utilisée sur une plate-forme UNIX.

Téléchargements

Pour le moment, la bibliothèque en est à sa version 0.2. Les téléchargements sont par ici :

ou, pour ceux qui souhaitent récupérer la toute dernière version de développement :

% hg clone https://bitbucket.org/xtab/minicurses

Exemples

Une fois minicurses installé avec make install, et si vous voulez regarder un peu les exemples, tapez :

% cd minicurses/examples
% make
% LD_LIBRARY_PATH="/usr/local/lib" ./test1 > /dev/ttyS0

/dev/ttyS0 est à remplacer avec le bon port série. Il se peut que vous ayiez besoin de changer les paramètres du port série, auquel cas vous devrez taper cette longue commande pour que ça marche :

% stty -F /dev/ttyS0 1200 istrip cs7 parenb -parodd brkint \
    ignpar icrnl ixon ixany opost onlcr cread hupcl isig icanon \
    echo echoe echok

Fonctions prises en charge

  • initscr(), endwin() ;
  • addch(), mvaddch(), addstr, mvaddstr() ;
  • attron(), attroff() ;
  • erase(), clear(), clearok() ;
  • refresh(), beep().

La gestion de l'entrée standard, ainsi que l'affichage d'images en mode semi-graphique, sont en projet pour des futures versions.

Si vous pensez avoir affaire à un bug, n'hésitez pas à jeter un œil au bugtracker du projet pour le signaler.

3615 X0R.FR

Auteur :  x0r Publié le   Nombre de commentaires : 9
Mots-clefs : minitel siana

Comme annoncé dans mon post sur le Minitel comme terminal Linux, j'ai participé à l'événement "3615 au revoir" organisé par le SIANA. C'était l'occasion rêvée de parler avec les autres collègues, que je salue au passage, mais aussi de montrer à des enfants n'ayant jamais connu le Minitel ce à quoi ça ressemble en vrai.

Photo du stand de face

Photo du stand de dos

Mon stand, très dépouillé, était une façon de dire que le Minitel est maintenant mort peut-être, mais les quelques centaines de milliers de terminaux qui restent encore seront maintenant très prisés par les collectionneurs, qui continueront certainement de s'amuser avec.

J'ai fait tourner un Minitel en mode terminal 80-colonnes, avec un petit jeu en Python et ncurses d'anagrammes. Le code source du jeu est à la disposition de tous sur mon dépôt BitBucket.

Photo de près du jeu d'anagrammes

Je tiens donc à remercier les gens du SIANA, et Sephi qui m'a informé de cet événement et qui m'a permis de prendre l'initiative de les rejoindre, alors que les débats et les bricolages autour de cette invention fascinante continueront, eux, à faire vivre le Minitel désormais séparé de son légendaire 3615.

Et pourquoi pas...

Je me propose maintenant de formuler quelques pistes de réflexion qui nous permettront certainement de sauvegarder cet objet qui fait partie du patrimoine français. Ce que nous pourrions faire n'implique pas forcément de l'informatique ou des bricolages électroniques, mais j'imaginais par exemple la possibilité de fournir un serveur open source de contenus pour Minitel. Un truc qui ne fonctionnerait pas forcément comme un serveur Web, étant donné que la navigation sur un "site" Minitel se fait forcément en gardant l'état côté serveur (pas de cookies de session ou ce genre de trucs, par exemple).

Une fois cela fait, le plus intéressant sera ensuite de se livrer à un exercice de "rétro-adaptation" de services Web actuels (Google, Wikipédia, ou pourquoi pas Facebook) afin de réfléchir ce que ces services auraient donné sur Minitel. Les contraintes, les exigences et les moyens techniques ne sont pas du tout les mêmes : j'imaginerais par exemple assez aisément un Wikipédia en version Minitel (lynx se débrouillait d'ailleurs plutôt bien pour ça), ou une "appli Minitel" qui reproduirait le contenu des écrans Infogare pour avoir la liste des horaires des prochains RER.

Quoi qu'il en soit, les documents techniques sont maintenant à la portée de tout le monde, et j'imagine aisément l'apparition de petits projets à gauche et à droite pour continuer à faire vivre ce petit terminal.

(Note : cet article n'a pas été tapé sur un Minitel, mais j'aurais pu ! :])

Installer CyanogenMod 9 sur HP TouchPad

Auteur :  x0r Publié le   Nombre de commentaires : 0
Mots-clefs : touchpad android cyanogenmod

J'ai récemment fait l'acquisition d'un HP TouchPad (merci Gohu !), et pour le moment c'est une jolie tablette, et vraiment pas chère pour ce qu'elle fait.

Cependant, cette tablette est fournie de base avec webOS. Bien que je trouve que c'est un OS tout à fait mignon, la plate-forme est pour ainsi dire délaissée par les développeurs. Il est toutefois possible d'installer CyanogenMod 9 dessus assez facilement lorsqu'on sait ce qu'on fait.

Ce tutoriel part du principe que vous êtes sous Linux, et que votre tablette tourne uniquement WebOS. Les manipulations sont très similaires à celles à faire sous Windows. Une flopée de tutos existent déjà, donc je ferai surtout court et condensé.

Obtenir les prérequis

CyanogenMod

Vous pouvez récupérer une nightly, ou bien la version Alpha 2 qui est la plus à jour en ce moment.

Vous devez garder à l'esprit que le micro et la caméra ne marcheront pas pour le moment, et qu'avec une nightly, vous prenez énormément de risques. Personnellement, j'utilisais la nightly du 15 mai 2012 (avant de compiler mon OS depuis les sources), et je n'ai eu aucun problème avec, que ce soient des reboots intempestifs ou des batteries qui se déchargent plus rapidement qu'elles le devraient. Néanmoins, "your mileage may vary".

Tous les détails sont sur la page de la dernière release Alpha 2.

Google Apps

Les applications Google n'étant pas fournies de base, vous pouvez les DL sur le wiki de CyanogenMod 9. Prenez la version CyanogenMod 9.

Novacom

Novacom va nous servir pour lancer un bootloader customisé, qui va lancer le programme d'installation (ACMEInstaller). Prenez la version qui correspond à votre architecture ; dans le doute, uname -m est votre ami.

moboot et ACMEInstaller

Prenez aussi:

Copier les fichiers au bon endroit

Branchez votre TouchPad en USB sur votre PC, et mettez-le en mode USB.
Créez le répertoire cminstall sur la racine de la tablette, et copiez dedans les .zip :

  • de CyanogenMod 9
  • de moboot
  • de ClockworkMod Recovery

L'installation proprement dite

Sur Gentoo :

# emerge rpm2targz
$ rpmunpack palm-novacom_1.0.80_i386.deb
$ ./opt/Palm/novacom/novacomd

Pendant ce temps, rebootez la tablette en la gardant branchée en USB. Lorsque l'écran devient noir, enfoncez la touche Volume + et gardez-la enfoncée jusqu'à ce que le logo USB apparaisse. À ce moment-là, dans un autre terminal que celui où vous avez lancé novacomd :

$ ./opt/Palm/novacom/novacom boot mem:// < ACMEInstaller2

Maintenant, si tout se passe bien, on aura un écran avec deux Tux et plein de texte qui défile, montrant l'extraction des .zip au bon endroit. Puis, à la fin, un reboot qui devrait donner un joli petit menu.

Important : si d'aventure quelque chose ne se serait pas installé comme il faut (i.e. le .zip est encore dans /cminstall), essayez de le renommer en un truc qui commence par update- (ex. update-foobar.zip).

Conclusion

Ce tuto est plutôt succinct, mais j'espère au moins vous avoir donné l'eau à la bouche.

Mon prochain projet est de compiler CyanogenMod depuis les sources, pour ensuite pouvoir le modifier et ajouter la possibilité de faire du tethering via Bluetooth Dial-Up Networking dans l'OS (au lieu que ce soit un hack dégueu sous la forme d'une appli tierce). Je compte bien utiliser mon vieux portable Samsung comme modem, et je n'envisage pas l'achat d'un smartphone Android dans l'avenir.