Auteur Sujet: Filtrer les raw socket avec nftables ?  (Lu 14194 fois)

0 Membres et 3 Invités sur ce sujet

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 693
  • XGS-PON et G-PON
Filtrer les raw socket avec nftables ?
« Réponse #96 le: 13 avril 2025 à 23:15:59 »
Qu'est-ce que tu entend par egress-qos-mapping ?

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 671
Filtrer les raw socket avec nftables ?
« Réponse #97 le: 14 avril 2025 à 08:45:43 »
C'est un faux positif.

Je viens de contrôler en réalisant une capture réseau : les PCP et DSCP ne sont pas modifiés. Obtenir des adresses IPv4 et IPv6 m'a induit en erreur.

@Mastah : Si cela avait fonctionné alors le paramètre egress-qos-map (voir le manuel man ip-link) n'aurait plus été nécessaire. On aurait pu
changer directement le PCP sans spécifier la priorité interne des paquets adéquats.

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 671
Filtrer les raw socket avec nftables ?
« Réponse #98 le: 14 avril 2025 à 21:10:03 »
Nouvelle recherche : il existe un rapport de bogue résolu.

Bug 1744 — Packet corruption occurs when using the nftables vlan pcp set command

J'avais déjà mentionné précédemment le test « tests: shell: add vlan mangling test case » sans savoir qu'il avait été créé en lien avec ce bogue.

Le rapporteur du bogue parvient finalement à utiliser la commande suivante pour changer la valeur du champ PCP.

nft add rule bridge br_filter Postrouting vlan pcp 2 vlan pcp set 7 counter

Cela ne fonctionne toujours pas dans mon cas. C'est quasiment la même configuration que dans celle du script Shell de test.


ip netns exec "$ns2" $NFT -f /dev/stdin
table netdev t {
   chain in_update_vlan {
      vlan type arp vlan id set 321 counter
      ip saddr 10.1.1.1 icmp type echo-request vlan id set 321 counter
   }

   chain in {
      type filter hook ingress device veth0 priority filter;
      ether saddr da:d3:00:01:02:03 vlan id 123 jump in_update_vlan
   }

   chain out_update_vlan {
      vlan type arp vlan id set 123 counter
      ip daddr 10.1.1.1 icmp type echo-reply vlan id set 123 counter
   }

   chain out {
      type filter hook egress device veth0 priority filter;
      ether daddr da:d3:00:01:02:03 vlan id 321 jump out_update_vlan
   }
}

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 671
Filtrer les raw socket avec nftables ?
« Réponse #99 le: 25 avril 2025 à 07:48:21 »
Le problème a été résolu dans la version 1.1.3 de nftables. C'est désormais la façon la plus simple de modifier la CoS.
Il faudrait que je l'intègre ce week-end. Je propose de mettre cette solution en avant.

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 693
  • XGS-PON et G-PON
Filtrer les raw socket avec nftables ?
« Réponse #100 le: 25 avril 2025 à 20:02:47 »
Pourrais-tu faire un exemple complet dans une balise code en indiquant chaque variable et leur signifcation ?
Du genre veth0 c'est quoi, l'adresse mac correspond a quoi, etc.. En gros une explication complète de chaque champs / valeurs.

Je testerais ça de mon coté, une fois que j'aurais les détails et je l'ajouterais probablement à mon tuto Debian.

Edit: Ah si aussi, ce qui est encore nécessaire de faire pour que ça fonctionne et ce que l'on peut enlever en utilisant cette méthode.
Tu connais probablement déjà l'adresse mais vois ici ce qui est fait et dit moi ce qui est à changer => https://akhamar.github.io/orange-bypass-debian/30_interfaces/33_configuration_wan.html

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 671
Filtrer les raw socket avec nftables ?
« Réponse #101 le: 25 avril 2025 à 21:45:42 »
@Mastah :

Ce sont des règles nftables classiques.

chain_in
C'est une chaîne de base.

chain_in_vlan_update
C'est une chaîne régulière.

Une chaîne permet de regrouper plusieurs règles pour des raisons de clarté et de concision.

