Auteur Sujet: Gestion du marquage 802.1p CoS 6 / DSCP CS6  (Lu 879 fois)

0 Membres et 1 Invité sur ce sujet

Tarkok

  • Abonné Orange Fibre
  • *
  • Messages: 233
  • Dunkerque (59)
Gestion du marquage 802.1p CoS 6 / DSCP CS6
« le: 22 novembre 2024 à 22:45:52 »
Bonjour,

Je voulais vous partager certaines subtilités de ma configuration que je n'ai pas retrouvé ailleurs sur ce forum, peut-être cela sera utile à certains ?

Comme relaté pas mal de fois ici, et confirmé et expliqué par @levieuxatorange dans son célèbre post (1), Orange attend un marquage 802.1p CoS 6, au niveau de la trame Ethernet (obligatoire dans certaines régions), et un marquage DSCP CS6 au niveau de la trame IP (fortement recommandé).

Jusqu'à présent je m'en passais sur un accès dans une région dans laquelle ce n'est pas obligatoire, et j'avais positionné un switch entre mon routeur (un serveur x86 virtualisé) et mon ONT sur un accès sur lequel c'est indispensable. Je n'étais donc pas résilient à un changement d'équipement côté Orange sur un des accès et j'introduisais un élément "inutile" par facilité sur d'autres. J'avoue que je trouvais cette solution peu élégante et cherchais depuis un moment à me débarrasser de ce switch. Mon problème, du à la spécificité de mon setup, est que le routeur est entièrement virtualisé, et ne connaît donc que des interfaces "virtio", qui sont branchés à des bridges au niveau de l'hyperviseur, sur lesquels on retrouve les interfaces physiques comme "eth0.832". Impossible donc de gérer le marquage 802.1p à ce niveau.

Au niveau de l'hyperviseur, je peux le gérer et j'étais tombé sur une solution à base de règle nftables que je trouvais plutôt élégante, partagée par @Mastah (2). Le problème que j'ai rencontré avec cette solution est que mon hyperviseur est (pour l'instant) en Debian 11, kernel 5.10, et que le `filter hook egress device` n'est utilisable qu'à partir du kernel 5.16 voir 5.17. J'ai envisagé l'upgrade mais pour diverses raisons annexes ce n'est pas possible pour l'instant. Je vais de toute façon devoir m'y coller un jour, mais ça sera probablement en mi-fin 2025. Reste les règles tc, que je trouve lourdes et difficiles à maintenir.

Mais il y a une autre possibilité: mon routeur virtualisé, lui, est en Debian 12, kernel 6! Assez récent donc pour gérer les règles nftables. Je lui colle donc les règles suivantes, inspiré de celles de @Mastah je retire le marquage CoS qui ne peut se faire à ce niveau comme discuté ci-dessus:

#!/usr/sbin/nft -f

table netdev filter {
        chain egress {
                type filter hook egress device "wan0" priority filter; policy accept;
                icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } ip6 dscp set cs6 comment "Set CoS value to 6 for RS/RA packets"
                udp dport 547 ip6 dscp set cs6 comment "Set CoS value to 6 for DHCPv6 packets"
                udp dport 67 ip dscp set cs6 comment "Set CoS value to 6 for DHCPv4 packets"
        }
}

`wan0` étant l'interface wan de la vm.

Mes paquets sont donc maintenant marqués en DSCP jusqu'à Orange. Il me manque plus qu'à identifier les paquets marqués en DSCP et leur appliquer la CoS idoine au niveau de l'hyperviseur, ce qui est plus triviale à faire avec tc qu'un filtrage complet de tous les types de paquets:

#!/bin/bash

/usr/bin/ip link set dev eth0.832 type vlan egress-qos-map 6:6

/usr/sbin/tc qdisc delete dev eth0.832 root
/usr/sbin/tc qdisc add dev eth0.832 root handle 1: htb
/usr/sbin/tc filter add dev eth0.832 parent 1: protocol ip prio 1 u32 match ip dsfield 0xC0 0xFC action skbedit priority 0:6
/usr/sbin/tc filter add dev eth0.832 parent 1: protocol ipv6 prio 2 u32 match ip6 priority 0xC0 0xFC action skbedit priority 0:6

