La Fibre

Datacenter et équipements réseaux => Routeurs => Orange fibre Remplacer la LiveBox par un routeur => Discussion démarrée par: toniob le 10 juin 2022 à 17:45:02

Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 10 juin 2022 à 17:45:02
Bonjour,

Il y a déjà pas mal de tutoriels sur ce forum des différentes manières de se passer de livebox. J’en ai utilisé certaines pendant pas mal de temps, mais je passe progressivement ma gestion du réseau au module de systemd : networkd. J’ai réussi à avoir de l’ipv4 et de l’ipv6, de la délégation d’ipv6 sur le réseau interne. La première chose qu’on va faire, c’est d’ajouter le vlan 832 sur l’interface connectée au modem / ont. Je considère que l’interface connectée s’appelle "wan". On créé un fichier /etc/systemd/network/orange.netdev (j’ai remplacé l’adresse MAC par celle de la livebox) :
[NetDev]
Name=orange
Kind=vlan
MACAddress=F0:82:61:xx:xx:xx

[VLAN]
Id=832
EgressQOSMaps=1-0 0-6 6-6

Ensuite, il faut demander à l’interface wan de prendre en compte ce vlan. Pour ça, on ajoute / modifie le fichier /etc/systemd/network/wan.network :
[Network]
VLAN=orange

On peut maintenant configurer l’interface orange, via le fichier /etc/systemd/network/orange.network :
[Match]
Name=orange

[Link]
RequiredForOnline=yes

[Network]
Description=Orange
IPForward=yes
LinkLocalAddressing=ipv6
DHCP=yes
IPv6AcceptRA=yes
DHCPPrefixDelegation=yes

[DHCPv4]
ClientIdentifier=mac
VendorClassIdentifier=sagem
UserClass=FSVDSL_livebox.Internet.softathome.Livebox3
SendOption=90:string:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x09\x00\x00\x05\x58\x01\x03\x41\x01\x0D\x66\x74\x69\x2F\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**
UseHostname=no
UseDNS=no
UseDomains=no

[DHCPv6]
WithoutRA=solicit
UserClass=FSVDSL_livebox.Internet.softathome.livebox4
SendOption=11:string:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x09\x00\x00\x05\x58\x01\x03\x41\x01\x0D\x66\x74\x69\x2F\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**\x**
SendOption=16:string:\x00\x00\x04\x0e\x00\x05\x73\x61\x67\x65\x6d
UseDNS=no
UseNTP=no

[IPv6AcceptRA]
DHCPv6Client=always
UseDNS=no
UseDomains=no

[DHCPPrefixDelegation]
SubnetId=0x1
UplinkInterface=:self
Announce=no

Pour les options 11 et 90, il faut évidemment remplacer les ** par les valeurs de votre nom d’utilisateur fti/ converti en hexadécimal. Voir sur d’autres sujets dans le forum, il y a des outils pour le faire.

Normalement, avec un networkctl reload vous devriez avoir l’ipv4 et l’ipv6 sur l’interface orange, et les routes pour l’ipv6 et l’ipv4. Vous pouvez remplacer le SubnetId par une autre valeur. Je l’ai fixée pour que les sous-réseaux soient constants après des redémarrage (j’ai plusieurs vlan sur le réseau interne).

Enfin, on va demander à faire de la délégation ipv6 sur l’interface interne. Je considère qu’elle s’appelle "lan". Donc on modifie /etc/systemd/network/lan.network :
[Link]
RequiredForOnline=no

[Network]
DHCPServer=yes
DHCPPrefixDelegation=yes
IPv6SendRA=yes
IPv6AcceptRA=no

[Address]
Address=192.168.100.1/24

[DHCPServer]
PoolSize=30
EmitRouter=yes
EmitTimezone=yes
Timezone=Europe/Paris

[DHCPPrefixDelegation]
SubnetId=0x20
Announce=yes

Comme au dessus, vous pouvez modifier / enlever le SubnetId. Attention, il y a aussi la conf ici pour que networkd soit serveur dhcpv4 (en plus de la délégation ipv6).

Pour terminer, on configure le NAT via nftables. Attention, ça remplace iptables, faites attention si vous avez déjà des règles de pare-feu. Voici un fichier simple qui devrait fonctionner (à augmenter avec vos besoins) :
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
chain orange {
# dhcpv4
ip protocol udp udp dport { 68 } ct state new accept
# dhcpv6
# allow dhcpv6
ip6 saddr fe80::/64 udp dport dhcpv6-client accept
ip6 saddr fe80::/64 tcp dport dhcpv6-client accept
}
chain lan {
# dhcp
ip protocol tcp tcp dport { 67 } ct state new accept
ip protocol udp udp dport { 67 } ct state new accept
        }

chain input {
type filter hook input priority 0;

# accept any localhost traffic
iif lo accept

# accept traffic originated from us
ct state established,related accept
ct state invalid drop

# activate the following line to accept common local services
ip saddr 127.0.0.1 accept
ip6 saddr ::1 accept

# allow icmp
ip protocol icmp icmp type { echo-request } accept
ip6 nexthdr ipv6-icmp icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert, destination-unreachable, packet-too-big, mld-listener-query, mld-listener-report, mld-listener-reduction, echo-request, echo-reply } accept

iifname lan jump lan
iifname orange jump orange

# drop any other traffic
counter reject with icmpx type port-unreachable
}
chain forward { # we let everything throught
type filter hook forward priority 0; policy drop;
# allow icmp
ip6 nexthdr ipv6-icmp icmpv6 type { destination-unreachable, packet-too-big, echo-request, echo-reply } accept
# accept traffic originated from us
ct state established,related accept
ct state invalid drop

meta iifname . meta oifname { lan . orange } counter accept
}
chain output {
type filter hook output priority 0;
accept
}
chain postrouting {
type filter hook postrouting priority -150; policy accept;
oifname "orange" counter meta priority set 0:1
oifname "orange" ip protocol icmp counter meta priority set 0:6
oifname "orange" ip protocol igmp counter meta priority set 0:6
oifname "orange" udp dport 67 counter meta priority set 0:6
oifname "orange" udp dport 547 counter meta priority set 0:6
oifname "orange" ip protocol icmpv6 counter meta priority set 0:6
}
}

table ip nat {
chain prerouting {
type nat hook prerouting priority 0;
}
chain output {
type nat hook output priority 0;
}
chain postrouting {
type nat hook postrouting priority 0;
ip saddr 192.168.100.0/24 oifname "orange" counter masquerade
}
}
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 03 juillet 2022 à 13:28:19
Intéressant ce tuto minimaliste.
Je ne vois rien sur la COS, c’est normal ?

Je n’ai pas compris le SubnetId, pourrais-tu en dire plus stp ?
Je suis sous archlinux, donc avec un systemd bcp plus récent.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 04 juillet 2022 à 17:11:37
Pour la COS, je n’en ai pas besoin sur ma ligne. Donc pas possible de faire une conf et de tester si ça fonctionne ou pas. Mais si quelqu’un veut compléter, je peux le rajouter à mon post initial.

Pour le SubnetId, c’est pour dire à systemd-networkd de séparer le /56 fourni par Orange en plusieurs /64 sur les différentes interfaces réseau internes. Ça permet de déclarer quel sous-réseau il va affecter à l’interface (et potentiellement aux machines qui sont connectées à cette interface).
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 04 juillet 2022 à 17:12:58
Ok merci bcp.