vlan type arp vlan id set 321 counter
Une règle est formée par une séquence d'expressions et se termine par des déclarations.

Le manuel indique que vlan type arp est une expression « En-tête Ethernet ». La règle désigne toutes les trames 802.1q qui encapsulent des paquets ARP.
Le manuel indique aussi que vlan id set est une déclaration de charge utile.

payload_expression set value

vlan id est une expression d'en-tête Ethernet.

counter
Un compteur qui indique le nombre de paquets auxquels s'est appliquée la (ou les) déclaration(s) dans la règle (selon sa position).

Concrètement :

ether daddr da:d3:00:01:02:03 vlan id 321 jump out_update_vlan ➡
⤷ vlan pcp set 6 counter

On change la valeur du champ PCP à 6 de certaines trames 802.1q. Celles ayant l'identifiant VLAN 321 et dont l'adresse destination est da:d3:00:01:02:03.

En résumé :

vlan pcp set 6 est une déclaration et se place donc en fin de règle. Elle définie la valeur du champ PCP d'une trame 802.1q à la priorité 6.





table netdev t {
   chain in_update_vlan {
      vlan type arp vlan id set 321 counter
      ip saddr 10.1.1.1 icmp type echo-request vlan id set 321 counter
   }

   chain in {
      type filter hook ingress device veth0 priority filter;
      vlan pcp 0 counter
      ether saddr da:d3:00:01:02:03 vlan id 123 jump in_update_vlan
   }

   chain out_update_vlan {
      vlan type arp vlan id set 123 counter
      ip daddr 10.1.1.1 icmp type echo-reply vlan id set 123 counter
      vlan pcp set 6 counter
   }

   chain out {
      type filter hook egress device veth0 priority filter;
      ether daddr da:d3:00:01:02:03 vlan id 321 jump out_update_vlan
   }
}


Source: vlan_mangling

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 671
Filtrer les raw socket avec nftables ?
« Réponse #102 le: 25 avril 2025 à 22:01:36 »
@Mastah :

On peut définir explicitement le PCP pour l'interface réseau physique.

#!/bin/bash

# Add PCP 6 (802.1Q prio 6)
nft add "table netdev filter"
nft add "chain netdev filter egress { type filter hook egress device $IFACE priority 0; }"

# IPV4
nft insert "rule netdev filter egress udp dport 67 meta priority set 0:6 ip dscp set cs6 comment \"Set CoS value to 6 for DHCPv4 packets\""
nft insert "rule netdev filter egress ether type arp meta priority set 0:6 comment \"Set CoS value to 6 for arp packets\""

# IPV6
nft insert "rule netdev filter egress udp dport 547 meta priority set 0:6 ip6 dscp set cs6 comment \"Set CoS value to 6 for DHCPv6 packets\""
nft insert "rule netdev filter egress icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } meta priority set 0:6 ip6 dscp set cs6 comment \"Set CoS value to 6 for RS/NS/NA packets\""

echo "Injecting PCP 6 / 802.1Q prio 6 on egress DHCP packet [iface: $IFACE]"

table netdev filter
flush table netdev filter

table netdev filter {
    chain egress {
type filter hook egress device enp3s0 priority filter; policy accept;
vlan id 832 udp dport 547 vlan pcp set 6 ip6 dscp set cs6 counter
vlan id 832 udp dport 67 vlan pcp set 6 ip dscp set cs6 counter
        vlan id 832 icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } vlan pcp set 6 ip6 dscp set cs6 counter
        vlan id 832 vlan type arp vlan pcp set 6 counter
    }
}

table netdev filter
flush table netdev filter

table netdev filter {
    chain set_isp_qos {
        udp dport 547 vlan pcp set 6 ip6 dscp set cs6 counter
        udp dport 67 vlan pcp set 6 ip dscp set cs6 counter
        icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } vlan pcp set 6 ip6 dscp set cs6 counter
        vlan type arp vlan pcp set 6 counter
    }

   chain egress {
       type filter hook egress device enp3s0 priority filter; policy accept;
       vlan id 832 jump set_isp_qos
   }
}