Auteur Sujet: Supprimer une Mini-4K avec boitier ONTv2 en ZMD - Problème d'authentification ?  (Lu 4560 fois)

0 Membres et 1 Invité sur ce sujet

Mikrotik

  • Abonné Free fibre
  • *
  • Messages: 43
  • TROYES (10)
Il y a aussi d'autres types d'adresses en IPv6 :

Indéterminée -> ::/128
Toutes les adresses -> ::/0
Loopback -> ::1/128
Multicast -> FF00::/8 (avec 4 bits qui servent à indiquer la portée)
Anycast -> même préfixes que les adresses globales

Et quelques plages réservées à des usages spécifiques.

hsd

  • Abonné Free fibre
  • *
  • Messages: 38
  • PARIS 75
voici un script qui permet de se considérer en full dynamique pour la partie IPv6.
Il faut configurer le client DHCP v6 avec Prefix et Adress cochés et placer le script ci-dessous dans dans l'onglet Advanced.

# modifiez les deux variables suivantes avec le nom des interfaces que vous avez donné
:local interface "vlan836-free"
:local ipipv6 "ipipv6-free"
:local prefix [/ipv6 dhcp-client get [find interface=$interface] value-name=prefix]
:set prefix ([:pick $prefix 0 ([:find $prefix ","]-3)])
:local gw [/ipv6 dhcp-client get [find interface=$interface] value-name=address]
:set gw ([:pick $gw 0 ([:find $gw ","])])
:local addresse0ffff (([:pick $prefix 0 ( [ :len $prefix ] -1 )]) . "0:ffff:ffff:0")
#supprime toutes les adresses fixées précédemment.
/ipv6 address remove [find where address~"2a01"]
delay 3s
#supprime l'IP moche
/ipv6 address remove [find address="$gw/128"]
#ajoute l'ip necessaire au routage du tunnel ipipv6
/ipv6 address add address="$addresse0ffff/128" interface="$interface" advertise=no
#set l'ip sur l'interface ipipv6
/interface ipipv6 set $ipipv6 local-address=$addresse0ffff
#ajoute la première IP du premier préfixe
/ipv6 address add address="$prefix/128" interface="$interface" advertise=no

Maintenant, j'aimerais bien passer en dynamique sur la partie IPv4.

Mikrotik

  • Abonné Free fibre
  • *
  • Messages: 43
  • TROYES (10)
Citer
Maintenant, j'aimerais bien passer en dynamique sur la partie IPv4.

Pour l'adresse IPv4 partagée :

Le préfixe IPv4 se trouve dans la réponse DHCPv6, dans l'option S46 MAP-E Container. Il est peut être possible de récupérer le contenu de cette option dans RouterOS, pour le traiter dans un script. C'est la variable "options" qui contient un tableau des options reçues. Pour demander cette option, utiliser le code option 6 dans le client DHCPv6 avec une chaine hexa pour demander l'option 94.

La chaîne hexa :

0x005e
J'ai vérifié les données reçues dans la variable $options, elles sont utilisables, mais elles sont en hexa brute. Il faudrait créer un script pour parser et mettre en forme.

Le préfixe Ipv4 reçu dans l'option S46 est un /11. Pour obtenir l'IPv4 partagée, il suffit (!) de concaténer ces 11 bits du préfixe IPv4 avec les bits 38 à 58 du préfixe IPv6 en /60 (soit 21 bits) délivré dans la réponse DHCPv6, puis de convertir ces 32 bits en adresse IPv4 décimale.

On déduit qu'il s'agit des bits 38 à 58 parce que l'option S46 reçue indique un préfixe IPv6 en /37. Ce sont donc les (32 - 11 =) 21 bits suivants qui permettent de forger l'IPv4 du client, les 11 premiers bits de l'IPv4 étant fournis par le préfixe /11.

Après vérification cela fonctionne et cela correspond bien à ce qui est expliqué dans la RFC7597.