sinon systemd-networkd se comporte bien à la longue ?
le renew dhcp fonctionne correctement ?
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 04 juillet 2022 à 17:14:40
J’ai fait ce topic récemment, mais je l’utilise depuis trèèèès longtemps, et je n’ai jamais eu de souci avec. Tout se passe bien, pas besoin de relancer le service. C’est stable.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 04 juillet 2022 à 17:15:53
cool, merci.

sinon je serais curieux de savoir pourquoi Orange nécessite dans certaines régions (ou certaines lignes) de faire le COS, qqun sait ?
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 19 octobre 2022 à 12:45:43
J’ai fait des modifications. Avec les versions récentes de Systemd, il n’y a plus besoin du trick des interfaces dummy pour que l’uplink configure une adresse ipv6. Ça simplifie pas mal la conf.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: kgersen le 19 octobre 2022 à 14:48:28
merci d'avoir mis a jour.
J'ai remarqué que ce tuto n'était pas dans la l'index des solutions, je le met de suite.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 19 octobre 2022 à 14:51:50
merci d'avoir mis a jour.
J'ai remarqué que ce tuto n'était pas dans la l'index des solutions, je le met de suite.

Ah cool, merci. Si ça donne de la visibilité, on a moyen d’améliorer les choses et d’avoir des retours.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 19 octobre 2022 à 15:38:48
Super, merci pour cette mise à jour.

Juste une question, pourquoi UserClass=FSVDSL_livebox.Internet.softathome.Livebox3 en ipv4 et UserClass=FSVDSL_livebox.Internet.softathome.Livebox4 en ipv6 ?
actuellement avec dhclient j'ai la même chaine user-class FSVDSL_livebox.Internet.softathome.Livebox4.

Sinon, mon setup est un peu différent car 1. j'ai besoin de la COS6  et 2. j'ai une ipv4 fixe (et un range /56 fixe), et je souhaite faire de l'adressage statique en ipv6.
Du coup, je compte faire de cette manière (mais je n'ai pas encore testé).

1. je créé uniquement un fichier orange1.network avec le minimum. Au boot l'interface n'existera pas (j'ai un script dédié qui s'en occupe 2.)

[Match]
Name=orange1

[Network]
Description=Orange1
LinkLocalAddressing=ipv6
DHCP=yes

[DHCPv4]
ClientIdentifier=mac
VendorClassIdentifier=sagem
UserClass=FSVDSL_livebox.Internet.softathome.Livebox4
SendOption=90:string:\x00\x00\x00\x00\x00\x00\x00\xxxxxxxxxxxxxx
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no

[DHCPv6]
UserClass=FSVDSL_livebox.Internet.softathome.livebox4
SendOption=11:string:\x00\x00\x00\x00\x00\x00\x00\xxxxxxxxxxxxxxxxxxx
SendOption=16:string:\x00\x00\x04\x0e\x00\x05\x73\x61\x67\x65\x6d
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
UseAddress=no

2. j'ai donc un script dédié qui :
- créé l'interface orange1 en vlan 832
- applique la COS uniquement sur les paquets DHCP/DHCPv6 avec la commande tc (traffic control)
- appel networktcl up orange1 (je n'ai pas testé, mais maintenant que l'interface orange1 existe, j'espère que systemd-networkd va la configurer avec ma conf en 1.)
- configure une ipv6 statique (dans mon range) sur l'interface orange1 (je sais ce n'est pas indispensable, mais je m'en sers pour d'autres trucs).
- charge mes regles firewall nft et active le port forwarding etc...
- tout ca avec des controls à chaque étape bien sûr.
Je fais de ce script un service systemd pour qu'il démarre au boot de la machine (au bon moment, ca c'est pas gagné)


C'est un peu compliqué et je me dis que j'aurais pu déléguer la création de l'interface orange1 à systemd-networkd (comme toi).
Dans mon cas networkd ne récupèrerait pas d'IP d'orange car la COS6 n'est pas encore appliquée. Mais si mon script passe juste derrière cela devrait passer au bout de quelques secondes.

A moins qu'il soit possible de lancer un script post-config, mais je crois que ce n'est pas encore possible.

Un avis ?


Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: kgersen le 19 octobre 2022 à 15:46:13
@toniob

Je vois que "UplinkInterface=:self" est nouveau et permet d'éviter le dummy. Saurais tu quelle version de systemd l'a introduit, je ne trouve pas l'info.

Si je comprend bien ce ":self", il  permet de configurer un /64 sur l'interface qui fait la demande de PD. Si on en veut pas et comme la Livebox ne pas avoir de GUA sur le wan il suffit de l'enlever donc ?

Par contre dans la conf de 'lan', y'a pas dans la section DHCPPrefixDelegation, "UplinkInterface=orange". Ce n'est pas necessaire ? (edit j'ai relu la doc (https://www.freedesktop.org/software/systemd/man/systemd.network.html#%5BDHCPPrefixDelegation%5D%20Section%20Options), par défaut c'est :auto donc ca fonctionnera).
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 19 octobre 2022 à 16:18:53
Je vois que "UplinkInterface=:self" est nouveau et permet d'éviter le dummy. Saurais tu quelle version de systemd l'a introduit, je ne trouve pas l'info.

Je ne sais pas et je ne trouve pas l’info non plus. Je suis sur Debian bullseye et je suis passé de la version 247 (qui nécessite encore le dummy) à la 251 (celle des backports). Donc c’est dans une des 4 versions entre 248 et 251.

Si je comprend bien ce ":self", il  permet de configurer un /64 sur l'interface qui fait la demande de PD. Si on en veut pas et comme la Livebox ne pas avoir de GUA sur le wan il suffit de l'enlever donc ?

C’est ça. Tu peux aussi enlever le DHCPPrefixDelegation=yes de la section Network. Et du coup, tu n’auras de la délégation que sur les interfaces "internes" que tu configures pour en avoir. Perso, j’avais besoin d’une ipv6 sur le routeur. J’ai aussi un script systemd qui scrute les changements d’ipv4 et ipv6 et qui lance un nsupdate pour mettre à jour les ip quand le bail dhcp change.

Par contre dans la conf de 'lan', y'a pas dans la section DHCPPrefixDelegation, "UplinkInterface=orange". Ce n'est pas necessaire ? (edit j'ai relu la doc, par défaut c'est :auto donc ca fonctionnera).

Tu n’as à priori que cette interface qui aura de la delegation de prefix, donc pas besoin de spécifier. Ce n’est utile que si tu as plusieurs Wan.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 19 octobre 2022 à 16:30:31
Juste une question, pourquoi UserClass=FSVDSL_livebox.Internet.softathome.Livebox3 en ipv4 et UserClass=FSVDSL_livebox.Internet.softathome.Livebox4 en ipv6 ?
actuellement avec dhclient j'ai la même chaine user-class FSVDSL_livebox.Internet.softathome.Livebox4.

Bonne question. J’avais ça dans ma conf qui a été améliorée au fur et à mesure, et j’ai jamais changé ça. Et tant que ça fonctionne, je me suis pas posé de question.

Sinon, mon setup est un peu différent car 1. j'ai besoin de la COS6  et 2. j'ai une ipv4 fixe (et un range /56 fixe), et je souhaite faire de l'adressage statique en ipv6.

On peut avoir de l’ip fixe chez Orange / sosh ?

