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

0 Membres et 1 Invité sur ce sujet

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 8
  • 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: 8
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #145 le: Aujourd'hui à 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