minicurses 0.3.1

Cette fois, il s'agit de quelques correctifs de bugs stupides que j'ai oubliés de corriger dans la version 0.3 de minicurses. Pour le détail, lisez le Changelog.

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

Correctifs des bugs suivants :

  • Oubli de faire l'édition de liens avec lib_move.o ;
  • Oubli du répertoire examples dans les tarballs (les exemples n'étaient disponibles qu'en clonant le dépôt Mercurial) ;
  • Corrections de petites erreurs dans la documentation.

Posté par x0r à 0 commentaire • Tags : programmation c minicurses minitel

Du « software-defined radio » avec un récepteur DVB-T

Image : RTLSDR en action

Les radioamateurs parmi nous ont peut-être déjà entendu parler d'un petit adaptateur DVB-T qui serait "hackable", et qui peut ainsi être transformé en récepteur radio pour n'importe quelle fréquence dans la plage 50 – 2100 MHz environ.

Voilà qui est particulièrement intéressant, car il met à la portée de tous la possibilité d'explorer ce spectre comme bon nous semble, car j'ai récupéré mon récepteur pour la modique somme de 15 euros. Comparez ça à un scanner radio portatif qui coûte généralement dans les 200 euros... Évidemment, la bande des 3 – 30 MHz m'est inaccessible (ce qui est dommage, car les stations de nombres m'ont l'air fun à écouter), mais c'est déjà pas mal.

Il semblerait que la législation française est assez restrictive quant aux fréquences qu'on a le droit d'écouter avec ces trucs-là (le principal problème étant que les infos sont difficiles à trouver), donc faites gaffe et évitez de parler de ce que vous entendez lorsque vous vous baladez hors des fréquences radioamateur (et ne transmettez pas dessus, ce serait encore plus idiot :]). Je vous donne donc ces instructions en partant du principe que vous ne fassiez pas de bêtises. :)

Comment installer les logiciels nécessaires

Je montrerai la marche à suivre sur Gentoo encore une fois. Les utilisateurs d'autres distributions pourront suivre les instructions sur la page d'OSMO-SDR concernant rtl-sdr. Vous y trouverez également la liste des modèles de clés DVB-T qui fonctionnent.

Ajoutez les lignes suivantes à votre /etc/portage/package.keywords :

net-wireless/gnuradio
dev-lang/orc
dev-python/pyqwt
=net-wireless/rtl-sdr-9999 **
=net-wireless/gr-osmosdr-9999 **

puis dans /etc/portage/package.use :

net-wireless/gnuradio grc qt4 utils wavelet

Enfin, tapez la commande emerge gnuradio gr-osmosdr rtl-sdr, et une fois fini de compiler, vous voilà avec les softs nécessaires pour faire mumuse. Ou presque.

D'abord, lancez l'outil rtl_test qui vous permettra de tester la clé DVB-T. Si vous obtenez Reading samples in async mode..., c'est que votre SDR marche.

Enfin, pour avoir une interface un peu conviviale (et encore) pour utiliser cette SDR, vous pouvez par exemple installer multimode RX. Pour ce faire, faites un svn checkout https://www.cgran.org/svn/projects/multimode, puis lancez le multimode.rb dans le répertoire multimode/trunk. Et voilà !

Posté par x0r à 0 commentaire • Tags : rtlsdr radio radioamateur

L'IPv6 de Free chez soi, pour les geeks

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

Posté par x0r à 10 commentaires • Tags : sysadmin free ipv6 openwrt freebox ndppd

minicurses 0.3

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

Posté par x0r à 0 commentaire • Tags : programmation c minicurses minitel

minicurses 0.2 : un ncurses pour 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.

Posté par x0r à 2 commentaires • Tags : programmation c minicurses minitel