1. je créé uniquement un fichier orange1.network avec le minimum. Au boot l'interface n'existera pas (j'ai un script dédié qui s'en occupe 2.)
2. j'ai donc un script dédié qui :
- créé l'interface orange1 en vlan 832
- applique la COS uniquement sur les paquets DHCP/DHCPv6 avec la commande tc (traffic control)
- appel networktcl up orange1 (je n'ai pas testé, mais maintenant que l'interface orange1 existe, j'espère que systemd-networkd va la configurer avec ma conf en 1.)
- configure une ipv6 statique (dans mon range) sur l'interface orange1 (je sais ce n'est pas indispensable, mais je m'en sers pour d'autres trucs).
- charge mes regles firewall nft et active le port forwarding etc...
- tout ca avec des controls à chaque étape bien sûr.
Je fais de ce script un service systemd pour qu'il démarre au boot de la machine (au bon moment, ca c'est pas gagné)

Tu n’es pas obligé de faire le networkctl up. Dès que systemd-networkd va voir la connexion créée, il va la configurer comme un grand. Pourquoi ne pas mettre l’ipv6 dans ton fichier .network ? Pour les règles nft, tu peux les mettre dès le boot, pas besoin d’attendre que l’interface soit active, il faut juste que tu utilises iifname quand tu nommes tes interfaces dans nftables. Et pour que ça se lance au bon moment, pense à utiliser After dans ton service systemd.

C'est un peu compliqué et je me dis que j'aurais pu déléguer la création de l'interface orange1 à systemd-networkd (comme toi).
Dans mon cas networkd ne récupèrerait pas d'IP d'orange car la COS6 n'est pas encore appliquée. Mais si mon script passe juste derrière cela devrait passer au bout de quelques secondes.
A moins qu'il soit possible de lancer un script post-config, mais je crois que ce n'est pas encore possible.

Depuis systemd 251, tu peux utiliser systemd-networkd-wait-online@<interface>.service pour attendre une interface en particulier, pour faire un genre de post-up.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 19 octobre 2022 à 16:44:40
Merci pour ton retour.

J'ai un contrat orange pro et l'ip fixe est incluse dans l'offre.

Pour ajouter l'ip dans le fichier .network, est-ce possible de faire du DHCP et en plus de fixer une address ip dans la même section ?

Si systemd se lance et configure automatiquement à la création de l'interface orange1, alors ca revient au même que de laisser systemd-networkd créer l'interface orange1 depuis le départ (vlan 832, etc...) et faire la COS6 après manuellement avec un service systemd (avec After=systemd-networkd-wait-online@orange1.service par exemple). Les premiers paquets dhcp ne seront pas taggués COS6 (le temps que le script passe), mais ca ne devrait pas durer longtemps.

Faut que j'ai le courage de tester...   
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 19 octobre 2022 à 17:04:10
Pour ajouter l'ip dans le fichier .network, est-ce possible de faire du DHCP et en plus de fixer une address ip dans la même section ?

Tu peux avoir de l’ipv6 configurée dans ton fichier .network (ajoute une section Address) et avoir du DHCP en plus (parce que ça pourrait être 2 réseaux différents). Donc hésite pas à le faire.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 19 octobre 2022 à 17:09:20
Tu peux avoir de l’ipv6 configurée dans ton fichier .network (ajoute une section Address) et avoir du DHCP en plus (parce que ça pourrait être 2 réseaux différents). Donc hésite pas à le faire.

merci !
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 20 octobre 2022 à 10:17:13
Hello,

question idiote, pour utiliser After=systemd-networkd-wait-online@XXX.service dans un unit systemd, doit-on faire avant un "systemctl enable systemd-networkd-wait-online@XXX.service" ?

merci
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 24 octobre 2022 à 11:01:21
question idiote, pour utiliser After=systemd-networkd-wait-online@XXX.service dans un unit systemd, doit-on faire avant un "systemctl enable systemd-networkd-wait-online@XXX.service" ?

Bonne question, je ne sais pas. À tester.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 06 novembre 2022 à 14:20:48
Hello,

