Free, routeur NAT et IPv6

De Captaine's Wiki.

Si vous êtes chez Free et que vous avez activé l'option IPv6, et que vous voulez configurer votre serveur Ubuntu fonctionne en tant que routeur (et donc la freebox doit être en mode bridge), voici ce qu'il faut faire. Le DHCP ne peut pas fournir d'adresse IPv6 car DHCP est un protocole IPv4. Dans le cas des Freebox, c'est la Freebox qui fournit l'adresse IPv6 à chaque ordinateur. Le problème, c'est que les ordinateurs sont cachés derrière le routeur NAT Ubuntu (ou n'importe quel routeur NAT). Il ne reçoivent donc pas les paquets "Router Advertisement" que la Freebox envoie à chaque PC pour qu'il obtienne son adresse IPv6. De plus, les paquets normaux IPv6 de communication (par exemple, les échange de données lors du surf) sont aussi bloqués par le NAT. Il faut donc créer un passage virtuel entre l'interface eth1 branchée à la Freebox, et l'interface eth0 (ou autre, qui est reliée au réseau local) afin que les paquets IPv6 (et seulement eux) puissent traverser le routeur Ubuntu pour aller jusqu'aux PC du réseau local. Cela s'appelle un PONT ou BRIDGE.

apt-get install bridge-utils

Le problème du pont est qu'il n'est pas filtrant, et donc il laisse par défaut passer les paquets IPv4 et v6 et tout ce qui existe d'autre... (Je vous laisse imaginer la pagaille si tous les PC on la même adresse IPv4 public (par exemple 82.244...) de la Freebox..). C'est pour cela qu'il faut installer ebtables et le configurer pour n'autoriser que les paquets IPv6 à traverser le bridge.

apt-get install ebtables

Pour configurer tout cela, j'ai mis en place un script (dispo sur mon site) qui met en place le NAT pour l'IPv4, le bridge, le firewall, et le blocage de tout ce qui n'est pas IPv6 sur le bridge :

 #!/bin/sh
 #
 # Script de démarrage qui lance l'interface réseau internet,
 # met en place un firewall basique et un partage de connexion et le pont pour l'IPv6 de Free
 #
 # Inspiré du script de Mjules_at_ifrance.com
 #

 # Interface connectée à  Internet 
 interface=eth1
 
 # Interface connectée au réseau local
 interfacelan=eth0
  
 start() {

 # Désactivation des interfaces réseau
 /sbin/ifdown $interface
 /sbin/ifdown $interfacelan
 
 
 # Création du bridge pour faire transiter les paquets IPv6
 brctl addbr br0

 # activation du bridge
 ifconfig br0 up

 # Ajout des interfaces au bridge
 brctl addif br0 eth1
 brctl addif br0 eth0 
 
 # Activation des interfaces réseau 
 /sbin/ifup $interface
 /sbin/ifup $interfacelan
 
 # Dans cette partie, on met en place le firewall
 #vidage des chaines
 iptables -F
 #destruction des chaines personnelles
 iptables -X
  
 #stratégies par défaut
 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT ACCEPT
  
 #init des tables NAT et MANGLE (pas forcément nécessaire)
 iptables -t nat -F
 iptables -t nat -X
 iptables -t nat -P PREROUTING ACCEPT
 iptables -t nat -P POSTROUTING ACCEPT
 iptables -t nat -P OUTPUT ACCEPT
  
 iptables -t mangle -F
 iptables -t mangle -X
 iptables -t mangle -P PREROUTING ACCEPT
 iptables -t mangle -P OUTPUT ACCEPT
  
  
 # Acceptation de toutes les connexions en local (un process avec l'autre)
 iptables -A INPUT -i lo -j ACCEPT
 iptables -A OUTPUT -o lo -j ACCEPT
 #iptables -A INPUT -i eth0 -j ACCEPT
 #iptables -A OUTPUT -o eth0 -j ACCEPT   
  
 #création d'une nouvelle règle
 iptables -N MAregle
  
 #définition de la règle : accepter les nouvelles connexions ne venant pas de l'interface internet
 # et accepter toutes les connexions établies et reliées (ex: une demande de page HTML provoque l'ouverture
 # d'une connexion reliée pour acheminer cette page vers l'ordinateur)
  
 iptables -A MAregle -m state --state NEW -i! $interface -j ACCEPT
 iptables -A MAregle -m state --state ESTABLISHED,RELATED -j ACCEPT
  
 #application de la règle au partage de connexion
 iptables -A INPUT -j MAregle
 iptables -A FORWARD -j MAregle
  
 # activation du forwarding dans le noyau   
 echo 1 >/proc/sys/net/ipv4/ip_forward

 # mise en place du partage de connexion sur le réseau local
 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o $interface -j MASQUERADE
 
 # Ouvertures de ports pour le routeur
 iptables -A INPUT -p TCP --dport ssh -i $interface -j ACCEPT
 iptables -A INPUT -p TCP --dport 80 -i $interface -j ACCEPT
 iptables -A INPUT -p TCP --dport 443 -i $interface -j ACCEPT 
 
 # Port-Forwarding pour adsl TV
 iptables -t nat -A PREROUTING -i eth1 -p udp --dport 31336 -j DNAT --to 192.168.0.3:31336
 iptables -A FORWARD -i eth1 -p udp --dport 31336 -d 192.168.0.3 -j ACCEPT
 
 # On n'autorise que l'IPv6 sur le bridge br0 (86DD Correspond à la valeur du champ type de protocole de couche 3 dans la trame Ethernet)
 ebtables -t broute -A BROUTING -p ! 86DD -j DROP
 
 }
  
 stop() {
         echo 0 >/proc/sys/net/ipv4/ip_forward
         ifconfig br0 down
         brctl delif br0 eth0
         brctl delif br0 eth1
         brctl delbr br0
         ifdown $interface
         iptables -F
         iptables -X
 }
  
 case "$1" in
  start)
         start
         ;;
  
 stop)
         stop
         ;;
 restart)
         stop && start
         ;;
 *)
         echo "Usage $0 {start|stop|restart}"
         exit 1
 esac
  
 exit 0

J'ai mis ce script dans /etc/init.d et il se lance à chaque démarrage grâce à :

sudo update-rc.d scriptconfrouteur start 99 2 . stop 00 2 0 1 6 .

Voilà, c'est tout ce qu'il y a à faire. Il manque encore des règles ip6tables pour le firewall IPv6. Pour l'instant je les ai mises sur chaque PC derrière le routeur.

Catégories