Blog Haypo

Aller au contenu | Aller au menu | Aller à la recherche

mardi 27 janvier 2009

Hors-série Linux Mag : Explorez les richesses du langage Python

Depuis un an, Philippe Biondi parcourait la France sans relâche à la recherche d'auteurs pour écrire un hors-série dédié à Python. Grâce à sa persévérance, le hors-série dédié à Python est enfin en vente dans toutes les librairies (en France) !

J'ai écrit quatre articles dans ce hors-série.

Nouveautés de Python 2.6

Version améliorée, corrigée et illustrée (d'exemples) de ma dépêche linuxfr.org (elle-même basé sur What’s New in Python 2.6 que j'ai traduit).

Nouveautés de Python 3.0

Article écrit avant la sortie de Python 3 par ma propre expérience, et avant que la documentation What’s New In Python 3.0 ne soit écrite par Guido van Rossum (... mais finalement publié après).

Trucs et astuces

Article écrit co-écrit par Philippe Biondi même s'il est trop humble pour l'avouer !

Ctypes et Python

Guide pratique pour écrire un binding C en Python avec ctypes. C'est aussi un retour d'expérience sur mes bindings pynetfilter_conntrack et python-ptrace.

--

Ruez-vous en librairie, il n'y en aura pas pour tout le monde ! Je me suis déjà empressé d'acheter mon exemplaire. J'ai particulièrement apprécié l'article de Gaël Varoquaux : Python comme langage scientifique, article qui sent le vécu et l'utilisation concrète de Python.

lundi 19 janvier 2009

Installer Ubuntu Ibex depuis un disque dur USB externe

Remplacer Debian Sid par Ubuntu Ibex

Il y a 3 mois, j'installais Debian Sid sur mon PC portable à partir d'une clé USB. Je suis assez déçu de Debian Sid car les touches « multimédias » (monter/baisser le son) du clavier ne sont pas détectées, la sortie vidéo (écran externe ou vidéo projecteur) ne fonctionne plus, et KDE est moins joli. D'une manière générale : Debian exige beaucoup de temps pour être configuré. Il y a quelques années, ça m'amusait de bidouiller. Aujourd'hui, je veux juste un système d'exploitation « qui marche ».

Préparer une partition sur le disque externe

