Principe

Avec ce paramétrage il est possible d'utiliser dans les machines virtuelles une adresse IPv4 locale qui fait l'objet d'une traduction d'adresse dynamique NAT et une adresse IPv6 qui est routée sur Internet.

L'avantage de l'adresse IPv6 routée est de pouvoir créer un serveur accessible directement sur Internet sans configuration du routeur Freebox. Bien entendu ce serveur n'est pas accessible en IPv4, mais comme je l'utilise uniquement pour faire des tests, ce n'est pas un problème.

Freebox Révolution

Free propose 8 sous-réseaux IPv6 /64. Le 1er (qui se termine par 0 chez moi) est réservé au réseau local avec autoconfiguration. Les 7 autres (qui se termines par 1 à 7 chez moi) sont utilisables pour d'autres sous-réseaux.

Pour assigner un sous-réseau IPv6 à un PC il faut :

  1. Connaitre l'adresse IPv6 locale du PC :
    • Sur Ubuntu ouvrir un terminal.
    • Exécuter la commande ipconfig.
    • Repérer à l'écran l'interface ethn reliée à la Freebox et noter l'adresse inet6 locale (cette adresse commence par fe80, la ligne contient aussi Scope:Lien).
  2. Définir le "Next Hop" du sous-réseau :
    • Se connecter à la console de la Freebox via l'adresse http://mafreebox.freebox.fr/.
    • Cliquer sur Paramètres de la Freebox/Mode avancé puis sur Configuration IPv6.
    • Noter le second Prefixe et saisir dans Next Hop l'adresse inet6 locale du PC.
    • Cliquer sur OK pour la prise en compte du paramètre. La Freebox contrôle que l'adresse est accessible.

Configuration du serveur host

Dans /etc/sysctl.conf ajouter les paramètres suivants :

  • Forwarding des paquets IPv6 :
    • net.ipv6.conf.all.forwarding=1
    • net.ipv6.conf.default.forwarding=1
  • Paquets IPv6 de redirect en entrée sur eth0 :
    • net.ipv6.conf.eth0.accept_redirects = 1

Paquets à installer sur Ubuntu

Les paquets nécessaires pour faire fonctionner la machine virtuelle et le firewall sont :

  • qemu-system-x86
  • libvirt-bin, je recommande aussi virtinst et virt-viewer
  • shorewall et shorewall6

Configuration de libvirt sur le host

La configuration par défaut de libvirt crée un bridge (virbr0) avec uniquement un adressage IPv4. Pour ajouter l'IPv6 il faut :

  1. Arrêter le bridge via la commande suivante (il faut arrêter les machines virtuelles avant) :
    • virsh net-destroy default
  2. Modifier les paramètres du bridge :
    • Saisir la commande : virsh net-edit default
    • Après la ligne </ip> ajouter la ligne suivante :
      <ip family='ipv6' address='adresse_du_second_prefixe_freebox::1' prefix='64' />
      On peut remplacer ::1 par l'adresse mac du bridge (3 premiers mots de l'adresse mac ff:fe puis 3 derniers mots de l'adresse mac, soit m1m2:m3ff:fem4:m5m6).
  3. Redémarrer le bridge avec la commande suivante :
    • virsh net-start default

Ensuite on peut contrôler la configuration avec ifconfig virbr0 qui doit afficher la nouvelle adresse IPv6.

Configuration du guest

