Freebox en bridge, edgerouter et IPv6

Première publication : 2024-12-08

Il existe plusieurs guides en lignes pour arriver à un résultat similaire (voir en bas d’article), mais chaque cas étant un peu particulier j’ai choisi de faire un retour sur le mien.

Je vais probablement écrire des bêtises ou montrer que j’ai fait des choses un peu débiles, mais je suis sûr que vous me les pointerez avec bienveillance.

Depuis les débuts de l’ADSL en France, je suis chez Free. Tout n’est pas parfait, mais j’ai toujours eu plus de raisons de rester que de partir.

J’ai la Freebox v6 « Revolution » depuis sa sortie en 2010/2011. Pendant longtemps j’ai utilisé la multitude de services : Wifi, UPnP/DLNA, passerelle DECT, stockage/seedbox, player TV/DVD/…
À une certaine période, à chaque orage je perdais ma Freebox (probablement à cause d’installations communes mal isolées) et j’ai sérieusement songé à quitter Free. Ils ne sont pas responsables des orages ni des défauts d’isolation de l’ADSL, mais l’électronique de la Freebox est notoirement peu résistante aux surtensions venant du réseau téléphonique.
J’ai donc petit-à-petit réduit ma dépendance aux services proposés, jusqu’à avoir un “vrai” routeur ainsi qu’un réseau Wifi et un système multimédia indépendants. Je n’utilise plus le DECT (plus de fixe à la maison). Par contre j’utilise encore la passerelle VoIP interne avec mon alarme qui est branchée en RJ11 sur la Freebox Server.

Je ne sais pas pourquoi mais j’ai toujours cru que passer ma Freebox Server en mode “bridge” (au lieu de “routeur”) allait me désactiver Freebox Player et la passerelle VoIP. C’est pourquoi je restais en mode “routeur” avec un double-NAT.

Aussi, mon ADSL s’est fortement dégradé dans le temps. Alors que je suis à 500m du DSLAM, mon débit max en upload s’était réduit d’environ 1 Mo/s à 450 ko/s ces derniers mois.
Très récemment (en septembre), j’ai découvert par hasard que j’étais éligible à un raccordement à la fibre optique depuis un certain temps, mais Orange qui a posé les fibres avait référencé des adresses qui n’existent pas sur le cadastre, donc les outils de tests d’éligibilité me disaient toujours d’arrêter de rêver. Il a fallu que je fouille sur les outils de l’ARCEP pour voir que j’étais éligible.
Ça a été tout un périple – je le raconterai peut-être plus tard – mais je suis raccordé à la fibre depuis début décembre.

Je dois dire d’ailleurs que le service client de Free (et la procédure de transition ADSL/Fibre) a été incroyable. J’étais resté sur des équipes sous-dimensionnées, délocalisées, limites incompétentes… Mais je constate que ça s’est énormément amélioré.

Et qu’est-ce qu’on fait quand on passe à la fibre ? On court tester à quel point ça va vite. Un copain qui héberge un “speedtest” chez lui (chez Free aussi) m’a demandé de tester la liaison entre nos deux connexions. Sauf que les services qu’il héberge ne sont accessibles qu’en IPv6 et par flemme (notamment à cause de l’empilement de routeurs chez moi) je n’avais pas fait en sorte de pouvoir faire de l’IPv6.

Après tant d’années à procrastiner, j’ai voulu faire l’effort et activer l’IPv6. Et une des approches les plus simples était de passer le Freebox Server en mode bridge. J’étais prêt à renoncer complètement au Freebox Player, mais des pages mentionnaient qu’en bidouillant un truc avec un VLAN 100… on pouvait le faire remarcher. Idem pour la passerelle VoIP qui n’était pas listée dans les services désactivés en passant en mode bridge.

Fin du contexte, début de la technique.

Lorsque la Freebox Server passe en mode bridge, elle attribue l’IP publique (probablement par DHCP) à la première machine qui la demande sur son switch ethernet.

En passant dans ce mode, j’ai perdu accès à Internet et au FreeboxOS.

Sur le switch intégré du Freebox Server j’avais aussi une sonde Atlas (86.83% d’uptime depuis avril 2012) en plus du FreePlug et de mon routeur.
Donc soit l’adresse publique a été donnée d’abord à la sonde Atlas au lieu de mon routeur, soit mon routeur n’avait pas encore refait de requête DHCP et il était resté sur son adresse locale.
J’ai eu peur d’avoir fait une belle connerie ; j’ai tout débranché du Freebox Server et rebooté mon routeur. Ça l’a forcé à refaire une requête DHCP et il a donc pris l’adresse publique. Et comme il n’avait rien changé à sa configuration de serveur DHCP, NAT… j’ai retrouvé accès à Internet et au FreeboxOS.

Pour l’accès au FreeboxOS par https://mafreebox.freebox.fr, je n’ai pas en tête le détail exact, mais je suppose que le Freebox Server intercepte les requêtes à 212.27.38.253. En tous cas on ne perd pas l’accès quand on est mode bridge. On peut toujours revenir en arrière… C’est aussi utile pour retrouver l’adresse IPv6 du lien local (pour plus tard).