bon, j'ai fais ma config système-networkd.
Depuis une qques jours, tout fonctionnait bien, mais aujourd'hui j'ai perdu la connexion ipv6 (l'ipv4 fonctionnait toujours bien).
J'ai relancé système-networkd, idem, pas de connexion ipv6.

J'ai relancer à nouveau système-networkd en mode debug et voici ce que j'ai comme erreur sur la partie ipv6 :

orange1: State changed: configuring -> configured
orange1: NDISC: Sent Router Solicitation, next solicitation in 4s
orange1: NDISC: Sent Router Solicitation, next solicitation in 8s
orange1: NDISC: No RA received before link confirmation timeout
orange1: NDISC: Invoking callback for 'timeout' event.
orange1: NDisc handler get timeout event
orange1: NDISC: Sent Router Solicitation, next solicitation in 15s
orange1: NDISC: Sent Router Solicitation, next solicitation in 32s
orange1: NDISC: Sent Router Solicitation, next solicitation in 1min 6s
orange1: NDISC: Sent Router Solicitation, next solicitation in 2min 19s
orange1: Received new foreign QDisc (configured): handle=1:0, parent=ffff:ffff, kind=prio
orange1: NDISC: Sent Router Solicitation, next solicitation in 4min 45s
orange1: LLDP Rx: Stopping LLDP client
orange1: DHCPv6 lease lost
orange1: NDISC: Stopping IPv6 Router Solicitation client


Du coup, j'ai delete mon interface orange1 de système-networkd et relancé dhclient. Tout re-fonctionne impeccable.
Stop de dhclient et relance systeme-networkd avec orange1. L'ipv4 et l'ipv6 refonctionne.
Mais j'ai toujours les messages d'erreurs ci-dessus.
 

J'ai l'impression que cela provient du client identifier de systemd-networkd qui n'arriverait pas à envoyer le même que dhclient.
Avec dhclient en ipv4 j'envoie :  send dhcp-client-identifier 01:<mac_addr_livebox>; et en ipv6 : send dhcp6.client-id 00:03:00:<mac_addr_livebox>;
Or avec sysytemd-networkd, l'option ClientIdentifier=mac n'est valable que pour la section [DHCPv4]
Qu'envoie donc systemd-networkd pour l'IPv6 ?
Mais je suis peut être à côté de la plaque …


Il y aussi une autre possibilité, je ne fais pas de delegation de prefix en ipv6, je fais de l'adressage statique.
Voici mon fichier orange1.network :

[Match]
Name=orange1

[Network]
Description=Orange1
LinkLocalAddressing=ipv6
DHCP=yes

# affect Orange IPs
#Address=xx.xx.xx.xx/24
Address=2a01:cb15:xxx:xxx::254/64

[DHCPv4]
ClientIdentifier=mac
VendorClassIdentifier=sagem
UserClass=FSVDSL_livebox.Internet.softathome.Livebox4
SendOption=90:string:\xxxxxxxxx
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
#UseAddress=no
RouteMetric=0

[DHCPv6]
UserClass=FSVDSL_livebox.Internet.softathome.livebox4
SendOption=11:string:\xxxxxxxxx
SendOption=16:string:\x00\x00\x04\x0e\x00\x05\x73\x61\x67\x65\x6d
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
UseAddress=no
RouteMetric=1024

Une idée ?
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: kgersen le 06 novembre 2022 à 16:05:05
comme ca rapidement je dirais que ton interface ne reçoit plus de RA (annonce du routeur en face chez Orange) pour obtenir la route par défaut car celui n'a pas vu passé de renew DHCPv6-PD ?

il faut regarder a combien est la durée du lease DHCPv6-PD de dhclient pour voir si ca colle.

Apres de tout facon, il me semble qu'il est plus propre et recommandé de faire une requete DHCPv6-PD meme si tu n'utilise pas son résultat.

Ma compréhension du coté Orange:
- attente d'un échange DHCPv6-PD complet pour envoyer le /56 et commencer a émettre des RA pour la route par défaut (ou du moins répondre au RS)
- si le client en face n'actualise pas son bail DHCPv6, arrêt de l'envoi des RA (ou réponses aux RS) ?

C'est pour cela, notamment qu'il y a "WithoutRA=solicit" dans la config DHCPv6 du post original de toniob.




Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 06 novembre 2022 à 17:53:03
Ok merci bcp.

Du coup je reprends l’ensemble de la config au début du post excepté la partie délégation de prefix vers l’interface lan c’est ça ?
ca donnerait ca :
[Match]
Name=orange1

[Network]
Description=Orange1
LinkLocalAddressing=ipv6
DHCP=yes
IPForward=yes
IPv6AcceptRA=yes
DHCPPrefixDelegation=yes

# affect Orange IPs
#Address=xx.xx.xx.xx/24
Address=2a01:cb15:xx:xx::254/64

[DHCPv4]
ClientIdentifier=mac
VendorClassIdentifier=sagem
UserClass=FSVDSL_livebox.Internet.softathome.Livebox4
SendOption=90:string:\xxxx
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
#UseAddress=no
RouteMetric=0

[DHCPv6]
UserClass=FSVDSL_livebox.Internet.softathome.livebox4
SendOption=11:string:\xxxx
SendOption=16:string:\x00\x00\x04\x0e\x00\x05\x73\x61\x67\x65\x6d
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
UseAddress=no
RouteMetric=1024
WithoutRA=solicit

[IPv6AcceptRA]
DHCPv6Client=always
UseDNS=no
UseDomains=no

[DHCPPrefixDelegation]
#SubnetId=0x1
UplinkInterface=:self
Announce=no

Mais après quelques tests, même problème avec la conf ci-dessus :

systemd-networkd[2458602]: orange1: DHCPv4 address and routes set.
systemd-networkd[2458602]: orange1: link_check_ready(): IPv4LL:no DHCPv4:yes DHCPv6:no DHCP-PD:no NDisc:no
systemd-networkd[2458602]: orange1: State changed: configuring -> configured
systemd-networkd[2458602]: orange1: NDISC: Received Router Advertisement: flags none preference medium lifetime 4500 sec
systemd-networkd[2458602]: orange1: NDISC: Invoking callback for 'router' event.
systemd-networkd[2458602]: orange1: Acquiring DHCPv6 lease on NDisc request
systemd-networkd[2458602]: orange1: Requesting NDisc route (n/a): dst: n/a, src: n/a, gw: fe80::ba0:bab, prefsrc: n/a, scope: global, table: main(254), proto: ra, type: unicast, nexthop: 0, priority: 1024, flags: n/a
systemd-networkd[2458602]: orange1: Setting SLAAC addresses and router.
systemd-networkd[2458602]: orange1: State changed: configured -> configuring
systemd-networkd[2458602]: orange1: link_check_ready(): IPv4LL:no DHCPv4:yes DHCPv6:no DHCP-PD:no NDisc:no
systemd-networkd[2458602]: orange1: State changed: configuring -> configured
systemd-networkd[2458602]: orange1: Configuring NDisc route (requesting): dst: n/a, src: n/a, gw: fe80::ba0:bab, prefsrc: n/a, scope: global, table: main(254), proto: ra, type: unicast, nexthop: 0, priority: 1024, flags: n/a
systemd-networkd[2458602]: orange1: Received remembered NDisc route (configured): dst: n/a, src: n/a, gw: fe80::ba0:bab, prefsrc: n/a, scope: global, table: main(254), proto: ra, type: unicast, nexthop: 0, priority: 1024, flags: n/a
systemd-networkd[2458602]: orange1: SLAAC addresses and routes set.
systemd-networkd[2458602]: orange1: DHCPv6 client: Sent Solicit
systemd-networkd[2458602]: orange1: DHCPv6 client: Next retransmission in 1s
systemd-networkd[2458602]: orange1: DHCPv6 client: Sent Solicit
systemd-networkd[2458602]: orange1: DHCPv6 client: Next retransmission in 3s
systemd-networkd[2458602]: orange1: DHCPv6 client: Sent Solicit
systemd-networkd[2458602]: orange1: DHCPv6 client: Next retransmission in 7s
systemd-networkd[2458602]: orange1: NDISC: No RA received before link confirmation timeout
systemd-networkd[2458602]: orange1: NDISC: Invoking callback for 'timeout' event.
systemd-networkd[2458602]: orange1: NDisc handler get timeout event
systemd-networkd[2458602]: orange1: DHCPv6 client: Sent Solicit
systemd-networkd[2458602]: orange1: DHCPv6 client: Next retransmission in 14s
systemd-networkd[2458602]: orange1: DHCPv6 client: Sent Solicit
systemd-networkd[2458602]: orange1: DHCPv6 client: Next retransmission in 27s
systemd-networkd[2458602]: orange1: DHCPv6 client: Sent Solicit
systemd-networkd[2458602]: orange1: DHCPv6 client: Next retransmission in 54s
systemd-networkd[2458602]: orange1: DHCPv6 client: Sent Solicit
systemd-networkd[2458602]: orange1: DHCPv6 client: Next retransmission in 1min 45s

Ce qui est curieux, c'est que je récupère bien la gateway fe80::ba0:bab par le dhcp.

Merci
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 07 novembre 2022 à 12:27:39
Je pense vraiment que je n'ai pas de réponse du client dhcpv6 est la conséquence d'un problème de DUID.

avec dhclient j'ai :
config dhclient ipv4   -> send dhcp-client-identifier 01:<Mac_addr_livebox>;
config dhclient ipv6   -> send dhcp6.client-id         00:03:00:<Mac_addr_livebox>;
dans les logs dhclient -> log default-duid "\000\001\000\001*\373n\015D\324T\012D ";
dhclient  lease option dhcp6.client-id 0:3:0:<Mac_addr_livebox>;

Du coup, comment forger le DUID ipv6 dans système-networkd ?

j'ai trouvé les options :
[DHCP]
DUIDType=link-layer
DUIDRawData=00:01:XX:XX:XX:XX:XX:XX

mais je ne suis pas certain de la string à définir pour obtenir la même chose que dhclient (dans les ses logs) : "\000\001\000\001*\373n\015D\324T\012D "
Surtout que cette chaine ne ressemble pas à la mac de la livebox.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 08 novembre 2022 à 12:27:26
C'est bon, tout fonctionne impeccable après un petit reset de l'ONT.
Maintenant j'utilise uniquement DUIDType=link-layer, de cette manière en cas de changement de router, ca devrait ne pas poser de problème.
Y a plus qu'a attendre 72H, le lease ipv6...
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: toniob le 28 novembre 2023 à 10:19:59
J’ai mis à jour le premier post. J’ai modifié la configuration du vlan (j’ai ajouté le egress) et aussi la conf nftables (ajout du bloc postrouting). Normalement, ça devrait prendre en charge les histoires de COS6. Je ne peux pas tester si c’est ok comme il n’y en a pas besoin chez moi. Si quelqu’un peut faire les modifs et valider (ou non), ça serait cool.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 28 novembre 2023 à 13:53:37
Salut,

Je ne suis pas certain que ta config soit bonne. Je n'ai pas testé, mais je ferais plutôt cela :

netdev file :
EgressQOSMaps=6-6

nftables :
# ipv4 (for renew)
table ip mangle {
chain prio_orange {
        udp sport 68 udp dport 67 meta priority set 0:6 ip dscp set cs6 counter comment "mangle-prio_orange_DHCP"
}

    chain POSTROUTING {
    type filter hook postrouting priority mangle; policy accept;
        oifname $iface counter jump prio_orange comment "mangle-postrouting_orange"
   }
}

# ipv6
table ip6 mangle {
chain prio_orange {
    icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } meta priority set 0:6 ip6 dscp set cs6 counter comment "mangle6-prio_orange_ICMP"
        udp sport 546 udp dport 547 meta priority set 0:6 ip6 dscp set cs6 counter comment "mangle6-prio_orange_DHCP"
}

    chain POSTROUTING {
    type filter hook postrouting priority mangle; policy accept;
        oifname $iface ip6 daddr { fe80::/10, ff02::/16 } counter jump prio_orange comment "mangle6-postrouting_orange"
   }
}
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: Mastah le 24 mars 2024 à 20:10:29
Salut,