Pour obtenir l'adresse IPv6 source du tunnel il suffit (!) de concaténer les 64 bits du préfixe IPv6 /60, suivis de 16 bits à zéro, puis les 32 bits de l'adresse IPv4 partagée, puis les 2 bits du PSID (bits 59 et 60 du préfixe IPv6 /60).

Le PSID, donc de 0 à 3 puisque sur deux bits dans cette configuration de mapping, indique la plage de ports allouée :

PSID = 00 -> ports 0 à 16383
PSID = 01 -> ports 16384 à 32767
PSID = 10 -> ports 32768 à 49151
PSID = 11 -> ports 49152 à 65535


L'adresse destination du tunnel (BR, border router) se trouve également dans la réponse DHCPv6 lorsqu'on demande l'option S46 MAP-E container.

Sinon je n'ai toujours pas d'explication à la présence d'un préfixe IPV6 en /80 présenté par NDP ainsi que l'adresse IPv6 incluse dans ce préfixe, obtenue en DHCPv6. Sert-elle pour la configuration de la Freebox (accès distant Freebox OS) ?

Pour l'adresse IPv4 fullstack, comment l'obtenir en dynamique ? J'avais réalisé une capture entre l'ONT et la freebox, mais en mode bridge. Il faudrait peut être faire une capture en mode routeur pour voir ce qu'il se passe au niveau de l'attribution de cette adresse IPv4.

Des infos sur le sujet, pour MAP-T, qui est proche de MAP-E :

https://github.com/openwrt/openwrt/blob/openwrt-22.03/package/network/ipv6/map/src/mapcalc.c
https://nicmx.github.io/Jool/en/map-t.html
https://github.com/ejordangottlieb/pyswmap

Ici également :

https://www.juniper.net/documentation/us/en/software/junos/interfaces-next-gen-services/topics/topic-map/usf-map-tm.html
https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/asr9k-r7-9/configuration/guide/b-cgnat-cg-asr9k-79x/cgipv6-without-service-modules.html#id_114607

Rien de plus simple le MAP-E  ! :)

Ci-dessous la règle de mapping chez Free pour le MAP-E en IPv4 partagée (adresse IPv6 non réelle) :
« Modifié: 10 mars 2024 à 22:42:46 par Mikrotik »

hsd

  • Abonné Free fibre
  • *
  • Messages: 38
  • PARIS 75
Vivement la mort d'IPv4. Cette cohabitation ne simplifie pas les choses. Mais bon, on en a pour un paquet d'années encore.

Je suis en full stack, je viens de le dire, je n'aime pas la cohabitation.  :)
Mais comment fais-tu pour chopper les trames entre la freebox et l'ONU?

Dough29

  • Abonné Free fibre
  • *
  • Messages: 57
  • Cordemais 44
    • Tavarn.bzh
Quand tu vois certains acteurs relativement gros qui ne sont encore accessibles qu'en IPv4 on n'est pas prêts...

Mikrotik

  • Abonné Free fibre
  • *
  • Messages: 43
  • TROYES (10)
Vivement la mort d'IPv4. Cette cohabitation ne simplifie pas les choses. Mais bon, on en a pour un paquet d'années encore.

Je suis en full stack, je viens de le dire, je n'aime pas la cohabitation.  :)
Mais comment fais-tu pour chopper les trames entre la freebox et l'ONU?

Il faut un routeur ou un switch avec deux ports SFP, et deux câbles DAC, tout simplement, puis renvoyer les paquets vers un Wireshark, en mirroring, ou plus simple avec le streaming du packet sniffer Mikrotik, puis filtrage de capture sur UDP 37008 dans Wireshark. On peut aussi utiliser deux switchs ou deux routeurs avec un seul port SFP, et faire un lien cuivre RJ45 entre les deux. Évidemment il ne faut pas filtrer, tout doit pouvoir passer dans le bridge y compris les VLANs. C'est cette dernière solution que j'ai utilisée pour éviter d'acheter un switch ou routeur multi SFP. Attention à la compatibilité SFP, j'ai essayé avec des switchs d'il y a une dizaine d'années, cela ne fonctionne pas. Il faut du matériel récent.

Sinon, il peut être intéressant d'avoir les deux IPv4 pour des expérimentations.

