Momtchil Momtchev
Linux, OpenBSD, TCP/IP, embedded, real-time, Arduino

Momtchil Momtchev

Linux, TCP/IP, embedded, real-time Contractor
Currently not looking for work
View Momtchil Momtchev's profile on LinkedIn

Utilisation d'OpenBSD en tant que routeur pour une Freebox Revolution avec support d'IPv4 en mode routage et d'IPv6 en mode bridge

Free était le premier FAI en France à proposer un accès IPv6 grand public sur sa Freebox Revolution. Cependant cette fonctionnalité pose un problème pour tout le monde qui utilise son propre routeur derrière la Freebox - la Freebox est en mode bridge et le NAT IPv4 est fait sur le routeur. Cette façon de faire est impossible en IPv6 avec un réseau /64, ce réseau étant indivisible.
La seule solution c'est d'utiliser le routeur en mode routage pour l'IPv4 et en mode bridge pour l'IPv6. PF d'OpenBSD supporte parfaitement un filtrage unifié entre le mode routeur et le mode bridge. Cependant il ne supporte pas le bridging par type de protocole IP.
La solution c'est d'utiliser ce patch qui transforme la fonctionnalité BLOCKNONIP du bridge pour créer un bridge qui fait passer uniquement l'IPv6.
  • Pour OpenBSD 5.7 et antérieur - patch rudimentaire qui remplace la fonctionnalité BLOCKNONIP
  • Pour OpenBSD 5.8 et supérieur - patch plus complet qui rajoute une nouvelle fonctionnalité BLOCKIPV4
    Si vous utiliser un boîtier PC Engines APU, je vous conseille d'installer OpenBSD 5.9 (actuellement -current), cette version étant la seule à supporter les VLANs matériel sur les cartes Ethernet re(4). Dans ce cas modifiez ainsi votre /etc/rc:
    sh /etc/netstart bridge0
    sh /etc/netstart bridge1
    sh /etc/netstart
    
    (merci à Martin Pieuchot <mpi@openbsd.org> pour cette remarque)
    Pour démarrer les bridges avant de créer les VLANs. Sinon la séparation matérielle du traffic ne se fera pas correctement.

    Ici on assume que votre Freebox Revolution est connectée sur re0 et votre LAN interne - sur re2.
    Vous auriez besoin de créer deux bridges sur votre routeur, un pour le traffic IPv6 et un autre pour le traffic IPTV :
    # cat hostname.bridge0
    add re0
    add re2
    blockipv4 re2 #bridge IPv6, remplacez par blocknonip re2 pour OpenBSD 5.7 et antérieur
    up
    description "LAN Bridge"
    # cat hostname.bridge1
    add vlan0
    add vlan2
    up
    description "TV Bridge"
    

    Le traffic IPTV utilise le VLAN 100 qu'il faudra créer des deux côtés :
    # cat hostname.vlan0
    vlan 100 vlandev re0 description "FreeTV-IN"
    -inet6
    # cat hostname.vlan2
    vlan 100 vlandev re2 description "FreeTV-OUT"
    -inet6
    

    Les deux interfaces Ethernet doivent être configurées ainsi (remplacez les adresses IPv4 et IPv6 par les vôtres) :
    # cat hostname.re0
    inet 192.168.0.254 255.255.255.0 192.168.0.255
    inet6 2a01:e35:xxxx:xxxx::ffff/64
    description "LAN Gigabit Ethernet"
    # cat hostname.re2
    dhcp
    description "Free Fibre"
    

    Et bien évidemment, activez le routage des paquets IPv4 :
    # cat /etc/sysctl.conf
    net.inet.ip.forwarding=1
    net.inet.ip.ifq.maxlen=1024
    
    ifq.maxlen n'est pas obligatoire, mais ameliorera un peu vos performances si vous avez la fibre optique.
    N'oubliez surtout pas le filtrage - activer le IPv6 expose l'intégralité de votre LAN en adresses IP publics (à enrichir avec vos règles de redirection: moi j'ai ICMP, accès ssh, redirection FreePlayer et Torrent) !!
    # cat /etc/pf.conf
    set optimization normal
    set reassemble yes
    
    # Increase default stateful timeouts
    set timeout tcp.finwait 10
    set timeout tcp.first 30
    set timeout tcp.established 86400
    set timeout tcp.closed 10
    set timeout tcp.closing 30
    set timeout tcp.opening 30
    set timeout icmp.first 10
    set timeout udp.single 120
    set timeout udp.multiple 3600
    set timeout adaptive.start 20000
    set timeout adaptive.end 40000
    set limit states 60000
    
    # Fast expiry for torrent connections
    FAST="keep state ( max 10000, tcp.established 600, udp.first 15, udp.single 30, udp.multiple 60, adaptive.start 4000, adaptive.end 10000 )"
    
    match on re0 from 192.168.0.0/24 to ! 192.168.0.0/24 nat-to (re2)
    match on re2 all scrub (no-df)
    block log all
    pass on lo0
    pass on re0 inet
    pass on re0 inet6
    pass out on re2 inet
    pass out on re2 inet6
    pass on { vlan0 vlan2 } all
    pass in on re2 inet proto icmp from any to (re2)
    pass in on re2 inet6 proto icmp6 from any to any
    pass in on re2 inet proto tcp from any to (re2) port ssh rdr-to ssh-host port ssh
    pass in on re2 inet6 proto tcp from from any to ssh-host port ssh
    pass in on re2 inet proto { udp,tcp } from any to (re2) port torrent rdr-to torrent-host port torrent $FAST
    pass in on re2 inet6 proto { udp,tcp } from from any to torrent-host port torrent $FAST
    pass in on re2 inet proto udp from 212.27.38.253 to (re2) rdr-to freeplayer-host