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