Je ne suis pas certain que ta config soit bonne. Je n'ai pas testé, mais je ferais plutôt cela :

netdev file :
EgressQOSMaps=6-6

nftables :
# ipv4 (for renew)
table ip mangle {
chain prio_orange {
        udp sport 68 udp dport 67 meta priority set 0:6 ip dscp set cs6 counter comment "mangle-prio_orange_DHCP"
}

    chain POSTROUTING {
    type filter hook postrouting priority mangle; policy accept;
        oifname $iface counter jump prio_orange comment "mangle-postrouting_orange"
   }
}

# ipv6
table ip6 mangle {
chain prio_orange {
    icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } meta priority set 0:6 ip6 dscp set cs6 counter comment "mangle6-prio_orange_ICMP"
        udp sport 546 udp dport 547 meta priority set 0:6 ip6 dscp set cs6 counter comment "mangle6-prio_orange_DHCP"
}

    chain POSTROUTING {
    type filter hook postrouting priority mangle; policy accept;
        oifname $iface ip6 daddr { fe80::/10, ff02::/16 } counter jump prio_orange comment "mangle6-postrouting_orange"
   }
}


Salut Cyayon !
J'aimerais savoir si tu utilises toujours cette config pour obtenir ipv4 et ipv6, et si oui, si il y avait moyen que tu la partage integralement (en donnant les fichiers et commande a executer).
Pourrais-tu aussi m'indiquer la distrib utilisé (ubuntu ou debian ?) ?

Merci d'avance !
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 25 mars 2024 à 11:16:14
Salut,

Actuellement, j'ai en front un CCR2116 et un CRS310.
le CRS310 héberge l'ONU FS (GPON) et fait la COS6 avec des switch rules, et le CCR2116 tient les dhcp-clients.

Mais avant j'avais systemd-networkd avec cette config qui devrait fonctionner out-of-the-box.
Sans oublier de spécifier les bonnes strings d'authentification bien sûr...

- /etc/systemd/network/wan1.network :
[Match]
Name=wan1
[Network]
ConfigureWithoutCarrier=true
Address=192.168.X.254/24
Description=WAN1 Orange1
VLAN=orange1
IPv6AcceptRA=no
[DHCP]
UseDNS=false

- /etc/systemd/network/orange1.netdev :
[NetDev]
Name=orange1
Kind=vlan
MACAddress=<livebox_macaddr>
[VLAN]
Id=832
EgressQOSMaps=6-6 # systemd v253 only

- /etc/systemd/network/orange1.network :
[Match]
Name=orange1

[Network]
Description=Orange1
LinkLocalAddressing=ipv6
DHCP=yes
IPForward=yes
IPv6AcceptRA=yes
DHCPPrefixDelegation=yes
#Address=<orange1_ipext>
Address=<orange1_ip6prefix_2>::254/64

[DHCPv4]
ClientIdentifier=mac
VendorClassIdentifier=sagem
UserClass=FSVDSL_livebox.Internet.softathome.Livebox6
SendOption=90:string:<authentication_string>
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
#UseAddress=no
RouteMetric=0
IPServiceType=CS6 # already default
SocketPriority=6 # systemd v253 only

[DHCPv6]
# prefer DUIDType=link-layer (mac_addr of interface MUST be equal to livebox_macaddr>) ; try DUIDRawData=00:03:00:01:<livebox_macaddr> (should work) or DUIDRawData=00:03:00::<livebox_macaddr> (should not work) ; reset ONT could be required
#DUIDRawData=00:03:00:01:<livebox_macaddr>
DUIDType=link-layer
# UserClass and SendOption=15:string: are equivalent
UserClass=FSVDSL_livebox.Internet.softathome.Livebox6
#UserClass=\x00\x2b\x46\x53\x56\x44\x53\x4c\x5f\x6c\x69\x76\x65\x62\x6f\x78\x2e\x49\x6e\x74\x65\x72\x6e\x65\x74\x2e\x73\x6f\x66\x74\x61\x74\x68\x6f\x6d\x65\x2e\x4c\x69\x76\x65\x62\x6f\x78\x36
#SendOption=15:string:\x00\x2b\x46\x53\x56\x44\x53\x4c\x5f\x6c\x69\x76\x65\x62\x6f\x78\x2e\x49\x6e\x74\x65\x72\x6e\x65\x74\x2e\x73\x6f\x66\x74\x61\x74\x68\x6f\x6d\x65\x2e\x4c\x69\x76\x65\x62\x6f\x78\x36
SendOption=11:string:<authentication_string>
SendOption=16:string:\x00\x00\x04\x0e\x00\x05\x73\x61\x67\x65\x6d
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
UseAddress=no
RouteMetric=1024
WithoutRA=solicit
RapidCommit=no

[IPv6AcceptRA]
DHCPv6Client=always
UseDNS=no
UseDomains=no

[DHCPPrefixDelegation]
SubnetId=0x2
UplinkInterface=:self
Announce=no
#Assign=no