On peut indiquer les paramètres réseau soit lors de la création de la machine virtuelle soit en modifiant les paramètres existants :

  1. Création de la machine virtuelle :
  2. Modification d'une machine virtuelle existante :
    • Exécuter la commande suivante : virsh edit nom-machine-virtuelle
    • Le fichier doit contenir une seule interface avec les paramètres suivants (les 3 derniers mots de l'adresse mac doivent être différents du bridge et des autres machines virtuelles) :
      • <interface type='network'>
      • <mac address='52:54:00:12:34:56'/>
      • <source network='default'/>
      • <model type='virtio'/>
      • </interface>
    • La ligne <address type='pci' domain='0x0000' bus='0x00' slot='0x99' function='0x0'/> est générée automatiquement.

Shorewall sur le host

Pour le firewall IPv6 dans le répertoire /etc/shorewall6 il faut paramétrer les fichiers suivants :

  • interfaces :
    • - eth0 - dhcp
    • vm virbr0 - bridge,dhcp
    • vm vnet0 - routeback,dhcp (voir si ça sert vraiement)
  • hosts :
    • loc eth0:[fe80::]/10,[réseau_ipv6_principal::]/64
    • vm eth0:[sous_réseau_ipv6_des_vm::]/64
    • net eth0:![fe80::]/10,[réseau_ipv6_principal::]/61
  • policy :
    • fw all ACCEPT
    • vm loc ACCEPT
    • vm net ACCEPT
    • all vm ACCEPT
    • net fw DROP info
    • net loc DROP info
    • all all REJECT info
  • rules j'autorise seulement sur le réseau local : le partage de fichiers Samba, ssh, les impressions Cups et le ping :
    • SECTION NEW
    • ACCEPT loc fw,vm tcp netbios-ssn,microsoft-ds
    • ACCEPT loc fw,vm udp netbios-ns,netbios-dgm
    • ACCEPT loc fw,vm tcp ssh
    • ACCEPT loc fw,vm tcp ipp
    • ACCEPT loc fw,vm udp ipp
    • ACCEPT loc fw,vm ipv6-icmp
  • shorewall6.conf il faut modifier la ligne suivante :
    • STARTUP_ENABLED=Yes
  • zones :
    • fw firewall
    • net ipv6
    • loc ipv6
    • vm ipv6

Pour le firewall IPv4 dans le répertoire /etc/shorewall il faut paramétrer les fichiers suivants :

  • interfaces :
    • - eth0 detect dhcp,logmartians
    • vm virbr0 detect bridge,dhcp
  • hosts :
    • loc eth0:192.168.0.0/16,10.0.0.0/8,172.16.0.0/12 broadcast
    • net eth0:!192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
  • policy :
    • fw all ACCEPT
    • vm loc ACCEPT
    • vm net ACCEPT
    • all vm ACCEPT
    • net fw DROP info
    • net loc DROP info
    • all all REJECT info
  • rules j'autorise seulement sur le réseau local : le partage de fichiers Samba, ssh, les impressions Cups et le ping :
    • SECTION NEW
    • ACCEPT vm fw tcp domain
    • ACCEPT vm fw udp domain
    • ACCEPT loc,vm fw tcp netbios-ssn,microsoft-ds
    • ACCEPT loc,vm fw udp netbios-ns,netbios-dgm
    • ACCEPT loc,vm fw tcp ssh
    • ACCEPT loc,vm fw tcp ipp
    • ACCEPT loc,vm fw udp ipp
    • ACCEPT loc,vm fw icmp
  • shorewall.conf il faut modifier la ligne suivante :
    • STARTUP_ENABLED=Yes
  • zones :
    • fw firewall
    • net ipv4
    • loc ipv4
    • vm ipv4

Nota : Le paramétrage de hosts est différent avec Ubuntu 12.04, il faut mettre les [] autour de toutes les adresses avec leur préfixe.

Shorewall sur le guest

Dans le répertoire /etc/shorewall6 il faut paramétrer les fichiers suivants :

  • interfaces :
    • - eth0 - dhcp
  • hosts :
    • loc eth0:[fe80::]/10,[réseau_ipv6_principal::]/61
    • net eth0:![fe80::]/10,[réseau_ipv6_principal::]/61
  • policy :
    • fw all ACCEPT
    • net all DROP info
    • all all REJECT info
  • rules j'autorise seulement sur le réseau local : le partage de fichiers Samba, ssh, les impressions Cups et le ping :
    • SECTION NEW
    • ACCEPT loc fw tcp netbios-ssn,microsoft-ds
    • ACCEPT loc fw udp netbios-ns,netbios-dgm
    • ACCEPT loc fw tcp ssh
    • ACCEPT loc fw ipv6-icmp
    • Suivant l'utilisation de la VM il faudra aussi ajouter, entre autres, parmit les règles suivantes :
      • ACCEPT loc fw tcp http,https
      • ACCEPT loc fw tcp smtp,smtps,submission
      • ACCEPT loc fw tcp pop3,pop3s,imap2,imaps
  • shorewall6.conf il faut modifier la ligne suivante :
    • STARTUP_ENABLED=Yes
  • zones :
    • fw firewall
    • net ipv6
    • loc ipv6

Configuration des routes entre les hosts

Si vous configurez plusieurs PC en tant que host de machines virtuelles il faut leur attribuer tous un sous-réseau différent. Pour faire communiquer les différentes machines virtuelles je n'ai pas trouvé d'autre moyen que de définir les routes sur tous les PC.

Sous Ubuntu une fois connectée avec l'environnement graphique Unity il faut pratiquer comme suit :

  • Cliquer en haut à droite sur l'icône de connexion réseau.
  • Dans le menu choisir Modification des connexions.
  • Cliquer sur Connexion filaire 1 (où votre connexion si elle est différente) puis sur Modifier...
  • Choisir l'onglet Paramètres IPv6 et cliquer sur Routes...
  • Cliquer sur ajouter puis :
    • Adresse : indiquer le sous-réseau.
    • Préfixe : 64.
    • Passerelle : l'adresse locale du PC comme dans Next Hop.
    • Métrique : 1. Comme la route est unique cette valeur n'a pas d'importance.
  • Cliquer sur Valider, Enregistrer... puis Fermer.

Maintenant il doit être possible de faire un ssh depuis un PC vers la VM d'un autre PC.

Nota : En théorie on doit pouvoir utiliser les paquets redirect envoyés par la Freebox (en mettant dans /etc/sysctl.conf net.ipv6.conf.eth0.accept_redirects=1). J'ai fait un tcpdump sur eth0 qui reçoit bien un paquet redirect, mais la règle n'est pas ajoutée dans les routes.