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

0 Membres et 1 Invité sur ce sujet

cyayon

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

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 477
  • XGS-PON et G-PON
Remplacer la livebox par systemd-networkd / nftables
« Réponse #25 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 !

cyayon

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





gwongafa

  • Abonné Orange Fibre
  • *
  • Messages: 33
  • Orgeval (78)
Remplacer la livebox par systemd-networkd / nftables
« Réponse #27 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 ?

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 477
  • XGS-PON et G-PON
Remplacer la livebox par systemd-networkd / nftables
« Réponse #28 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).

gwongafa

  • Abonné Orange Fibre
  • *
  • Messages: 33
  • Orgeval (78)
Remplacer la livebox par systemd-networkd / nftables
« Réponse #29 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.
« Modifié: 11 septembre 2024 à 12:36:13 par gwongafa »

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 477
  • XGS-PON et G-PON
Remplacer la livebox par systemd-networkd / nftables
« Réponse #30 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
Ca évite d'utiliser python/perl. C'est plus direct et lisible. Mais bon c'est pas particulièrement obligatoire.

gwongafa

  • Abonné Orange Fibre
  • *
  • Messages: 33
  • Orgeval (78)
Remplacer la livebox par systemd-networkd / nftables
« Réponse #31 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.

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 477
  • XGS-PON et G-PON
Remplacer la livebox par systemd-networkd / nftables
« Réponse #32 le: 11 septembre 2024 à 00:48:53 »
Top merci !

gwongafa

  • Abonné Orange Fibre
  • *
  • Messages: 33
  • Orgeval (78)
Remplacer la livebox par systemd-networkd / nftables
« Réponse #33 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.

Mastah

  • Abonné Orange Fibre
  • *
  • Messages: 477
  • XGS-PON et G-PON
Remplacer la livebox par systemd-networkd / nftables
« Réponse #34 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.

cyayon

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