tl;dr : non, mais ça devrait être possible facilement.

Christophe <t...@stuxnet.org> writes:

> Bonjour la liste,
>
> Je ne sais pas si c'est tout à fait l'endroit, mais je me lance : Je me
> casse les dents sur un petit soucis de config de PF en IPv6.

Pour faire écho à Vigdis, m...@openbsd.org est aussi un bon endroit pour
de l'aide sur une conf, là c'est un peu plus compliqué et lié à un
problème d'implémentation donc tech@ me paraît plus approprié.

> Le but est de router les paquets sur deux passerelles différentes en
> fonction de leur classification : "TOS" en IPv4 et "Traffic class" en IPv6.
>
> En IPv4 cela fonctionne parfaitement avec les deux règles suivantes :
>
> pass in quick on $int_if inet proto tcp from $lan_nets to !
> <localnets_v4> port { 80 , 443 } *tos 0x10* route-to ( $ext1_if $gw_ext1
> ) keep state
>
> pass in quick on $int_if inet proto tcp from $lan_nets to !
> <localnets_v4> port { 80 , 443 } *tos 0x00* route-to ( $ext2_if $gw_ext2
> ) keep state
>
> Par contre, je n'ai pas trouvé le moyen de le faire en IPv6 sur ce même
> principe : vu de tcpdump l'entête des paquets contient bien la bonne
> valeur (entête "class" et non "tos" du coup) mais je ne trouve pas la
> bonne syntaxe dans PF pour les prendre en compte (malgré un parcours
> intensif du man et des documentations relatives que j'ai pu trouver).
>
> Tenté (cas 1), ce qui semblait assez naturel d'un premier abord :

C'est ce qui devrait fonctionner mais qui n'est pas géré.

> pass in quick on $int_if inet6 proto tcp from $v6_lan_nets to !
> <localnets_v6> port { 80,443 } *tos 0x10* route-to ($ext1_if
> $v6_host_gwnet1) keep state
>
> pass in quick on $int_if inet6 proto tcp from $v6_lan_nets to !
> <localnets_v6> port { 80,443 } *tos 0x00* route-to ($ext2_if
> $v6_host_gwnet2) keep state
>
> Tenté (cas 2), un peu au pif au vu du résultat de tcpdump (qui indiquait
> "class" plutôt que "tos") :

Je sais pas ce que fait / faisait "class", mais je doute que ce soit ce
qui t'intéresse.

> pass in quick on $int_if inet6 proto tcp from $v6_lan_nets to !
> <localnets_v6> port { 80,443 } *class 0x10* route-to ($ext1_if
> $v6_host_gwnet1) keep state
>
> pass in quick on $int_if inet6 proto tcp from $v6_lan_nets to !
> <localnets_v6> port { 80,443 } *class 0x00* route-to ($ext2_if
> $v6_host_gwnet2) keep state
>
> Aucun des deux cas ne génère d'erreur de syntaxe .
>
> Mais :
> Dans le cas 1, seule la deuxième règle matche tous les paquets (quelque
> soit la valeur de l'entête "class").

PF teste si l'admin a spécifié un tos (différent de zéro) avant de
comparer celui-ci avec le tos du paquet. Donc "tos 0x0" est un nop que
tu peux supprimer de ton jeu de règles.

Je pense que tu vas vite voir pourquoi la première règle ne matche pas.

> Dans le cas 2, aucune des deux règles ne matche, les paquets sont tout
> bonnement jetés par la règle par défaut.

cf. plus haut.

> A préciser qu'il s'agit de la version 4.8 d'OpenBSD.

Pas bien !

> Auriez vous une idée ?

Pas testé, pas même compilé, use at your own risk :

Index: net/pf.c
===================================================================
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.696.2.1
diff -u -p -r1.696.2.1 pf.c
--- net/pf.c    16 Feb 2011 19:13:21 -0000      1.696.2.1
+++ net/pf.c    1 Feb 2014 23:35:30 -0000
@@ -5958,7 +5958,7 @@ pf_test6(int dir, struct ifnet *ifp, str
        pd.sidx = (dir == PF_IN) ? 0 : 1;
        pd.didx = (dir == PF_IN) ? 1 : 0;
        pd.af = AF_INET6;
-       pd.tos = 0;
+       pd.tos = (ntohl(h->ip6_flow) & 0x0ff00000) >> 20;
        pd.tot_len = ntohs(h->ip6_plen) + sizeof(struct ip6_hdr);
        pd.eh = eh;

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE
(auparavant 0x06A11494 / 61DB D9A0 00A4 67CF 2A90  8961 6191 8FBF 06A1 1494)


---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/

Répondre à