- /etc/system/systemd-networkd.service.d/10-debug.conf :
[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

Pour la COS6, j'avais un script tc (trafic control), c'est plus élégant que des règles nftables (je trouve) :

#!/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)
# for information - no dscp
#tc filter add dev $iface parent 1: prio 3 protocol ipv6 u32 match ip6 protocol 17 0xff match ip6 sport 546 0xffff match ip6 dport 547 0xffff action skbedit priority $tc_cos # dhcpv6
#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 $tc_cos # icmpv6 dst (fe00::/7 = fe80::/10 + ff02::/16)


Il ne reste plus qu'a jouer avec networkctl...
tu auras peut-être un pb d'IPv6 à cause du DUID qui va changer, il te faudra forcer un/des releases successifs.


L'intégralité de mon post est ici : https://medium.com/@cyayon/use-your-own-router-with-orange-isp-8eac32895983




Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: gwongafa le 07 septembre 2024 à 21:22:03
Salut,

Actuellement, j'ai en front un CCR2116 et un CRS310.
le CRS310 héberge l'ONU FS (GPON) et fait la COS6 avec des switch rules, et le CCR2116 tient les dhcp-clients.

Mais avant j'avais systemd-networkd avec cette config qui devrait fonctionner out-of-the-box.
Sans oublier de spécifier les bonnes strings d'authentification bien sûr...
[..].

Il ne reste plus qu'a jouer avec networkctl...
tu auras peut-être un pb d'IPv6 à cause du DUID qui va changer, il te faudra forcer un/des releases successifs.


L'intégralité de mon post est ici : https://medium.com/@cyayon/use-your-own-router-with-orange-isp-8eac32895983

Bonjour,

Je déterre le sujet...
J' avais une configuration fonctionnelle sous Debian et je me suis dit que ca serait pas mal de tout configurer avec systemd-networkd. Et la, c'est le drame !

J'ai (presque) tout essayé au niveau des chaînes a transmettre, le CoS est bien en place, avec nftables, pas tc... mais rien n' y fait, je me retrouve parké en IPv4 alors que j' obtiens bien mon prefix /56 en IPv6.

@cyayon, est-ce que la conf partagée est bien fonctionnelle pour l'IPv4 ?
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: Mastah le 08 septembre 2024 à 04:37:26
Si le souci vient de la COS6 alors la solution est ici : https://lafibre.info/remplacer-livebox/filtrer-les-raw-socket-avec-nftables/msg1079566/#msg1079566

Pour info il est encore probablement trop tôt pour faire full systemd/networkd. La plus part des distrib n'ont pas la bonne version de systemd.
De mon coté je reste en ifup/ifdown tant que systemd n'a pas été grandement amélioré (j'ai bien moins de config en ifup/down qu'en networkd, donc aucun intérêt pour le moment).
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: gwongafa le 10 septembre 2024 à 19:01:49
A priori, c'était réellement à cause d'un problème de syntaxe des options dans le fichier de configuration .network.

Voici au final ce que j'ai mis pour que ça fonctionne. Je suis parti de vos tuto, Mastah et Cyayon : un grand merci ! et j'ai fait quelques modifications. Il reste certainement des choses inutiles venant des tests...


J'ai 2 interfaces physiques renommée avec des fichiers .link en lan et ont :

/etc/systemd/network/10-lan.link :
[Match]
MACAddress=<macaddress_lan>

[Link]
Name=lan

/etc/systemd/network/10-ont.link
[Match]
MACAddress=<macaddress_ont_port>

[Link]
Name=ont

Le réseau est configuré sur l'interface pour accéder à l'ONT, sans autre configuration :
/etc/systemd/network/20-ont.network
[Match]
Name=ont

[Network]
ConfigureWithoutCarrier=true
Address=192.168.1.254/24
Description=ONT access port
LinkLocalAddressing=no
LLDP=no
EmitLLDP=no
IPv6AcceptRA=no
IPv6SendRA=no
VLAN=vlan832

Et le lan :
/etc/systemd/network/30-lan.network
[Match]
Name=lan

[Network]
Address=192.168.1.1/24
Description=Home LAN
IPv6SendRA=yes
DHCPv6PrefixDelegation=yes

[IPv6SendRA]
EmitDNS=no

[DHCPv6PrefixDelegation]
# assign first prefix from pool
SubnetId=0x1

Il y a donc l'interface vlan832 nécessaire pour la connexion :
/etc/systemd/network/00-vlan832.netdev
[NetDev]
Name=vlan832
Kind=vlan
MACAddress=<macaddress_livebox>

[VLAN]
Id=832
EgressQOSMaps=6-6

La configuration de l'interface vlan832 et faite automatiquement en utilisant un fichier template et un script générant les chaines d'authentification. Les paramètres pour le COS6 pour le DHCP IPv4 fonctionnent:
/etc/systemd/scripts/vlan832.template
[Match]
Name=vlan832

[Network]
Description=WAN Orange
LinkLocalAddressing=ipv6
DHCP=yes
IPv6AcceptRA=yes
DHCPPrefixDelegation=yes

[DHCPv4]
ClientIdentifier=mac
$VCI_4
$UC_4
$AUTHv4
UseDNS=no
UseDomains=no
RouteMetric=0
RapidCommit=no
SendHostname=no
RequestOptions=1 3 6 28 51 58 59 90 120 125
IPServiceType=CS6
SocketPriority=6

[DHCPv6]
DUIDType=link-layer
$AUTHv6
$UC_4
$VCI_6
UseHostname=no
UseDNS=no
UseDomains=no
UseNTP=no
UseAddress=no
SendHostname=no
RouteMetric=1024
WithoutRA=solicit
RapidCommit=no
PrefixDelegationHint=::/56

[IPv6AcceptRA]
DHCPv6Client=always
UseDNS=no
UseDomains=no

[DHCPPrefixDelegation]
SubnetId=0x0
UplinkInterface=:self
Announce=no

J'ai repris les exemples de script en bash :
/etc/systemd/scripts/orange_auth.sh
#!/bin/bash

login='fti/xxxxxxxxx'
pass='xxxxxx'
lb_ver=6
lb_hw='sagem'

tohex() {
      for h in $(echo $1 | sed "s/\(.\)/\1 /g"); do printf %02x \'$h; done
}

addsep() {
      echo $(echo $1 | sed "s/\(.\)\(.\)/:\1\2/g")
}

r=$(dd if=/dev/urandom bs=1k count=1 2>&1 | md5sum | cut -c1-16)
id=${r:0:1}
h=3C12$(tohex ${r})0313$(tohex ${id})$(echo -n ${id}${pass}${r} | md5sum | cut -c1-32)
str=$(addsep $(tohex ${login})${h})

# generate auth string
str2=`echo "00:00:00:00:00:00:00:00:00:00:00:1A:09:00:00:05:58:01:03:41:01:0D${str}" | sed 's/^/\\\x/ ; s/:/\\\x/g'`
export AUTHv4=`echo "SendOption=90:string:${str2}"`
export AUTHv6=`echo "SendOption=11:string:${str2}"`

# generate UserClass
uc4=`echo "FSVDSL_livebox.Internet.softathome.Livebox${lb_ver}"`
export UC_4=`echo "UserClass=\"$uc4\""`
uc6=00$(addsep $(tohex "FSVDSL_livebox.Internet.softathome.Livebox${lb_hw}"))
uc6_h=`echo ${uc6} | sed 's/^/\\\x/ ; s/:/\\\x/g'`
export UC_6=`echo "UserClass=$uc6_h"`

# generate VendorClassIdentifier
export VCI_4=`echo "VendorClassIdentifier=${lb_hw}"`
vci6=00:00:04:0e:00:05$(addsep $(tohex ${lb_hw}))
vci6_h=`echo ${vci6} | sed 's/^/\\\x/ ; s/:/\\\x/g'`
export VCI_6=`echo "SendOption=16:string:${vci6_h}"`

# Generate .network file
envsubst < /etc/systemd/scripts/vlan382.template > /etc/systemd/network/30-vlan832.network

Je l’exécute avant le démarrage de networkd avec un service unit systemd :
/etc/systemd/system/update-orange-auth.service
[Unit]
Description=Update Orange authentication strings in .network files
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/etc/systemd/scripts/orange_auth.sh
RemainAfterExit=true
TimeoutSec=5

[Install]
WantedBy=systemd-networkd.service

Activer le service :
systemctl enable update-orange-auth.service
Il faut ensuite gérer le COS/DSCP pour le DHCP IPv6. Cela se fait avec un script et un autre service unit systemd.
/usr/lib/systemd/system/scripts/netdev-egress
#!/bin/sh
# apply netdev/egress priority for orange dhcp client ipv6 requests

SleepRetry=3

# set orange interface
if [ -z "$1" ] ; then
        iface="vlan832"
else
        iface="$1"
fi

echo "executing nft chain netdev filter egress device $iface"

ip link show dev $iface
if [ $? -ne 0 ] ; then
        echo "ERROR : interface $iface not exist, retrying in ${SleepRetry}s..."
        sleep $SleepRetry
        ip link show dev $iface ; [ $? -ne 0 ] && echo "ERROR : interface $iface definitely not exist !" && exit 9
fi

echo "executing nft chain netdev filter egress device $iface"

echo ; echo "existing table netdev filter"
nft list table netdev filter

echo ; echo "applying nft chain netdev filter egress $iface"
nft add "table netdev filter"
nft add "chain netdev filter egress { type filter hook egress devices = ${iface} priority 0; }"
nft insert "rule netdev filter egress udp dport 547 meta priority set 0:6 ip6 dscp set cs6 counter comment \"egress_prio_${iface}_DHCP6\""
nft insert "rule netdev filter egress icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } meta priority set 0:6 ip6 dscp set cs6 counter comment \"egress_prio_${iface}_ICMP6\""

echo ; echo "final nft table netdev filter"
nft list table netdev filter

echo ; echo "networkctl status $iface"
networkctl -s status $iface

Comme il doit être lancé avant toute requête DHCP, il faut un service unit systemd qui doit être exécuté à la création de l'interface vlan832 :
/etc/systemd/system/netdev-egress@.service
[Unit]
Description=netdev-egress pre-requisite for %i
BindTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/system/scripts/netdev-egress %i
RemainAfterExit=true
TimeoutSec=10

[Install]
WantedBy=sys-subsystem-net-devices-%i.device

Il faut ensuite activer ce "service" pour l'interface vlan832 :
systemctl enable netdev-egress@vlan832
Au final, au reboot, tout devrait fonctionner :
journalctl -xeu netdev-egress@vlan832
[...]
systemd-networkd[1071]: vlan832: Gained IPv6LL
[...]
systemd-networkd[1071]: vlan832: DHCP: received delegated prefix xxxx::/56
[...]
systemd-networkd[1071]: vlan832: DHCPv4 address xxxx/24, gateway xxxx.1 acquired from 80.10.5.225

Je vais vérifier le bon fonctionnement sur les prochains jours et n'hésitez pas à faire des retours si vous testez cette configuration.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: Mastah le 10 septembre 2024 à 20:09:49
Je pense que la plus part de tes /etc/systemd/scripts/**** on un path incorrect.
Pourrais-tu corriger ? Ca me servira probablement d'ici quelque mois/année lorsque systemd 253 sera dispo sur Debian.

Je suppose aussi que tu as une version de systemd sup à 253 ?

Pour le script de génération des fichiers, via template, je te conseil ça : lien (https://akhamar.github.io/orange-bypass-debian/30_interfaces/33_configuration_wan.html#dhcp-orange-option-generator)
Ca évite d'utiliser python/perl. C'est plus direct et lisible. Mais bon c'est pas particulièrement obligatoire.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: gwongafa le 10 septembre 2024 à 21:07:02
Merci pour les remarques!

J'ai corrigé les chemins.
J'ai laissé celui-ci : "/usr/lib/systemd/system/scripts/" parce que j'avais des problèmes de permission lors de l’exécution depuis "/etc/systemd/scripts/".

J'ai testé avec une Fedora 40 qui a systemd 255.

Pour ton script, j'ai essayé mais j'ai eu des soucis pour la chaine d'auth IPv6 qui nécessite des "\x" à la place des ":" et le envsubst... Ne pas utiliser de python/perl serait l'idéal effectivement mais j'ai fait au plus rapide pour valider le fonctionnement.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: Mastah le 11 septembre 2024 à 00:48:53
Top merci !
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: gwongafa le 11 septembre 2024 à 12:39:08
J'ai essayé la modification du script shell. Ça n'est pas forcément beau mais ça a l'air de fonctionner comme ça.
J'ai mis à jour le post.
J'ai du supprimer le fichier 30-vlan832.network pour qu'il puisse le générer sans problème de permissions.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: Mastah le 11 septembre 2024 à 21:50:16
Je regarderais mais je pense qu'il doit y avoir moyen d'avoir des fichiers *.network avec des variables dynamiques.
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 13 septembre 2024 à 09:34:31
Salut,

Merci pour ce tuto.

par contre, je ne suis pas certain que /etc/systemd/system/netdev-egress@.service s'exécute au bon moment .
L'interface doit exister mais pas configurée.

As-tu testé au boot ?
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: gwongafa le 13 septembre 2024 à 10:13:16
Salut Cyayon,

J'ai testé après plusieurs reboot, le service s'exécute à priori au bon moment :

Sep 11 11:41:40   systemd-networkd[1228]: vlan832: Link UP
Sep 11 11:41:40   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
[...]
Sep 11 11:41:40   systemd[1]: Starting netdev-egress@vlan832.service - netdev-egress pre-requisite for vlan832...
Sep 11 11:41:40   netdev-egress[1245]: executing nft chain netdev filter egress device vlan832
Sep 11 11:41:40   netdev-egress[1246]: 10: vlan832@ont: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qle>
Sep 11 11:41:40   netdev-egress[1246]:     link/ether xxxxxxxxxxxxxx brd ff:ff:ff:ff:ff:ff
[...]
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=signal sender=org.freedesktop.DBus.Local destination=n/a path=/org/freedesktop/DBus/Local interface=org.fre>
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=signal sender=org.freedesktop.DBus destination=:1.7 path=/org/freedesktop/DBus interface=org.freedesktop.DB>
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=signal sender=org.freedesktop.DBus destination=:1.7 path=/org/freedesktop/DBus interface=org.freedesktop.DB>
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.7 path=n/a interface=n/a member=n/a  cookie=429496>
Sep 11 11:41:40   systemd-networkd[1228]: Successfully acquired requested service name.
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.7 path=n/a interface=n/a member=n/a  cookie=429496>
Sep 11 11:41:40   systemd-networkd[1228]: Match type='signal',sender='org.freedesktop.login1',path='/org/freedesktop/login1',interface='org.freedesktop.login1.Manager>
Sep 11 11:41:40   netdev-egress[1247]: Error: No such file or directory
Sep 11 11:41:40   netdev-egress[1247]: list table netdev filter
Sep 11 11:41:40   netdev-egress[1247]:                   ^^^^^^
Sep 11 11:41:40   netdev-egress[1245]: applying netdev filter
Sep 11 11:41:40   audit[1248]: NETFILTER_CFG table=filter:2 family=5 entries=8 op=nft_register_chain pid=1248 subj=system_u:system_r:unconfined_service_t:s0 comm="nft"
Sep 11 11:41:40   netdev-egress[1245]: final nft table netdev filter
Sep 11 11:41:40   netdev-egress[1249]: table netdev filter {
Sep 11 11:41:40   netdev-egress[1249]:         chain egress {
Sep 11 11:41:40   netdev-egress[1249]:                 type filter hook egress device "vlan832" priority filter; policy accept;
Sep 11 11:41:40   netdev-egress[1249]:                 udp dport 547 meta priority set 0:6 ip6 dscp set cs6 comment "Set CoS value to 6 for DHCPv6 packets"
Sep 11 11:41:40   netdev-egress[1249]:                 icmpv6 type { nd-router-solicit, nd-neighbor-solicit, nd-neighbor-advert } meta priority set 0:6 ip6 dscp set c>
Sep 11 11:41:40   netdev-egress[1249]:         }
Sep 11 11:41:40   netdev-egress[1249]: }
Sep 11 11:41:40   netdev-egress[1245]: networkctl status vlan832
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=method_call sender=:1.8 destination=org.freedesktop.network1 path=/org/freedesktop/network1 interface=org.f>
Sep 11 11:41:40   systemd-networkd[1228]: Sent message type=method_return sender=n/a destination=:1.8 path=n/a interface=n/a member=n/a cookie=58 reply_cookie=2 signa>
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=method_call sender=:1.8 destination=org.freedesktop.network1 path=/org/freedesktop/network1/link/_310 inter>
Sep 11 11:41:40   systemd-networkd[1228]: Sent message type=method_return sender=n/a destination=:1.8 path=n/a interface=n/a member=n/a cookie=59 reply_cookie=3 signa>
Sep 11 11:41:40   systemd-networkd[1228]: Got message type=method_call sender=:1.8 destination=org.freedesktop.network1 path=/org/freedesktop/network1/link/_310 inter>
Sep 11 11:41:40   systemd-networkd[1228]: Sent message type=error sender=n/a destination=:1.8 path=n/a interface=n/a member=n/a cookie=60 reply_cookie=4 signature=s e>
Sep 11 11:41:40   netdev-egress[1250]: ● 10: vlan832
Sep 11 11:41:40   netdev-egress[1250]:                    Link File: /usr/lib/systemd/network/99-default.link
Sep 11 11:41:40   netdev-egress[1250]:                 Network File: /etc/systemd/network/30-vlan832.network
Sep 11 11:41:40   netdev-egress[1250]:                        State: no-carrier (configuring)
Sep 11 11:41:40   netdev-egress[1250]:                 Online state: offline
Sep 11 11:41:40   netdev-egress[1250]:                         Type: vlan
Sep 11 11:41:40   netdev-egress[1250]:                         Kind: vlan
Sep 11 11:41:40   netdev-egress[1250]:                       Driver: 802.1Q VLAN Support
Sep 11 11:41:40   netdev-egress[1250]:             Hardware Address: xxxxxxxxxxxxxxxxx (Sagemcom Broadband SAS)
Sep 11 11:41:40   netdev-egress[1250]:                          MTU: 1500 (max: 65535)
Sep 11 11:41:40   netdev-egress[1250]:                        QDisc: noqueue
Sep 11 11:41:40   netdev-egress[1250]: IPv6 Address Generation Mode: eui64
Sep 11 11:41:40   netdev-egress[1250]:                      VLan Id: 832
Sep 11 11:41:40   netdev-egress[1250]:     Number of Queues (Tx/Rx): 1/1
Sep 11 11:41:40   netdev-egress[1250]:             Auto negotiation: no
Sep 11 11:41:40   netdev-egress[1250]:                         Port: fibre
Sep 11 11:41:40   netdev-egress[1250]:            Activation Policy: up
Sep 11 11:41:40   netdev-egress[1250]:          Required For Online: yes
Sep 11 11:41:41   avahi-daemon[884]: Joining mDNS multicast group on interface lan.IPv6 with address  fe80::yyyyyyyyyy.
Sep 11 11:41:41   avahi-daemon[884]: New relevant interface lan.IPv6 for mDNS.
Sep 11 11:41:41   systemd-networkd[1228]: lan: Received new foreign address (configured):  fe80::yyyyyyyyyy/64 (valid forever, preferred forever), flags: perm>
Sep 11 11:41:41   avahi-daemon[884]: Registering new address record for  fe80::yyyyyyyyyy on lan.*.
Sep 11 11:41:41   systemd-networkd[1228]: lan: Gained IPv6LL
Sep 11 11:41:41   systemd-networkd[1228]: lan: Discovering IPv6 routers
Sep 11 11:41:41   systemd-networkd[1228]: lan: NDISC: Started IPv6 Router Solicitation client
Sep 11 11:41:41   systemd-networkd[1228]: lan: State changed: configuring -> configured
Sep 11 11:41:41   systemd-networkd[1228]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.P>
Sep 11 11:41:41   systemd-networkd[1228]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.P>
Sep 11 11:41:41   systemd-networkd[1228]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1 interface=org.freedesktop.DBus.Properties>
Sep 11 11:41:41   systemd-networkd[1228]: lan: Starting IPv6 Router Advertisements
Sep 11 11:41:41   systemd-networkd[1228]: lan: RADV: Started IPv6 Router Advertisement daemon
Sep 11 11:41:41   systemd-networkd[1228]: lan: IPv6 Router Advertisement engine is configured and started.
Sep 11 11:41:41   systemd-networkd[1228]: lan: Received new foreign route (configured): dst:  fe80::yyyyyyyyyy/128, src: n/a, gw: n/a, prefsrc: n/a, scope: gl>
Sep 11 11:41:41   systemd-networkd[1228]: lan: RADV: Next Router Advertisement in 6s
Sep 11 11:41:41   systemd-networkd[1228]: lan: Received new foreign route (configured): dst: fe80::/128, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: local(>
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: link_check_ready(): link is not activated.
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: link_check_ready(): link is not activated.
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: link_check_ready(): link is not activated.
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: link_check_ready(): link is not activated.
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: link_check_ready(): link is not activated.
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: Bringing link up
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: found matching network '/etc/systemd/network/30-vlan832.network'.
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: Flags change: +UP
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: Link UP
Sep 11 11:41:41   netdev-egress[1250]: Sep 11 11:41:40   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:41   systemd[1]: Finished netdev-egress@vlan832.service - netdev-egress pre-requisite for vlan832.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: Received new foreign route (configured): dst: ff00::/8, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: loca>
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: Received new foreign route (configured): dst: fe80::/64, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: mai>
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: Flags change: +LOWER_UP +RUNNING
Sep 11 11:41:44   systemd-networkd[1228]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_310 interface=org.freedesktop.DBus.>
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: Gained carrier
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: found matching network '/etc/systemd/network/30-vlan832.network'.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: LLDP Rx: Started LLDP client
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: link_check_ready(): IPv6LL is not configured yet.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: DHCPv4 client: STARTED on ifindex 10
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: DHCPv4 client is configured, acquiring DHCPv4 lease.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: IPv6 link-local address is not set, delaying to start DHCPv6 client.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: DHCPv6 client is configured.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: IPv6 Router Discovery is configured.
Sep 11 11:41:44   systemd-networkd[1228]: ont: Received updated static address (configured): 192.168.1.254/24 broadcast 192.168.1.255 (valid forever, preferred foreve>
Sep 11 11:41:44   systemd-networkd[1228]: ont: link_check_ready(): static addresses are not configured.
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: DHCPv4 client: DISCOVER
Sep 11 11:41:44   systemd-networkd[1228]: vlan832: DHCPv4 client: State changed: initialization -> selecting
Sep 11 11:41:44   systemd-networkd[1228]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_310 interface=org.freedesktop.DBus.>
Sep 11 11:41:44   systemd-networkd[1228]: ont: Addresses set
Sep 11 11:41:44   systemd-networkd[1228]: ont: State changed: configuring -> configured

L'interface vlan832 est créée et c'est appliqué avant le "Link UP" et les client DHCP sont lancé par la suite.

Est-ce que tu pensais à une autre configuration ?
Titre: Remplacer la livebox par systemd-networkd / nftables
Posté par: cyayon le 13 septembre 2024 à 10:14:29
Ok, super, j'avais juste un doute...
Merci pour ta confirmation.