IPv4 : la fin est proche

how-to

Annoncée depuis (très très) longtemps, il semble que la pénurie d'adresses IPv4 arrive finalement, et plus rapidement que prévu. La NRO, l'autorité chargée de gérer et de distribuer les adresses IP a annoncé le 18 octobre dernier que 95% des quelques 3 706 452 992 adresses IPv4 (distribuables) sont désormais attribuées. A priori, le dernier bloc sera attribué en début d'année 2011, scellant à tout jamais le sort d'IPv4.

Evidemment, ne plus pouvoir donner d'adresses IP limitera tèrs fortement le développement du réseau des réseaux. C'est pourquoi l'IETF a mis au point une solution depuis longtemps. Cette solution consiste à remplacer le protocole IPv4 par un nouveau protocole : IPv6 (dont les premières spécification sont sorties en 1995). Malheureusement, l'adoption d'IPv6 est encore très très lente. En effet, tous les équipements réseaux doivent être mis à jour ou être remplacés (ainsi que certains systèmes d'exploitation...)

Histoire de me sentir moins coupable, j'ai donc décidé d'activer IPv6 sur ma Freebox (oui, oui, Free propose l'IPv6 à ses clients dégroupés). C'est assez simple à faire : il faut commencer par activer IPv6 dans les paramètres de son compte Free et redémarrer sa Freebox. A ce stade, l'ordinateur dispose d'une adresse IPv4 et d'une adresse IPv6 :

francois@ouranos:~$ ifconfig | grep "inet adr" 
          inet adr:<strong>192.168.0.1</strong>  Bcast:192.168.0.255  Masque:255.255.255.0
          inet adr:127.0.0.1  Masque:255.0.0.0

francois@ouranos:~$ ifconfig | grep inet6
          adr inet6: <strong>2a01:e35:8a48:1800:20f:eaff:fe80:wxyz/64</strong> Scope:Global
          adr inet6: fe80::20f:eaff:fe80:wxyz/64 Scope:Lien
          adr inet6: ::1/128 Scope:Hôte

Et il est même normalement assez intelligent pour utiliser le bon protocole en fonction du service auquel il tente de se connecter ! Voilà, vous pouvez désormais vous connecter à ipv6.google.com et vous la péter en surfant sur le réseau du futur !

Attention cependant, avec IPv6, plus de NAT ! Votre adresse IPv6 est publique : vous vous retrouvez tout nu sur Internet ! Il devient donc indispensable d'avoir un firewall. Pour plus de sécurité, j'ai opté pour ip(6)tables. Notez que j'aurais pu choisir le pare-feu d'OpenOffice.org, chaudement recommandé par le ministère de la Culture (et certainement prochainement labellisé par HADOPI), mais j'ai trouvé moins de documentation le concernant. Voilà donc un petit script iptables qui vous permettra de profiter du réseau IPv6 plus sereinement :

#!/bin/sh

flush_rules()
{
    ip6tables -F
    ip6tables -X
}


start_firewall()
{
    ### DEFAULT POLICY ---------------------------------------------------------

    # On commence par supprimer toutes les règles existantes :
    flush_rules

    # Politique par défaut : on rejette tout :
    ip6tables -P INPUT DROP
    ip6tables -P OUTPUT DROP
    ip6tables -P FORWARD DROP

    # On accepte tout le trafic sur l'interface de loopback :
    ip6tables -A INPUT -s ::1 -d ::1 -j ACCEPT

    # On laisse passer le trafic sortant :
    ip6tables -A OUTPUT -j ACCEPT

    # On laisse passer les réponses à des connexions initiées de l'intérieur :
    ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT



    ### ICMPv6 -----------------------------------------------------------------

    # On autorise ICMPv6 (qui a plus d'importance dans IPv6 que dans IPv4)
    # On pourra éventuellement filtrer plus précisément, au besoin.
    ip6tables -A INPUT -p icmpv6 -j ACCEPT



    ### SERVICES ---------------------------------------------------------------

    # ATTENTION AUX ATTAQUES ! CECI NE SUFFIT PAS

    # Pour autoriser les connexions SSH :
    #ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT

    # Ou si vous hébergez un serveur web :
    #ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT



    ### LOGGING ----------------------------------------------------------------

    ip6tables -N JOURNAL
    ip6tables -A JOURNAL -j LOG --log-level 1 --log-prefix 'FIREWALL [IPv6]:'
    ip6tables -A JOURNAL -j DROP

    ip6tables -A FORWARD -j JOURNAL
    ip6tables -A INPUT -j JOURNAL
    ip6tables -A OUTPUT -j JOURNAL
}


stop_firewall()
{
    # On commence par supprimer toutes les règles existantes :
    flush_rules

    # Politique par défaut : on accepte tout :
    ip6tables -P INPUT ACCEPT
    ip6tables -P OUTPUT ACCEPT
    ip6tables -P FORWARD ACCEPT
}


case "$1" in
    start)
        start_firewall
        echo "Firewall started."
        ;;

    stop)
        stop_firewall
        echo "Firewall stopped."
        ;;

    restart)
        stop_firewall
        echo "Firewall stopped."
        start_firewall
        echo "Firewall restarted."
        ;;

    *)
        echo "Usage: $0 {start|stop|restart}" >&2
        exit 1

esac

exit 0

Il faudra bien entendu le lancer dès le démarrage de la machine. Une petite recherche devrait vous indiquer la marcher à suivre en fonction de votre distribution. Enfin, si quelque chose ne passe pas, pensez à jeter un oeil dans les logs : tout ce qui est filtré y est consigné !