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

0 Membres et 1 Invité sur ce sujet

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #132 le: 12 août 2025 à 14:08:25 »
J'ai oublié d'ajouter la règle pour définir le PCP des paquets ARP.

nft add rule netdev filter egress vlan type arp vlan pcp set 6 comment "Set QoS for ARP packets"
À voir si cela fonctionne dans la règle générale ou s'il faut réduire au VLAN 832.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 783
  • Cordon 74 - Orange Fibre Pro
Filtrer les raw socket avec nftables ?
« Réponse #133 le: 12 août 2025 à 14:23:22 »
Je suis pas certain d’avoir compris tes derniers commentaires et la possibilité de loader des rules nftables avant la création des interfaces (et l’utilisation de ifname).

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #134 le: 12 août 2025 à 15:33:09 »
@cyayon

Le $wan_ifname c'est la conversion automatique de mes règles en CLI par ChatGPT. Dans les faits, cela correspond à l'interface physique sfp1 côté WAN de mon routeur.

Je pense que c'est une erreur de spécifier une interface virtuelle dans le crochet (hook) egress de la table netdev après le mot-clé device.
Finalement, la seule chose qui importe est de spécifier le nom de l'interface physique après le mot-clé device.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 783
  • Cordon 74 - Orange Fibre Pro
Filtrer les raw socket avec nftables ?
« Réponse #135 le: 12 août 2025 à 15:39:30 »
Oui je suis d’accord.

Mais si tu charges des rules nftables d’autres tables/chains avec ^iifname (ou ^oifname) en spécifiant une interface virtuelle ou physique qui n’existe pas encore (au moment du boot par exemple), nftables refuse.
Du moins c’est ce que j’ai constaté la dernière fois (et j’ai été contrait de les pré-créer via un script).
Et systemd-networkd n’a pas la capacité à trigger des scripts a la manière de ifup ou ifdown, pour justement charger des scripts de rules nftables juste après leur création.

Faudra que je re-teste en rentrant de vacances…

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 7
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #136 le: 12 août 2025 à 16:42:27 »
Bonjour,

Pour OpenWrt, juste une idee que je n'ai pas encore eu le temps de tester
En se basant sur https://openwrt.org/docs/guide-user/base-system/hotplug, en theorie il devrait etre possible d'ajouter les regles nftables lorsque le device VLAN passe a l'état up, et donc pouvoir preciser comme le device VLAN  lors de l'ajout de la chaine netdev.
Par exemple creer dans /etc/hotplug.d/iface, un fichier 30-orange qui contient ce code
[ "$ACTION" = "ifup" ] && [ "$INTERFACE" = "wan4" ] && {
    logger "Interface $INTERFACE is up (device $DEVICE)"

    # 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 $DEVICE 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" = "ifdown" ] && [ "$INTERFACE" = "wan4" ] && {
    logger "Interface $INTERFACE is down (device $DEVICE)"
    # Remove the table if it exists
    nft destroy "table netdev orange_filter"
}

J'ai deja verifie avec OpenWrt 24.10.2 que la commande fw4 start/reload/restart/stop ne touche pas a la table (par contre fw4 flush lui vide toutes les tables nftables)
Chez moi l'interface (au sens OpenWrt) est associé au device (au sens OpenWrt) eth0.832.

Voila c'etait juste une idee, PAS ENCORE TESTEE, je le reprécise

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #137 le: 12 août 2025 à 17:41:17 »
Citation de: cyayon
Et systemd-networkd n’a pas la capacité à trigger des scripts a la manière de ifup ou ifdown, pour justement charger des scripts de rules nftables juste après leur création.

Je ne sais pas comment cela fonctionne au niveau des services (les dépendances). Sur OpenWrt, cela simplifie la configuration.
J'espérais qu'il aurait suffi d'ajouter ces règles dans le fichier /etc/nftables.conf ou quelque chose comme ça. À voir, si on
peut procéder différemment en fonction des cas.

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #138 le: 12 août 2025 à 17:45:11 »
@pgid69 :

C'est tout l'intérêt d'inclure ces règles avec fw4. On reprend la simplissime écriture de script nftables. Attention à ne pas faire de faute sinon le pare-feu casse.