Pour la mort d'IPv4 ce n'est pas encore pour aujourd'hui. Regardez par exemple les sites de certaines des plus grosses sociétés françaises ou institutions qui sont toujours en IPv4 seul.

Exemples :

https://www.edf.fr/
https://particuliers.engie.fr/
https://www.laposte.fr/
https://www.francetravail.fr
https://www.gouvernement.fr/
https://www.service-public.fr/
 ;)

Pour vérifier cela d'un seul coup d'oeil, un plugin sympa sous Firefox : SixOrNot

Voir ici le baromètre  :) de l'ARCEP (Autorité (??) de régulation des communications électroniques, des postes et de la distribution de la presse) :

https://www.arcep.fr/fileadmin/cru-1677573101/reprise/observatoire/ipv6/202303_arcep_barometre_ipv6_2-02_synthese.svg


« Modifié: 10 mars 2024 à 11:10:46 par Mikrotik »

Mikrotik

  • Abonné Free fibre
  • *
  • Messages: 43
  • TROYES (10)
Pour résumer, pour l'adresse IPv4 partagée, voici le mécanisme qui permet de déterminer les paramètres du tunnel IPv4 sur IPv6. Ce mécanisme fait parti de la norme appelée MAP-E (Mapping of Address and Port with Encapsulation). L'établissement du tunnel nécessite seulement trois adresses, mais leur détermination est pour le moins alambiquée, pour deux d'entre elles.

Les adresses nécessaires à l'établissement du tunnel :

1) adresse IPv6 source du tunnel (forgée)
2) adresse IPv6 destination du tunnel (délivrée directement par l'option DHCPv6 S46)
3) adresse IPv4 partagée (forgée)

Les informations qui permettent de déterminer ces adresses :

- le préfixe IPv6 en /60 du client distribué par DHCPv6

Tout le reste est récupéré depuis l'option S46 MAP-E container, incluse dans la réponse DHCPv6. Les valeurs suivantes définissent ensemble la règle de mappage MAP-E :

- nombre du nombre de bits EA (embedded address), cette valeur servira à forger l'IPv4 partagée et définir le mappage de ports. Elle est égale à 23.

- préfixe IPv4 et sa longueur, qui servira aussi à forger l'adresse IPv4 partagée. Le préfixe est égal à 88.160.0.0/11

- longueur de préfixe IPv6 MAP-E, cette valeur servira à forger l'IPV4 partagée. Elle est égale à 37.

- paramètres de mappage de ports, permet de définir la plage de ports utilisée pour l'adresse IPv4 partagée. Dans le cas de Free, le mappage est simple, 2 bits sont utilisés pour définir une plage de ports parmi 4, les deux derniers bits des bits EA. Les 21 premiers bits de EA sont donc le suffixe de l'IPv4 partagée.

- adresse destination du tunnel MAP-E (adresse de border router ou BR)


Voilà comment construire les paramètres. Il faut déjà construire l'adresse IPv4 partagée :

1) prendre les 11 bits du préfixe IPv4. Il servent de préfixe pour le forgeage de l'IPv4.

2) pour le suffixe de l'IPv4 :

- prendre la valeur de longueur EA, et soustraire les deux bits utilisés pour la définition de mappage de ports, soit 23 - 2 = 21

- 11 + 21 = 32, on a bien les 32 bits d'une adresse IPv4.

3) la longueur de préfixe IPv6 MAP-E étant 37, les 21 bits 38 à 58 du préfixe IPv6 /60 vont représenter le suffixe de l'IPv4.

On a donc obtenu l'IPv4 partagée. Les bits 59 et 60 du préfixe IPv6 /60 définissent la plage de port allouée :

00 -> ports 0 à 16383
01 -> ports 16384 à 32767
10 -> ports 32768 à 49151
11 -> ports 49152 à 65535

Reste à définir l'IPv6 source, qui est également forgée :

1) prendre les 60 bits du préfixe IPv6 /60 et y ajouter 4 bits à 0 (pour obtenir le premier sous réseau /64)

