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

0 Membres et 1 Invité sur ce sujet

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 10
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #144 le: 15 août 2025 à 16:50:27 »
D'ou donc l'interet d'utiliser le script hotplug (ce que tu avais d'ailleurs evoque dans ce sujet que je viens de trouver https://lafibre.info/remplacer-livebox/openwrt-rechercher-comment-changer-la-qos-avec-nftables/) pour appliquer les regles netdev sur l'interface VLAN et non pas sur l'interface utilisee par le VLAN.
Comme ca dans les regles nftables, on change le PCP indirectement en changeant la priorite du paquet par 'meta priority set' plutot que 'vlan pcp set' qui est buggé (j'imagine qu'en sortant du hook egress, le paquet passe par le driver VLAN qui va inserer l'entete VLAN dans lequel le PCP est deduit de la priorite).

Je vais essayer de tester tout ça pour vérifier que la théorie fonctionne : déjà verifier que j'ai bien l'événement hotplug pour l'interface VLAN, puis si c'est le cas que les requêtes DHCP partent pas avant que les règles nftables sont en place, et enfin qu'il y a les bonnes priorités

J'ai enfin pu faire mes essais et ça fonctionne : j'ai pu vérifier avec wireshark que les trames sont correctement modifiées pour répondre aux exigences d'Orange et lorsque je remplace la Livebox par mon routeur je peux naviguer sur Internet : le routeur récupère bien une adresse IPv4, le préfixe IPv6, les serveurs DNS IPv4 et IPv6

Je suis en version 24.10.2 d'OpenWrt. nftables est en version 1.1.1

J'ai du installer les packages complémentaires kmod-nft-netdev (kmod-nft-arp n'est pas nécéssaire car on n'utilise pas de table de la famille arp)

Par contre il ne faut pas mettre le script hotplug dans /etc/hotplug.d/iface, mais dans /etc/hotplug.d/net : d’après ce que je comprends dans /etc/hotplug.d/net les scripts sont exécutés lorsqu'une interface est rajoutée, tandis que dans /etc/hotplug.d/iface les scripts sont exécutés lorsque l'interface est prête c'est a dire completement configurée (donc pour une interface configurée en DHCP, après que l'interface ait recupéré son adresse IP...)

Voici mon script /etc/hotplug.d/net/10-wan.832
#logger -t hotplug-net $(env)

