12.5. Filtrer le trafic IPv6

12.5.1. Comment se fait-il que ces filtres tc IPv6 ne fonctionnent pas ?

La base de données des politiques de routage (RPDB) a remplacé le routage IPv4 et la structure d'adressage à l'intérieur du noyau Linux, ce qui a permis les merveilleuses fonctionnalités décrites dans ce HOWTO. Malheureusement, la pile IPv6 à l'intérieur de Linux a été implémentée en dehors de cette structure principale. Bien qu'ils partagent des fonctionnalités, la structure RPDB de base ne participe pas dans ou avec les structures d'adressage et de routage de IPv6.

Ceci va sûrement changer, nous devons juste attendre un peu plus longtemps.

FIXME : Des idées sur des personnes travaillant sur ce sujet ? Planifications ?

12.5.2. Marquer les paquets IPv6 en utilisant ip6tables

ip6tables est capable de marquer un paquet et de lui assigner un numéro :

# ip6tables -A PREROUTING -i eth0 -t mangle -p tcp -j MARK --mark 1

Ceci ne va cependant pas nous aider dans la mesure où le paquet ne passera pas par la structure RPDB.

12.5.3. Utiliser le sélecteur u32 pour repérer le paquet IPv6

IPv6 est normalement encapsulé dans un tunnel SIT et transporté à travers les réseaux IPv4. Voir la section sur le tunnel IPv6 pour de plus amples informations quant à la configuration d'un tel tunnel. Ceci nous permet de filtrer les paquets IPv4 en considérant les paquets IPv6 comme la charge utile.

Le filtre suivant repère tous les paquets IPv6 encapsulés dans des paquets IPv4 :

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
             match ip protocol 41 0xff flowid 42:42

Continuons. Supposons que les paquets IPv6 soient envoyés grâce à des paquets IPv4 et que ces paquets n'ont pas d'options. On pourrait utiliser le filtre suivant pour repérer ICMPv6 dans IPv6 dans IPv4 n'ayant aucune option. 0x3a (58) est le type du champ en-tête suivant pour ICMPv6.

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
            match ip protocol 41 0xff \
            match u8 0x05 0x0f at 0 \
            match u8 0x3a 0xff at 26 \
            flowid 42:42

Repérer l'adresse de destination IPv6 nécessite un peu plus de travail. Le filtre suivant repère l'adresse de destination 3ffe:202c:ffff:32:230:4fff:fe08:358d:

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
             match ip protocol 41 0xff \
             match u8 0x05 0x0f at 0 \
             match u8 0x3f 0xff at 44 \
             match u8 0xfe 0xff at 45 \
             match u8 0x20 0xff at 46 \
             match u8 0x2c 0xff at 47 \
             match u8 0xff 0xff at 48 \
             match u8 0xff 0xff at 49 \
             match u8 0x00 0xff at 50 \
             match u8 0x32 0xff at 51 \
             match u8 0x02 0xff at 52 \
             match u8 0x30 0xff at 53 \
             match u8 0x4f 0xff at 54 \
             match u8 0xff 0xff at 55 \
             match u8 0xfe 0xff at 56 \
             match u8 0x08 0xff at 57 \
             match u8 0x35 0xff at 58 \
             match u8 0x8d 0xff at 59 \
             flowid 10:13

La même technique peut être utilisée pour repérer les réseaux. Par exemple 2001::

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
             match ip protocol 41 0xff \
             match u8 0x05 0x0f at 0 \
             match u8 0x20 0xff at 28 \
             match u8 0x01 0xff at 29 \
             flowid 10:13