Au final, j’ai rebranché ma sonde Atlas en aval du routeur et elle remarché directement. Pour le FreePlug, j’y reviens plus tard, mais y’a pas de souci.

Pour la partie IPv6, j’ai suivi des articles à droite et à gauche mais voici en gros ma configuration (valide pour EdgeOS v2.0.9-hotfix.7).

NB : J’ai mis des ****** à la place d’informations spécifiques et sans intérêt.
J’ai mis <IPV6-PREFIX> qui correspond aux 4 premiers “champs” de votre bloc d’IPv6 donné par Free.
Enfin, j’ai mis <FREEBOX-IPV6-LINK-LOCAL> pour la route statique, qui correspond à l’adresse IPv6 locale de votre Freebox Server. On récupère cette information dans FreeboxOS > Paramètres de la Freebox > Mode Avancé > Configuration IPv6 > Général.

firewall {
    all-ping enable
    broadcast-ping disable
    group {
        network-group RFC1918 {
            description "RFC1918 ranges"
            network 10.0.0.0/8
            network 172.16.0.0/12
            network 192.168.0.0/16
        }
    }
    ipv6-name WANv6_IN {
        default-action drop
        description "WAN inbound traffic forwarded to LAN"
        enable-default-log
        rule 10 {
            action accept
            description "Allow established/related sessions"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
        rule 30 {
            action accept
            description "Allow ICMPv6"
            protocol icmpv6
        }
    }
    ipv6-name WANv6_LOCAL {
        default-action drop
        description "WAN inbound traffic to the router"
        enable-default-log
        rule 10 {
            action accept
            description "Allow established/related sessions"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
        rule 30 {
            action accept
            description "Allow ICMPv6"
            protocol ipv6-icmp
        }
        rule 40 {
            action accept
            description "Allow DHCPv6"
            destination {
                port 546
            }
            protocol udp
            source {
                port 547
            }
        }
    }
    ipv6-receive-redirects disable
    ipv6-src-route disable
    ip-src-route disable
    log-martians enable
    name IOT_IN {
        default-action accept
        description ""
        rule 1 {
            action accept
            description "Allow established/related"
            log disable
            protocol all
            state {
                established enable
                invalid disable
                new disable
                related enable
            }
        }
        rule 2 {
            action drop
            description "Drop invalid state"
            log disable
            protocol all
            state {
                established disable
                invalid enable
                new disable
                related disable
            }
        }
        rule 3 {
            action drop
            description "Block local access"
            destination {
                group {
                    network-group RFC1918
                }
            }
            log disable
            protocol all
            source {
                group {
                }
            }
        }
    }
    name IOT_LOCAL {
        default-action drop
        description ""
        rule 1 {
            action accept
            description "Allow established/related"
            log disable
            protocol all
            state {
                established enable
                invalid disable
                new disable
                related enable
            }
        }
        rule 2 {
            action drop
            description "Drop invalid state"
            log disable
            protocol all
            state {
                established disable
                invalid enable
                new disable
                related disable
            }
        }
        rule 3 {
            action accept
            description "Allow DNS"
            destination {
                port 53
            }
            log disable
            protocol tcp_udp
        }
        rule 4 {
            action accept
            description "Allow DHCP"
            destination {
                port 67
            }
            log disable
            protocol udp
        }
    }
    name WAN_IN {
        default-action drop
        description "WAN to internal"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    name WAN_LOCAL {
        default-action drop
        description "WAN to router"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    name WAN_OUT {
        default-action accept
        description "router to WAN"
        rule 1 {
            action drop
            description "TV out (ethernet)"
            log enable
            protocol all
            source {
                mac-address ******
            }
        }
        rule 2 {
            action drop
            description "TV out (wifi)"
            log enable
            protocol all
            source {
                mac-address ******
            }
        }
        rule 3 {
            action accept
            description NTP
            destination {
                port 123
            }
            log enable
            protocol udp
        }
    }
    receive-redirects disable
    send-redirects enable
    source-validation disable
    syn-cookies enable
}
interfaces {
    ethernet eth0 {
        address dhcp
        address fe80::1/64
        description Internet
        duplex auto
        firewall {
            in {
                ipv6-name WANv6_IN
                name WAN_IN
            }
            local {
                ipv6-name WANv6_LOCAL
                name WAN_LOCAL
            }
            out {
                name WAN_OUT
            }
        }
        speed auto
    }
    ethernet eth1 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth2 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth3 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth4 {
        description Local
        duplex auto
        poe {
            output off
        }
        speed auto
    }
    loopback lo {
    }
    switch switch0 {
        address 10.10.0.1/24
        address <IPV6-PREFIX>::1/64
        description Local
        ipv6 {
            dup-addr-detect-transmits 1
            router-advert {
                cur-hop-limit 64
                link-mtu 0
                managed-flag false
                max-interval 600
                other-config-flag false
                prefix <IPV6-PREFIX>::/64 {
                    autonomous-flag true
                    on-link-flag true
                    valid-lifetime 2592000
                }
                reachable-time 0
                retrans-timer 0
                send-advert true
            }
        }
        mtu 1500
        switch-port {
            interface eth1 {
            }
            interface eth2 {
            }
            interface eth3 {
            }
            interface eth4 {
            }
            vlan-aware disable
        }
        vif 20 {
            address 10.10.20.1/24
            description IOT
            firewall {
                in {
                    name IOT_IN
                }
                local {
                    name IOT_LOCAL
                }
            }
            mtu 1500
        }
    }
}
protocols {
    static {
        route6 ::/0 {
            next-hop <FREEBOX-IPV6-LINK-LOCAL> {
                description Freebox
                interface eth0
            }
        }
    }
}
service {
    dhcp-server {
        disabled false
        hostfile-update disable
        shared-network-name IOT {
            authoritative disable
            subnet 10.10.20.0/24 {
                default-router 10.10.20.1
                dns-server 10.10.20.1
                lease 86400
                start 10.10.20.2 {
                    stop 10.10.20.254
                }
                static-mapping shellyplugsg3-****** {
                    ip-address 10.10.20.11
                    mac-address ******
                }
            }
        }
        shared-network-name LAN {
            authoritative enable
            subnet 10.10.0.0/24 {
                default-router 10.10.0.1
                dns-server 10.10.0.1
                domain-name ******
                lease 86400
                start 10.10.0.21 {
                    stop 10.10.0.240
                }
                static-mapping TV-ethernet {
                    ip-address 10.10.0.33
                    mac-address ******
                }
                static-mapping TV-wifi {
                    ip-address 10.10.0.48
                    mac-address ******
                }
            }
        }
        static-arp disable
        use-dnsmasq disable
    }
    dns {
        forwarding {
            cache-size 500
            listen-on switch0
            listen-on switch0.20
        }
    }
    gui {
        http-port 80
        https-port 443
        older-ciphers enable
    }
    mdns {
        reflector
    }
    nat {
        rule 5010 {
            description "masquerade for WAN"
            outbound-interface eth0
            type masquerade
        }
    }
    ssh {
        port 22
        protocol-version v2
    }
    unms {
        disable
    }
}
system {
    analytics-handler {
        send-analytics-report true
    }
    crash-handler {
        send-crash-report true
    }
    domain-name ******
    host-name ******
    login {
        user ****** {
            authentication {
                encrypted-password ******
            }
            level admin
        }
    }
    ntp {
        server 0.ubnt.pool.ntp.org {
        }
        server 1.ubnt.pool.ntp.org {
        }
        server 2.ubnt.pool.ntp.org {
        }
        server 3.ubnt.pool.ntp.org {
        }
    }
    offload {
        hwnat enable
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone Europe/Paris
}

Je précise tout de même quelques caractéristiques de la configuration de mon routeur :

  • J’utilise eth0 pour le WAN et j’ai créé switch0 avec eth1-4 pour le LAN. Je n’utilise pas le PoE sur eth4.
  • J’ai une TV connectée (à mon grand regret) à qui je refuse la sortie sur Internet à part pour le NTP (et en écrivant ces lignes je capte que cette règle ne s’applique qu’en IPv4 et pas encore en IPv6).
  • J’ai un réseau Wifi spécial pour les objets connectés (car certains doivent accéder à Internet) qui tague les paquets avec le VLAN 20. Ça permet au routeur de les cantonner à un LAN spécial (séparé du LAN principal), tout en les laissant sortir sur Internet. Ça protège contre la latéralisation (depuis un object connecté on ne peut pas voir les ordis/NAS/téléphones/…).
  • La plupart de mes appareils (ordis,NAS, téléphones…) ont une IP fixe dans la plage du DHCP, mais j’ai omis ça exprès. Vous n’avez pas besoin de savoir ce qu’il y a chez moi.

Avec cette configuration, j’ai bien de l’IPv6 sortant sans problème.

Il y a par contre un truc étrange ; lorsque je suis en SSH sur le routeur, un ping en IPv6 ne marche pas alors qu’il marche depuis un ordi sur le LAN. Je m’en fiche pas mal mais c’est probablement que j’ai raté quelque chose.

Il reste un détail, le Freebox Player. Même si la plupart du temps j’utilise un autre système multimédia, j’aime savoir que je peux utiliser le lecteur DVD/BluRay du Player.

J’avais noté que selon les Freebox il y avait des astuces pour faire marche le Player quand le Server est en mode bridge. Pour la Freebox « Révolution » il y a une histoire de VLAN 100.
Mais en branchant un câble ethernet (ou les FreePlugs) entre le Freebox Player et le switch intégré du Freebox Server, ça marche directement. Je n’ai eu aucune configuration à faire.
J’ai même essayé de reboot le Freebox Server et le routeur, pour vérifier si l’histoire du DHCP pour l’IP publique n’allait pas casser, mais non, c’est resté fonctionnel.

Je n’ai pas encore fait le test de l’appel sortant par mon alarme. Je brancherai un téléphone à la place pour essayer, mais j’ai toute raison de penser que c’est OK.

Quelques références utiles