2) le suffixe de l'IPv6 source sera égal à :

- 16 bits à zéro
- puis les 32 bits de l'adresse IPv4 partagée
- puis 14 bits à 0
- puis les deux bits du mappage de ports

Voilà on a maintenant l'adresse IPv6 source du tunnel.

Reste à récupérer l'adresse de border router BR, c'est à dire l'adresse IPv6 destination du tunnel. Elle est simplement incluse à la fin de l'option S46 dans la réponse DHCPv6.

L'option S46 MAP-E container, incluse dans la réponse DHCPv6 :

S46 MAP-E Container
    Option: S46 MAP-E Container (94)
    Length: 45
    S46 Rule
        Option: S46 Rule (89)
        Length: 21
        Flags: 0x80, Reserved
            1000 000. = Reserved: True
            .... ...0 = Forwarding Mapping Rule: False
        EA-bit length: 23
        IPv4 prefix length: 11
        IPv4 prefix: 88.160.0.0
        IPv6 prefix length: 37
        IPv6 prefix: 2a01:e0a:800::
        S46 Port Parameters
            Option: S46 Port Parameters (93)
            Length: 4
            Offset: 0
            PSID length: 0
            PSID: 0
    S46 BR
        Option: S46 BR (90)
        Length: 16
        BR address: 2a01:e00:29:200a::fff9



Pour l'IPv4 Full Stack, c'est également un tunnel MAP-E, mais plus simple parce que utilisant le même suffixe pour l'IPv6 source quelque soit le client, et un mappage de ports 1/1. L'utilisation d'un suffixe d'IPv6 source différent pour chaque client n'est d'ailleurs pas requise par la norme. C'est simplement une aide au diagnostique en cas de problème.

Reste à voir comment cette adresse IPv4 Full Stack est calculée et provisionnée.

Ci-dessous pour mieux visualiser, la règle de mappage MAP-E pour l'adresse IPv4 partagée :

« Modifié: 11 mars 2024 à 12:44:25 par Mikrotik »

hsd

  • Abonné Free fibre
  • *
  • Messages: 38
  • PARIS 75
Bon, je n'ai pas trouvé comment récupérer via la voie académique l'IP V4, mais voici un contournement.
Il faut au préalable créer l'Entrée DNS personnalisée sur le portail free. Enregistrez votre entrée xxxxxx.hd.free.fr
Ajoutez le commentaire ipv4-free sur l'adresse internet IPv4.

J'ai ajouté à mon script au niveau du client DHCP IPv6, les lignes suivantes :

:local CustomDNSFree "xxxxxx.hd.free.fr"
:global ipv4free [:resolve $CustomDNSFree]
/ip address set [find comment="ipv4-free"] address=$ipv4free network=$ipv4free interface=$ipipv6

Certains trouveront ça inutile, mais je voulais une configuration full dynamique.


Mikrotik

  • Abonné Free fibre
  • *
  • Messages: 43
  • TROYES (10)
Bon, je n'ai pas trouvé comment récupérer via la voie académique l'IP V4, mais voici un contournement.
Il faut au préalable créer l'Entrée DNS personnalisée sur le portail free. Enregistrez votre entrée xxxxxx.hd.free.fr
Ajoutez le commentaire ipv4-free sur l'adresse internet IPv4.

J'ai ajouté à mon script au niveau du client DHCP IPv6, les lignes suivantes :

:local CustomDNSFree "xxxxxx.hd.free.fr"
:global ipv4free [:resolve $CustomDNSFree]
/ip address set [find comment="ipv4-free"] address=$ipv4free network=$ipv4free interface=$ipipv6

Certains trouveront ça inutile, mais je voulais une configuration full dynamique.

Bonne idée. Il manque peut être une ligne pour ajouter la route par défaut ?

Egalement que se passe-t-il avec ce script si l'adresse IP change ?

hsd

  • Abonné Free fibre
  • *
  • Messages: 38
  • PARIS 75