`eth0.832` étant l'interface wan physique au niveau de l'hyperviseur (en fait eth0 est l'interface physique, eth0.832 est l'interface virtuelle qui porte le vlan mais vous voyez le principe).

Avec cette configuration je tape le dhcp d'orange sans soucis et j'ai accès à Internet. D'ailleurs les codes d'erreurs et leur explications par @levieuxatorange ont été très pratique pour débugger tout ça!

Oui mais voilà... Si vous avez été attentif il manque quelque chose, l'ARP. L'ARP n'est pas un paquet IP, il n'est donc pas marquable CS6 au niveau du routeur. Je n'ai pas encore trouvé comment le marquer avec tc après quelques recherches rapides. Après comme ça marche sans, ça me va. Je sais qu'en cas de saturation du lien ou de l'arbre ça risque de couper, mais ça n'arrive pas.

Voilà voilà, ma modeste contribution après m'être largement inspiré des confs que vous avez partagé ici depuis quelques années, je suis en train de travailler à l'industrialisation de ça grâce à des playbooks Ansible, que je réfléchis à partager quand j'aurai testé et éprouvé ça, et tout mis au propre. Après la stack commence à être un peu daté maintenant, j'ai commencé en 2019 à taper directement le dhcp d'orange et c'est encore du ifupdown/dhclient/radvd/isc-dhcp-server quand certains ici ont franchi le pas vers systemd-networkd depuis quelques temps déjà (3), en sachant que dhclient et isc-dhcp-server ne sont plus maintenus... Je vais sûrement devoir franchir le pas prochainement!

Preneur de vos retours et bon week-end :)

(1) https://lafibre.info/remplacer-livebox/durcissement-du-controle-de-loption-9011-et-de-la-conformite-protocolaire/msg984027/#msg984027
(2) https://lafibre.info/remplacer-livebox/filtrer-les-raw-socket-avec-nftables/msg1079566/#msg1079566
(3) https://lafibre.info/remplacer-livebox/remplacer-la-livebox-par-systemd-networkd-nftables/

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 692
  • XGS-PON et G-PON
Gestion du marquage 802.1p CoS 6 / DSCP CS6
« Réponse #1 le: 23 novembre 2024 à 01:46:09 »
A l'origine je faisais sans nftable et avec cgroup.

apt install cgroup-tools/etc/network/interfaces.d/wan# WAN
auto wan
allow-hotplug wan
iface wan inet manual

# VLAN832
auto vlan832
allow-hotplug vlan832
iface vlan832 inet manual

        # Bind vlan
        vlan-raw-device wan

        # LiveBox mac address
        hw-mac-address xx:xx:xx:xx:xx:xx

        # Wait for ONU to be UP
        up /etc/network/wait_for_wan wan

        # Generate Orange Options (user-class, vendor-class, option 90)
        up /etc/dhcp/dhclient-orange-generator

        # Egress prio 6:6
        up ip l s $IFACE type vlan egress 6:6

        # CGroup Up
        up mkdir -p /sys/fs/cgroup/net_prio && mount -t cgroup -o net_prio net_prio /sys/fs/cgroup/net_prio 2>/dev/null || true
        up cgcreate -g net_prio:dhcp-orange
        up cgset -r "net_prio.ifpriomap=$IFACE 6" dhcp-orange

        # DHCP Up
        up cgexec -g net_prio:dhcp-orange --sticky -- dhclient -4 -i $IFACE -cf /etc/dhcp/dhclient-orange-v4.conf -df /var/lib/dhcp/dhclient-orange-v4.duid -lf /var/lib/dhcp/dhclient-orange-v4.lease -v
        up sleep 2
        up cgexec -g net_prio:dhcp-orange --sticky -- dhclient -6 -P -D LL -i $IFACE -cf /etc/dhcp/dhclient-orange-v6.conf -df /var/lib/dhcp/dhclient-orange-v6.duid -lf /var/lib/dhcp/dhclient-orange-v6.lease -e interface_internal="$IFACE:01 lan:02" -v

        # DHCP Down
        down cgexec -g net_prio:dhcp-orange --sticky -- dhclient -6 -P -D LL -i $IFACE -cf /etc/dhcp/dhclient-orange-v6.conf -df /var/lib/dhcp/dhclient-orange-v6.duid -lf /var/lib/dhcp/dhclient-orange-v6.lease -e interface_internal="$IFACE:01 lan:02" -v -r
        down sleep 2
        down cgexec -g net_prio:dhcp-orange --sticky -- dhclient -4 -i $IFACE -cf /etc/dhcp/dhclient-orange-v4.conf -df /var/lib/dhcp/dhclient-orange-v4.duid -lf /var/lib/dhcp/dhclient-orange-v4.lease -v -r

        # CGroup down
        down cgdelete -g net_prio:dhcp-orange
        down umount /sys/fs/cgroup/net_prio 2>/dev/null || true

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 764
  • Cordon 74 - Orange Fibre Pro
