Auteur Sujet: Remplacer la livebox par systemd-networkd / nftables  (Lu 4827 fois)

0 Membres et 1 Invité sur ce sujet

toniob

  • Abonné Orange vdsl
  • *
  • Messages: 18
  • Pont-l'Évêque (14)
    • 6clones
Remplacer la livebox par systemd-networkd / nftables
« 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
}
}
« Modifié: 28 novembre 2023 à 10:13:39 par toniob »

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 648
  • Cordon 74 - Orange Fibre Pro
Remplacer la livebox par systemd-networkd / nftables
« Réponse #1 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.

toniob

  • Abonné Orange vdsl
  • *
  • Messages: 18
  • Pont-l'Évêque (14)
    • 6clones
Remplacer la livebox par systemd-networkd / nftables
« Réponse #2 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).

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 648
  • Cordon 74 - Orange Fibre Pro
Remplacer la livebox par systemd-networkd / nftables
« Réponse #3 le: 04 juillet 2022 à 17:12:58 »
Ok merci bcp.

sinon systemd-networkd se comporte bien à la longue ?
le renew dhcp fonctionne correctement ?

toniob

  • Abonné Orange vdsl
  • *
  • Messages: 18
  • Pont-l'Évêque (14)
    • 6clones
Remplacer la livebox par systemd-networkd / nftables
« Réponse #4 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.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 648
  • Cordon 74 - Orange Fibre Pro
Remplacer la livebox par systemd-networkd / nftables
« Réponse #5 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 ?

toniob

  • Abonné Orange vdsl
  • *
  • Messages: 18
  • Pont-l'Évêque (14)
    • 6clones
Remplacer la livebox par systemd-networkd / nftables
« Réponse #6 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.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 091
  • Paris (75)
Remplacer la livebox par systemd-networkd / nftables
« Réponse #7 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.

toniob

  • Abonné Orange vdsl
  • *
  • Messages: 18
  • Pont-l'Évêque (14)
    • 6clones
Remplacer la livebox par systemd-networkd / nftables
« Réponse #8 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.

cyayon

  • Abonné Orange Fibre
  • *
  • Messages: 648
  • Cordon 74 - Orange Fibre Pro
Remplacer la livebox par systemd-networkd / nftables
« Réponse #9 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 ?



kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 091
  • Paris (75)
Remplacer la livebox par systemd-networkd / nftables
« Réponse #10 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, par défaut c'est :auto donc ca fonctionnera).

toniob

  • Abonné Orange vdsl
  • *
  • Messages: 18
  • Pont-l'Évêque (14)
    • 6clones
Remplacer la livebox par systemd-networkd / nftables
« Réponse #11 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.