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/