[ "$ACTION" = "add" ] && [ "$DEVICENAME" = "wan.832" ] && {
    # Remove the table if it exists
    nft destroy "table netdev orange_filter"

    # Create table and chain
    nft add "table netdev orange_filter"
    nft add "chain netdev orange_filter egress { type filter hook egress device $DEVICENAME priority 0; }"

    # Insert IPV4 rules
    nft insert "rule netdev orange_filter egress udp dport 67 counter meta priority set 0:6 ip dscp set cs6 comment \"Set CoS value to 6 and DSCP value to 48 (cs6) for DHCPv4 packets\""
    nft insert "rule netdev orange_filter egress ether type arp counter meta priority set 0:6 comment \"Set CoS value to 6 for arp packets\""

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

[ "$ACTION" = "remove" ] && [ "$DEVICENAME" = "wan.832" ] && {
    # Remove the table if it exists
    nft destroy "table netdev orange_filter"
}

Remarque : ce script doit être explicitement rajouté dans la liste de fichiers à sauvegarder (fichier /etc/sysupgrade.conf)

Les règles nftables fixe la priorité du paquet Linux a 6, et fixe le champ DSCP a CS6, mais il faut dans la définition du device vlan, ajouter l'option egress_qos_mapping pour que les paquets en priorité 6 soient encapsulés dans des trames VLAN
avec le champ PCP a 6

Voici la définition de mon device VLAN, dans le fichier /etc/config/network
config device
option name 'wan.832'
option type '8021q'
option ifname 'wan'
option vid '832'
list egress_qos_mapping '6:6'
option macaddr 'XX:XX:XX:XX:XX:XX'

Voila avec cette méthode, je reste avec la version standard d'OpenWrt, et je ne suis pas bloqué par le bug de nftables (qui empeche vlan pcp set de fonctionner)

Si quelqu'un a une idée pour faire plus simple je suis preneur. Ou peut être plus efficace dans le sens ou avec la table netdev, absolument tout le trafic qui sort sur Internet est filtré, même le trafic forwardé depuis le réseau local...
« Modifié: 18 août 2025 à 10:49:39 par pgid69 »

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 10
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #145 le: 24 août 2025 à 10:43:17 »
Pour être sûr à 100% de respecter les recommandations énoncées par @levieuxatorange ici, à savoir de mettre une priorité que sur les paquets provenant du routeur, j'ai rajouté la règle suivante dans /etc/config/firewall
config rule
        option name 'Mark forwarded packets to skip nftable netdev egress rules applied on wan.832 device'
        option src 'lan'
        option dest 'wan'
        option family 'any'
        option proto 'all'
        option set_mark '0x40000000/0x40000000'
        option target 'MARK'
Et j'ai modifié mon script hotplug.d pour rajouter une sous chaîne nftables utilisée que pour les paquets non marqués
#logger -t hotplug-net $(env)

[ "$ACTION" = "add" ] && [ "$DEVICENAME" = "wan.832" ] && {
    # Remove the table if it exists
    nft destroy "table netdev orange_filter"

    # Create table and chains
    nft add "table netdev orange_filter"

    # Create a sub chain to set packet priority and DCSP value
    nft add "chain netdev orange_filter set_isp_qos"

    # Set priority of ARP traffic
    nft insert "rule netdev orange_filter set_isp_qos ether type arp counter meta priority set 0:6 comment \"Set CoS value to 6 for arp packets\""

    # Set priority of DHCPv4 traffic
    nft insert "rule netdev orange_filter set_isp_qos udp dport 67 counter meta priority set 0:6 ip dscp set cs6 comment \"Set CoS value to 6 and DSCP value to 48 (cs6) for DHCPv4 packets\""

    # Set priority of DHCPv6 traffic
    nft insert "rule netdev orange_filter set_isp_qos udp dport 547 counter meta priority set 0:6 ip6 dscp set cs6 comment \"Set CoS value to 6 and DSCP value to 48 (cs6) for DHCPv6 packets\""

    # Set priority of specific ICMPv6 traffic (RS / NS and NA)
    nft insert "rule netdev orange_filter set_isp_qos icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } counter meta priority set 0:6 ip6 dscp set cs6 comment \"Set CoS value to 6 and DSCP value to 48 (cs6) for RS/NS/NA packets\""

    # Create main chain, hooked to egress
    nft add "chain netdev orange_filter egress { type filter hook egress device $DEVICENAME priority 0; }"

    # Apply rules only to traffic not having mark 0x40000000
    nft insert "rule netdev orange_filter egress meta mark and 0x40000000 eq 0 jump set_isp_qos"
}

[ "$ACTION" = "remove" ] && [ "$DEVICENAME" = "wan.832" ] && {
    # Remove the table if it exists
    nft destroy "table netdev orange_filter"
}
C'est peut être aussi plus efficace pour le traffic forwardé du lan vers Internet, traffic majoritaire dans mon cas

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 739
Filtrer les raw socket avec nftables ?
« Réponse #146 le: Aujourd'hui à 10:03:53 »
@pgid69 :

J'avais ouvert un fil de discussion sur ce sujet, mais spécifique à OpenWrt. Procéder ainsi n'est pas réalisable avec OpenWrt en version stable, sans contournements.
C'est dommage de mélanger les choses en connaissance de cause. De plus, dans le procédé utilisé, il me semble que ces règles ne sont pas persistantes. En effet,
fw4 ne recharge que sa propre table (pas la table netdev ajoutée dynamiquement) à chaque reconfiguration d'interface lors de l'amorçage. Pour finir, tu complexifies
encore un peu plus la configuration du pare-feu en « marquant les paquets ».

Le bogue est corrigé dans la version 1.1.3 de nftables. On peut spécifier différemment et surtout, de façon plus évidente, la QoS.

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 10
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #147 le: Aujourd'hui à 10:53:38 »
@basilix

Je suis bien en version stable, en version 24.10.2 avec un firmware directement téléchargé sur le site d'OpenWrt.

Sauf erreur de ma part le bug auquel tu fais référence concerne 'vlan pcp set 6', mais ce n'est pas ce qui est utilisé dans les règles que j'ai données, puisque j'utilise 'meta priority set 0:6' et je te confirme que ça fonctionne en version stable d'OpenWrt avec nftable 1.1.1.
Mais bien sûr en contrepartie, il faut ajouter les règles au device vlan (wan.832) et non pas au device sous jacent (wan), ce qui a pour conséquence de devoir ajouter les règles nftables dans le script hotplug, lorsque l'on est sûr que le device wan.832 existe.
Donc oui il faut ajouter la table dynamiquement à chaque démarrage (les commandes reload, restart de fw4 ne touche pas à la table netdev. La seule commande qui supprime absolument toutes les tables nftables (y compris la table fw4) c'est 'fw4 flush').

Je n'ai pas trouvé comment faire plus simple en version stable.

Et pour le marquage des paquets, oui c'est vrai, c'est du pinaillage, pour être sur qu'aucun paquet qui vient du lan ne sera priorisé en PCP 6.



basilix

  • Abonné Orange Fibre
  • *
  • Messages: 739
Filtrer les raw socket avec nftables ?
« Réponse #148 le: Aujourd'hui à 14:10:56 »
Citation de: pgid69
[...] Mais bien sûr en contrepartie, il faut ajouter les règles au device vlan (wan.832) et non pas au device sous jacent (wan) [...]

Cela ne fonctionnait pas sur l'interface physique lors de tests. Mais cela n'indique pas que filtrer sur l'interface virtuelle est une bonne pratique.

Citation de: pgid69
[...] les commandes reload, restart de fw4 ne touche pas à la table netdev. [...]

Je me suis sûrement embrouillé lors de mes tests. Si c'est le cas alors ma solution restait la plus simple. On ne modifiait que la priorité interne des paquets DHCP dans la table netdev.
Les priorités internes des autres paquets sélectionnés étaient modifié ailleurs (tables inet et arp).

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 10
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #149 le: Aujourd'hui à 15:49:38 »
Cela ne fonctionnait pas sur l'interface physique lors de tests.
Si tu entends par là, modifier la priorité du paquet (meta set priority 0:6) en filtrant sur l'interface physique, ca me parait logique que ca ne fonctionne pas car à priori le paquet a déjà été traité par le driver VLAN. Or c'est ce dernier qui mappe la priorité d'un paquet en valeur du champ PCP (list egress_qos_mapping 6:6 dans la config du device wan.832 dans /etc/config/network)
Donc si on veut rester en version stable d'OpenWrt, la version 24.10.2 avec nftables 1.1.1, puisque cette version de nftables est buggée, on est obligé de filtrer sur l'interface virtuelle (d'ailleurs je ne comprends pas pourquoi tu dis que c'est une mauvaise pratique).
Lorsque la version stable d'OpenWrt integrera nftables en version 1.1.3, alors oui la configuration pourra simplifiée : plus besoin de l'option egress_qos_mapping, on fixe la valeur du PCP directement, en filtrant sur l'interface physique...

Citer
...Les priorités internes des autres paquets sélectionnés étaient modifié ailleurs (tables inet et arp)...
C'est une remarque que je me suis faite, effectivement, mais j'ai voulu avoir toutes les règles qui modifient la priorité au même endroit. C'est un choix perso.