logiquement si ip change, l'enregistrement de l'entrée dans la zone de free doit changer puisque tu ne choisis pas l'IP lorsque tu le crées. C'est je pense, du dynamique DNS.
Pour ce qui est du reste, je me suis fait un script unique qui s'exécute au démarrage du routeur. Je pense qu'il fait toute la conf excepté le FW.

#Modify the interface name where you connect your ONU & the name on CustomDNSFree
:local interfacePhysical "sfp1"
:local CustomDNSFree "xxxxx.hd.free.fr"
:local MACFree "FF:CC:EA:4A:2B:39"

:local interfaceInternet "vlan836-free"
#optional
:local interfaceGuest "vlan-guest"
:local ipipv6 "ipipv6-free"
:local ipv4Free "ipv4-free"

delay 10s
#add interface list WAN
:if ([/interface list print count-only where name="WAN"]=0) do={
/interface list add name=WAN
}
#Cleanup list member orphans
/interface list member remove [find where interface~"^\\*[0-9a-fA-F]{1,8}\$"]
#add vlan 836
:if ([/interface print count-only where name=$interfaceInternet]=0) do={
  /interface ethernet set $interfacePhysical l2mtu=1796 mtu=1704 mac-address=$MACFree
/interface vlan add name=$interfaceInternet vlan-id=836 mtu=1700 interface=sfp1
/interface list member add interface=$interfaceInternet list=WAN
}
#add ipv6 address for ipipv6 tunnel
:if ([/ipv6 address print count-only where comment="interfaceInternet2"]=0) do={
/ipv6 address add address="fd99::0ffff/128" interface="$interfaceInternet" advertise=no comment="interfaceInternet2"
}
#add ipv6 address for nat (if used)
:if ([/ipv6 address print count-only where comment="interfaceInternet"]=0) do={
/ipv6 address add address="2000::1111/128" interface="$interfaceInternet" advertise=no comment="interfaceInternet"
}
#add ipv6 prefix for Guest (optional)
:if ([/ipv6 address print count-only where comment="interfaceGuest"]=0) do={
/ipv6 address add address="fd99::/64" interface="$interfaceGuest" advertise=yes comment="interfaceGuest"
}
#add FW rule
#:if ([/ipv6 firewall filter print count-only where comment="Allow IPIPv6 tunnel on WAN"]=0) do={
# /ipv6 firewall filter add action=accept chain=input comment="Allow IPIPv6 tunnel on WAN" in-interface-list=WAN protocol=ipencap  place-before=0
#}
#:if ([/ipv6 firewall filter print count-only where comment="Allow dhcpv6 replies on WAN"]=0) do={
# /ipv6 firewall filter add action=accept chain=input comment="Allow dhcpv6 replies on WAN" dst-port=546 \
#    in-interface-list=WAN log=yes log-prefix="fw, a: allow6, r: aid, " protocol=udp \
#    src-address=fe80::/10  place-before=0
#}
#add ipv6 DHCP Client
:if ([/ipv6 dhcp-client print count-only where comment="fibre-free"]=0) do={
/ipv6 dhcp-client
add comment="fibre-free" interface=$interfaceInternet pool-name="pool-freeV6" pool-prefix-length=60 request=address,prefix script="#Modify the \
    CustomDNSFree\r\
    \n:local CustomDNSFree \"$CustomDNSFree\"\r\
    \n\r\
    \n:local interfaceInternet \"$interfaceInternet\"\r\
    \n:local interfaceGuest \"$interfaceGuest\"\r\
    \n:local ipipv6 \"$ipipv6\"\r\
    \n\r\
    \n:local prefix [/ipv6 dhcp-client get [find interface=\$interfaceInternet] value-name=prefix]\r\
    \n:set prefix ([:pick \$prefix 0 ([:find \$prefix \",\"]-3)])\r\
    \n:local gw [/ipv6 dhcp-client get [find interface=\$interfaceInternet] value-name=address]\r\
    \n:set gw ([:pick \$gw 0 ([:find \$gw \",\"])])\r\
    \n:local addresse0ffff (([:pick \$prefix 0 ( [ :len \$prefix ] -1 )]) . \"0:ffff:ffff:0\")\r\
    \n:local prefix2 (([:pick \$prefix 0 ( [ :len \$prefix ] -3 )]) . \"2::\")\r\
    \n\r\
    \n#remove the uggly IP\r\
    \n/ipv6 address remove [find address=\"\$gw/128\"]\r\
    \n#set ipv6 for forwarding ipipv6 tunnel\r\
    \n/ipv6 address set [find comment=\"interfaceInternet2\"] address=\"\$addresse0ffff/128\" interface=\"\$interfaceInternet\" adver\
    tise=no\r\
    \n#set ip to the ipipv6 tunnel\r\
    \n/interface ipipv6 set \$ipipv6 local-address=\$addresse0ffff\r\
    \n#set 1st IP from prefix (if NAT used)\r\
    \n/ipv6 address set [find comment=\"interfaceInternet\"] address=\"\$prefix/128\" interface=\"\$interfaceInternet\" advertise=no\
    \r\
    \n#set 2nd prefix on Guest VLAN (if used)\r\
    \n /ipv6 address set [find comment=\"interfaceGuest\"] address=\"\$prefix2/64\" interface=\"\$interfaceGuest\" advertise=yes\r\
    \n#set IPV4 Free\r\
    \n:global ipv4free [:resolve \$CustomDNSFree]\r\
    \n/ip address set [find comment=\"ipv4-free\"] address=\$ipv4free network=\$ipv4free interface=\$ipipv6\r\
    \n" use-interface-duid=yes use-peer-dns=no

} else {
/ipv6 dhcp-client set [find comment="fibre-free"] interface=$interfaceInternet
}
#add ipipV6 tunnel
:if ([/interface print count-only where name=$ipipv6]=0) do={
/interface ipipv6 add name=$ipipv6 remote-address=2a01:e00:29:200a::fffd local-address=fe80::1234 mtu=1500
  /interface list member add interface=$ipipv6 list=WAN
}
#add ipv4 on ipipv6 interface
:if ([/ip address print count-only where comment=$ipv4Free]=0) do={
/ip address add address=1.2.3.4 network=1.2.3.4 comment=$ipv4Free interface=$ipipv6
}
#add route ipv4 on ipipv6 interface
:if ([/ip route print count-only where comment=$ipipv6]=0) do={
/ip route add dst-address=0.0.0.0/0 gateway=$ipipv6 comment=$ipipv6
} else {
  /ip route set [find comment=$ipipv6] gateway=$ipipv6
}
#
/ipv6 dhcp-client release [find comment="fibre-free"]