Mon lecteur de CD-Rom étant toujours hors-service, j'ai choisi mon disque dur USB externe (500 Go) comme support d'installation. J'ai crée une nouvelle partition (j'avais de l'espace libre non partitionné) ext3 et j'y ai placé les fichiers :

  • /boot/vmlinuz : noyau Ubuntu (téléchargé depuis archive.ubuntu.com/.../hd-media/ étant donné que la version dans l'ISO est destinée booter depuis un CD-Rom)
  • /boot/initrd.gz : configuration du noyau en mode « hd-media » et pilotes (également téléchargé depuis archive.ubuntu.com)
  • /boot/grub/(...) : copie du contenu de /boot/grub/* (Debian)
  • /ubuntu-8.10-alternate-i386.iso : ISO d'Ubuntu Ibex avec l'installeur en mode texte (alternate) pour processeur i386
  • /preseed/ubuntu.preseed : Sélection de paquets à installer (fichier extrait de l'ISO)

Je pense qu'on peut utiliser une partition ext3 existante (ou autre système de fichier reconnu par GRUB).

Configuration de Grub

J'ai choisi Grub pour booter le disque car il permet de modifier la configuration au chargement, et possède un terminal texte avec accès au disque dur. La configuration (boot/grub/menu.lst) minimale est :

title Install Ubuntu
root (hd0,7)
kernel /boot/vmlinuz file=/hd-media/preseed/ubuntu.seed
initrd /boot/initrd.gz

Sous Debian, mon disque externe est reconnu comme /dev/sdb8. Comme Grub compte à partir de zéro (hd0,0), il faut soustraire un au numéro de partition : (hd0,7). Je pensais que c'était (hd1,7), mais comme je boote depuis ce disque, Grub le reconnaît comme hd0 et non hd1, soit.

Pour installer Grub, j'ai lancé grub --config-file=/mnt/install/boot/grub/menu.lst et dans le terminal Grub j'ai tapé setup (hd1).

Lancement de l'installation

Je redémarre ma machine en demandant au BIOS de booter sur ce disque. Et hop, l'installeur se lance !

Quelques remarques :

  • Linux est incroyable, on peut vraiment l'installer de plein de manières différentes et ça marche !
  • Ubuntu ne met pas à jour ses ISO avec des mises à jour. Du coup, quand l'installation est terminée il faut installer 219 mises à jour (!), c'est dommage.
  • J'ai choisi Gnome plutôt que KDE pour changer. Comme ma seconde machine est sous Kubuntu, je vais pouvoir jongler entre Gnome et KDE ;-)

Pour en savoir plus

J'ai fait beaucoup de raccourcis dans cet article pour aller à l'essentiel. Pour les détails, lisez l'article How to install from CF media/USB drive using the grub bootloader sur le wiki d'aide officiel d'Ubuntu.

L'installation d'un nouveau système d'exploitation est dangereuse : vous risquez de perdre des données à la moindre fausse manipulation ! Ne le faites pas si vous ne comprenez pas ce que vous faites. Ou alors faites vous aider !

Un gros merci à phh sur IRC qui m'a bien aidé pour cette installation ;-)

vendredi 16 janvier 2009

Broadcast IPv4, socket RAW et multicast DNS

Pour tester l'interface de configuration de parefeu sur laquelle je travaille, j'ai mis en place des règles de filtrage strictes sur ma machine. Stricte car par défaut rien ne passe : il faut accepter chaque service explicitement avec une nouvelle règle. Cet article présente les cas particuliers que sont les sockets RAW et le multicast IPv4.

DHCP et table raw

Sur ma machine, l'attribution d'une adresse IPv4 est dynamique et utilise le protocole DHCP (niveau 4). Le premier paquet (DHCP Discover) est envoyé à destination de 255.255.255.255 (adresse de broadcast : envoi à tout le monde) avec comme source 0.0.0.0, et l'adresse MAC destination est aussi du broadcast (ff:ff:ff:ff:ff:ff). Bizzarement, même en bloquant tout en sortie avec iptables (iptables -F; iptables -P OUTPUT DROP), DHCP continue à fonctionner.

Ceci vient du fait que le programme dhclient utilise une socket de type RAW. les paquets sont forgés et n'entrent pas dans le suivi de connexion (conntrack) de Netfilter. On peut néanmoins loguer ou filtrer ces paquets en utilisant la table « raw ». Le schéma suivant montre que raw est le premier traitement pour les paquets entrant (chaîne PREROUTING) et sortant (OUTPUT) : schéma synthétique d'iptables.

Multicast DNS

Ubuntu active le démon avahi par défaut, système de découverte de services sur le réseau local. Il embarque un serveur DNS multicast qui n'est pas utilisé pour résoudre les noms de domaine Internet (comme google.com), mais pour la découverte de services. Ce système permet sans aucune configuration manuelle d'échanger des fichiers, d'écouter de la musique, de dialoguer, etc. avec les ordinateurs du réseau local.

Côté technique, avahi envoie et reçoit des paquets UDP sur le port « mDNS » (port 5353 vers 5353) et des des paquets IGMP (Internet Group Management Protocol, à ne pas confondre avec ICMP) en utilisant l'adresse destination 224.0.0.251. Cette adresse fait parti du réseau 224.0.0.0/24 : multicast local (réseau privé).

Note au sujet d'IPv6 : les paquets ICMPv6 multicast sont détectés comme invalides par -m state --state INVALID. Refuser tous les paquets invalides revient donc à se couper d'Internet... J'ai rapporté le bug à Netfilter.

lundi 5 janvier 2009

Obtention d'une adresse IPv6 auprès du routeur

En jouant avec les règles de filtrage IPv4 et IPv6 de Netfilter, je perd régulièrement ma connectivité IPv6. J'ai supprimé mes règles de filtrage et lancé sudo tcpdump -p -i any -s 0 -w snif.pcap 'ip6' pour observer quels paquets sont envoyés au routeur pour obtenir une adresse IPv6. Pour renouveller mon adresse IPv6, j'ai démonté (sudo ifconfig eth0 down) puis remonté (sudo ifconfig eth0 up) mon interface réseau.

Questions

En 1,5 secondes, Linux envoie 3 paquets ICMPv6 en multicast :

  • (t=0,0 sec) Multicast Listener Report Message v2 (type 143)
    • De :: vers ff02::16:
    • Avec « Changed to exclude: ff02::1:ffab:79ed »
    • Annonce au routeur qu'on écoute sur le canal multicast « ff02::16: »
  • (t=0,5 sec) Neighbor solicitation (type 135)
    • De :: vers ff02::1:ffab:79ed:
    • Avec « Target: fe80::216:76ff:feab:79ed »
    • Vérifie auprès des voisins que mon adresse de lien (fe80::216:76ff:feab:79ed) est unique : qu'elle n'est utilisée par aucun autre équipement
  • (t=1,5 sec) Router solicitation (type 133)
    • De fe80::216:76ff:feab:79ed vers ff02::2:
    • Demande au routeur les informations sur le réseau IPv6

Réponse

Le routeur (dans mon cas, une Freebox) répond en 10 ms par un message ICMPv6 « Router advertisement » (type 134), de fe80::207:cbff:fe3c:edd8 vers ff02::1. Les informations les plus importantes sont celles relatives au préfixe : longueur (64), préfixe (2a01:e35:8a04:25b0::), durée de vie/durée de vie préférée (86400 secondes = 1 jour). Le paquet contient également le MTU (1480 octets) et l'adresse MAC du routeur.

Création de l'adresse

Avec ses informations, mon ordinateur peut calculer sa propre adresse IPv6 publique à partir du préfixe (2a01:e35:8a04:25b0::/64) et de l'adresse MAC de mon interface réseau (00:16:76:AB:79:ED). L'adresse résultante est 2a01:e35:8a04:25b0:216:76ff:feab:79ed.

Enfin, un paquet ICMPv6 de type Neighbor solicitation est envoyé aux voisins pour vérifier que la nouvelle adresse (2a01:e35:8a04:25b0:216:76ff:feab:79ed) est bien unique.

Pour plus d'informations, lisez l'article Découverte de voisins.