Code: (uci-defaults) [Sélectionner]
uci -q batch <<-EOF
add firewall include
set firewall.@include[-1].enabled='1'
set firewall.@include[-1].type='nftables'
set firewall.@include[-1].path='/etc/custom-netdev-table.nft'
set firewall.@include[-1].position='ruleset-post'
EOF

# uci commit firewall
# service firewall restart

wan_iface=$(jsonfilter -i /etc/board.json -e '$.network.wan.ports[0]')

cat >/etc/custom-netdev-table.nft <<EOF
table netdev filter
flush table netdev filter

table netdev filter {
        chain set_isp_vlan_832 {
                udp dport 547 vlan pcp set 6 ip6 dscp set cs6 comment "Set QoS for DHCPv6 packets"
                udp dport 67 vlan pcp set 6 ip dscp set cs6 comment "Set QoS for DHCPv4 packets"
                icmpv6 type { 133, 135, 136 } vlan pcp set 6 ip6 dscp set cs6 comment "Set QoS for ICMPv6 packets"
        }
        chain set_isp_vlan_840 {
                ip protocol igmp vlan pcp set 5 comment "Set QoS for IGMP packets"
        }
        chain egress {
                type filter hook egress device $wan_iface priority filter; policy accept;
                vlan type arp vlan pcp set 6 comment "Set QoS for ARP packets"
                vlan id 832 jump set_isp_vlan_832
                vlan id 840 jump set_isp_vlan_840
        }
}
EOF

À noter que cela ne fonctionnera pas avec la version stable actuelle de OpenWrt. Il faut compiler les sources « snapshot » avec OpenWrt Buildroot pour activer le support noyau netdev.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 783
  • Cordon 74 - Orange Fibre Pro
Filtrer les raw socket avec nftables ?
« Réponse #139 le: 12 août 2025 à 17:54:03 »
Après recherche, il semblerait que l’on puisse charger des rules nftables sans que l’interface existe. SAUF pour ingress, et je suis dans ce cas là pour bloquer les scan/brute au plus tôt et avant le conntrack.
N’ayant pas openwrt, je dois procéder moi-même à un contournement en créant des fake interfaces pour que nftables se charge.

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 7
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #140 le: 13 août 2025 à 08:01:54 »

À noter que cela ne fonctionnera pas avec la version stable actuelle de OpenWrt. Il faut compiler les sources « snapshot » avec OpenWrt Buildroot pour activer le support noyau netdev.

Avec la version 24.10.2, j'ai la possibilite d'installer le package kmod-nf-netdev. A priori cela devrait suffire non ? (d'ailleurs le package kmod-nf-arp est peut etre egalement necessaire)
« Modifié: 13 août 2025 à 09:02:43 par pgid69 »

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #141 le: 13 août 2025 à 09:00:10 »
@pgid69 :

C'est vrai que je ne maîtrise pas tellement le gestionnaire de paquets. Cela pourrait fonctionner en installant le paquet kmod-nft-netdev.
Toutefois, la version 24.10.2 ne dispose pas encore de la version nftables 1.1.3.

pgid69

  • Abonné Sosh fibre
  • *
  • Messages: 7
  • Lyon 69
Filtrer les raw socket avec nftables ?
« Réponse #142 le: 13 août 2025 à 10:03:37 »
@pgid69 :

Toutefois, la version 24.10.2 ne dispose pas encore de la version nftables 1.1.3.

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 ca pour verifier que la theorie fonctionne : deja verifier que j'ai bien l'evenement hotplug pour l'interface VLAN, puis si c'est le cas que les requetes DHCP partent pas avant que les regles nftables sont en place, et enfin qu'il y les bonnes priorites

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 735
Filtrer les raw socket avec nftables ?
« Réponse #143 le: 13 août 2025 à 14:09:25 »
Les nouvelles règles sont plus claires. C'est plus abstrait avec moins de facteurs (egress qos map, virtual interface, meta priority).

Je mettrais la solution à jour dès la fin du mois si personne n'y voit d'objection. Je ne suis pas certain que cela fonctionne toujours.