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

0 Membres et 1 Invité sur ce sujet

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 701
  • 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: 735
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: 735
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: 735
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: 701
  • 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: 735
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: 735
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
   }
}

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #103 le: 09 août 2025 à 10:37:57 »
D'autres personnes ont-elles testé cette méthode avec nftables 1.1.3 et le support netdev ?

Cela fonctionne sur mon routeur. Et c'est la façon canonique de procéder.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 783
  • Cordon 74 - Orange Fibre Pro
Filtrer les raw socket avec nftables ?
« Réponse #104 le: 10 août 2025 à 17:34:33 »
Moi j'ai préparé cela (avec $iface_wan1 étant mon interface dans le vlan832 - nommée orange1 ) :

chain egress {
        type filter hook egress devices = $iface_wan1 priority filter; policy accept;
        icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } meta priority set 0:6 ip6 dscp set cs6 counter comment "egress6_prio_orange_ICMP6"
        udp dport 547 meta priority set 0:6 ip6 dscp set cs6 counter comment "egress6_prio_orange_DHCP6"
        udp dport 67 meta priority set 0:6 ip dscp set cs6 counter comment "egress4_prio_orange_DHCP4"
        ether type arp meta priority set 0:6 counter comment "egress_prio_orange_ARP"
        }

est-ce que vlan id 832 .... vlan pcp ... est vraiment nécessaire ?


J'ai aussi un script au boot (avant application des rules firewall :

/etc/systemd/scripts/netdev-egress
#!/bin/sh
# apply netdev/egress priority for orange dhcp client requests
# Version 20240717

SleepRetry=3

# set orange interface
if [ -z "$1" ] ; then
        iface="orange1"
else
        iface="$1"
fi

echo "executing nft chain netdev filter egress device $iface"

ip link show dev $iface
if [ $? -ne 0 ] ; then
        echo "ERROR : interface $iface not exist, retrying in ${SleepRetry}s..."
        sleep $SleepRetry
        ip link show dev $iface ; [ $? -ne 0 ] && echo "ERROR : interface $iface definitely not exist !" && exit 9
fi

echo "executing nft chain netdev filter egress device $iface"

echo ; echo "existing table netdev filter (if exist)"
nft list table netdev filter 2>/dev/null # redirect error messages

echo ; echo "applying nft chain netdev filter egress $iface"
nft add "table netdev filter"
nft add "chain netdev filter egress { type filter hook egress devices = { ${iface} } priority 0; }"
nft insert "rule netdev filter egress udp dport 67 meta priority set 0:6 ip dscp set cs6 counter comment \"egress4_prio_${iface}_DHCP4\""
nft insert "rule netdev filter egress ether type arp meta priority set 0:6 counter comment \"egress_prio_${iface}_ARP\""
nft insert "rule netdev filter egress ip6 daddr { fe00::/7 } udp dport 547 meta priority set 0:6 ip6 dscp set cs6 counter comment \"egress6_prio_${iface}_DHCP6\""
nft insert "rule netdev filter egress ip6 daddr { fe00::/7 } icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } meta priority set 0:6 ip6 dscp set cs6 counter comment \"egress6_prio_${iface}_ICMP6\""
#nft insert "rule netdev filter egress icmpv6 daddr { fe00::/7 } meta priority set 0:6 ip6 dscp set cs6 counter comment \"egress6_prio_${iface}_ICMP6\""

echo ; echo "final nft table netdev filter"
nft list table netdev filter

echo ; echo "networkctl renew $iface"
networkctl renew $iface
echo ; echo "networkctl status $iface"
networkctl -s status $iface

/etc/systemd/system/netdev-egress@.service
# WARNING : not fully tested
[Unit]
Description=netdev-egress pre-requisite for %i
BindTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
ExecStart=/etc/systemd/scripts/netdev-egress %i
RemainAfterExit=true
TimeoutSec=10

[Install]
WantedBy=sys-subsystem-net-devices-%i.device

je fais bien sur un systemctl enable /etc/systemd/system/netdev-egress@orange1.service

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #105 le: 11 août 2025 à 08:28:56 »
@cyayon:

Je ne connais pas systemd. Avant, j'utilisais Gentoo (OpenRC). Maintenant, Guix (Shepherd). Et OpenWrt utilise procd.
Il y a des couches d'abstraction. OpenWrt lance le service « pare-feu » via firewall4 (fw) et permet d'inclure des fichiers
au format nftables.

On peut définir clairement les champs PCP dans les règles du pare-feu, de façon atomique, sans avoir à créer une interface.

Wep c'est bon. Par contre il y a un petit souci. L'interface n'étant pas encore existante au démarrage mais aussi au start du service NFT, il n'est donc pas possible de directement placer la config nftable dans /etc/nftables.conf

Il faut l'injecter dans la phase up du vlan832, juste avant de faire les req DHCP. Il faut aussi delete les rules sur le down de l'interface.

Cela ne fonctionnait pas auparavant à cause d'un bogue.

Citer
Attachment: changes-nftables-1.1.3.txt (type=text/plain)

Florian Westphal (1):
      evalute: make vlan pcp updates work

Pablo Neira Ayuso (3):
      Revert "intervals: do not merge intervals with different timeout"
      netlink: bogus concatenated set ranges with netlink message overrun
      build: Bump version to 1.1.3

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #106 le: 11 août 2025 à 08:37:58 »
Citation de: cyayon
est-ce que vlan id 832 .... vlan pcp ... est vraiment nécessaire ?

Cela permet de sélectionner uniquement les paquets envoyés sur le VLAN 832.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 783
  • Cordon 74 - Orange Fibre Pro
Filtrer les raw socket avec nftables ?
« Réponse #107 le: 11 août 2025 à 08:40:25 »
Salut,

En fait ma question était surtout pour la partie nftables uniquement.

Faut-il :
- les trois paramètres : pcp, dscp et priority ? Ou bien priority et dscp uniquement ? Sachant que j’applique sur l’interface vlan (832) et non sur l’interface physique.
- peut on appliquer pcp directement sur une interface vlan (je pense que oui) ?
- vaut-il mieux appliquer sur l’interface vlan ou physique, et donc sans ou avec ^vlan id 832 ?

Merci.