« Modifié: 23 mars 2024 à 11:11:14 par hsd »

Mikrotik

  • Abonné Free fibre
  • *
  • Messages: 43
  • TROYES (10)
Citer
logiquement si ip change, l'enregistrement de l'entrée dans la zone de free doit changer puisque tu ne choisis pas l'IP lorsque tu le crées. C'est je pense, du dynamique DNS.

Oui bien sur, mais si l'IP change, l'ancienne adresse IPv4 précédemment mise en place par ce script reste en place ? Pour que ce soit réellement dynamique, l'ancienne adresse devrait être remplacée par une nouvelle, et non pas seulement ajouter une nouvelle adresse ?


hsd

  • Abonné Free fibre
  • *
  • Messages: 38
  • PARIS 75
Le script que j'ai partagé fait la conf et crée un script au niveau du client DHCP IPv6. La réactualisation de l'ipV4 se fera donc au renouvellement du bail de l'ipv6 ou du redémarrage du routeur. Rien n'empêche de le faire plus souvent via le scheduler.
Perso je ne le ferais pas, je pars du principe non vérifier que chez free nous sommes en IP fixe et que les changements ont plutôt été dû à des modifications techniques.
Si tu regardes le script il réactualise bien et ne recrée pas. La création n'a lieu qu'au démarrage du routeur et uniquement si l'enregistrement n'existe pas.
Il n'y a que les règles de FW que je n'ai pas pu créer de la sorte en vérifiant auparavant leur existence. Je n'ai pas trouvé encore comment faire.