Gestion du marquage 802.1p CoS 6 / DSCP CS6
« Réponse #2 le: 23 novembre 2024 à 10:36:12 »
Salut,

Avant le nftables egress, j'avais ces script basés sur tc uniquement.

Pour la COS6 seulement:
#!/bin/sh
iface="orange1"
tc_qos="0:6"
vlan="832"
physiface="wan1"
mac_addr="<livebox_mac>"
ip link add link $physiface name $iface type vlan id $vlan
ip link set dev $iface address $mac_addr
ip link set $iface up
tc qdisc del dev $iface root ; tc filter del dev $iface
tc qdisc replace dev $iface root handle 1: prio
tc filter add dev $iface parent 1: prio 1 u32 match ip protocol 17 ff match ip dport 67 ffff action skbedit priority $tc_qos # dhcpv4
tc filter add dev $iface parent 1: prio 2 protocol ipv6 u32 match ip6 protocol 17 ff match ip6 dport 547 ffff action skbedit priority $tc_qos # dhcpv6
# the following is not mandatory, but recommended
tc filter add dev $iface parent 1: prio 3 protocol 0x806 u32 match u32 0 0 action skbedit priority $tc_cos # arp
tc filter add dev $iface parent 1: prio 4 protocol ipv6 u32 match ip6 dst fe00::/7 match ip6 protocol 58 ff action skbedit priority $tc_cos # icmpv6_dst (fe00::/7 = fe80::/10 + ff02::/16)

Pour COS6+DSCP:
#!/bin/sh
iface="orange1"
tc_cos="0:6"
tc_tos="0xc0"
tc_retain="0xfc"
vlan="832"
physiface="wan1"
mac_addr="<livebox_mac>"
ip link add link $physiface name $iface type vlan id $vlan
ip link set dev $iface address $mac_addr
ip link set $iface up
tc qdisc del dev $iface root ; tc filter del dev $iface
tc qdisc replace dev $iface root handle 1: prio
tc filter add dev $iface parent 1: prio 1 protocol ip u32 match ip ihl 5 0xf match u16 0x0000 0x1fff at 6 match ip protocol 17 0xff match ip sport 68 0xffff match ip dport 67 0xffff action skbedit priority $tc_cos pipe action pedit pedit munge ip tos set $tc_tos retain $tc_retain pipe action csum ip4h # dhcpv4_DSCP
tc filter add dev $iface parent 1: prio 2 protocol ipv6 u32 match ip6 protocol 17 0xff match ip6 sport 546 0xffff match ip6 dport 547 0xffff action skbedit priority $tc_cos pipe action pedit pedit munge ip6 tos set $tc_tos retain $tc_retain # dhcpv6_DSCP
# the following is not mandatory, but recommended
tc filter add dev $iface parent 1: prio 3 protocol arp u32 match u8 0 0 action skbedit priority $tc_cos # arp
tc filter add dev $iface parent 1: prio 4 protocol ipv6 u32 match ip6 dst fe00::/7 match ip6 protocol 58 0xff action skbedit priority 0:6 pipe action pedit ex munge ip6 traffic_class set $tc_tos retain $tc_retain # icmpv6_dst_DSCP (fe00::/7 = fe80::/10 + ff02::/16)