Lorsque j'ai monté mon routeur OpenBSD, j'ai séparé mes réseaux filaire et wifi, parce que la solution du bridge était trop lente, je ne sais pourquoi.

Il se trouve que je suis revenu dessus, à cause d'OpenBSD à nouveau. En effet, l'un de mes portables tourne sous isotop, lequel utilise trunk, soit un système de failover : si ma connexion filaire est interrompue (ce qui est fréquent avec un portable), la connexion passe tout de suite en wifi.

Le truc

Le truc c'est qu'il faut que les deux interfaces, wifi et Ethernet, soient bien dans le même réseau logique (apparemment). Donc ça, ça passait pas hein, puisque les deux réseaux avaient bien une numérotation distincte.

Donc j'ai réessayé de mettre les deux interfaces lan de mon routeur sur un pont, un bridge. Et là, bizarrement, ça passait.

La configuration des interfaces

D'une manière générale, j'ai fait comme si mon réseau wifi avait été absorbé dans le réseau filaire. En effet, le réseau wifi n'avait que des connexions mobiles, pas d'hôtes fixes. À contrario, le réseau filaire a des hôtes fixes, en premier lieu, le serveur. J'ai donc tout intérêt à recopier la configuration initiale de l'interface eth sur le bridge de manière à ne pas me compliquer la vie.

L'interface re0, qui fait face à l'$internet, ne change pas.

/etc/hostname.bridge0

On indique juste les membres du bridge.

add vether0
add re2
add athn0
up

/etc/hostname.vether0

On indique les adresses de l'interface virtuelle du lan. Le client dhcpv6 lui ajoutera une adresse ipv6 publique après. Ceci est bien une copie du /etc/hostname.re2 originel.

inet6           fd00:22:dec:e2::1               64
inet            10.0.0.1     255.255.0.0     10.0.255.255
up

/etc/hostname.athn0

Les deux interfaces physiques n'ont plus d'éléments de configuration réseau.

mediaopt        hostap mode 11n
chan            6
nwid            ...
wpaakms         psk
wpaprotos       wpa2
wpakey          ...
up

/etc/hostname.re2

up

Client DHCPv6

J'utilise toujours Dhcpcd. Son job c'est surtout de récupérer le préfixe ipv6 et donc d'ajouter l'adresse ipv6 publique de vether0.

# Persist interface configuration when dhcpcd exits.
persistent

interface re0
        nooption dhcp6_vivco
        ...
        ia_na 1

    # 226 = e2 en hexa; 160 = a0 en hexa
    #ia_pd 1 re2/226/64 athn0/160/64

    ia_pd 1 vether0/226/64

fqdn ptr

PF

PF doit travailler sur les deux interfaces réelles et sur l'interface virtuelle vether0 :

eth="re2"
wifi="athn0"
lan="vether0"
internet="re0"

## General

set block-policy drop
set skip on lo
...
antispoof       for ($lan)
...
pass in quick on { $lan, $eth,$wifi }   proto udp   to any    port bootps
...
pass        from { (self), ($lan:network) }

Macros

On remarquera d'abord mon utilisation des macros (dans les premières lignes), qui permettent de s'y retrouver un peu mieux.

eth="re2"
wifi="athn0"
lan="vether0"
internet="re0"

Antispoof

La ligne d'antispoof indique de bloquer toutes les connexions qui déclarent avoir des adresses dans le réseau de $lan, soit le réseau attaché à l'interface virtuelle vether0, mais qui ne passeraient pas par cette même interface, et qui seraient donc frauduleuses et usurpatrices de ces mêmes adresses.

antispoof       for ($lan)

Autorisation des requêtes DHCP

NB: l'explication suivante est à prendre avec des pincettes, vu que je comprends pas tout.

Cette ligne indique de laisser passer toutes les requêtes DHCP qui arrivent sur les interfaces Ethernet et wifi. En effet, les requêtes arrivent bien sur ces interfaces. Elles n'ont pas encore été assignées à vether0 et n'ont pas non plus d'adresse d'origine dans le réseau $lan. Ce qui est assez logique vu que c'est le job de DHCP de le faire.

pass in quick on { $lan, $eth,$wifi }   proto udp   to any  port bootps

Elle laisse aussi passer les les connexions sur $lan parce que les renouvellements de baux se font avec des adresses déjà établies.

C'est la raison pour laquelle (je crois), il faut bien laisser passer les requètes sur les interfaces physiques et virtuelle à la fois. En tout cas, cette ligne est essentielle et mon réseau ne peut fonctionner correctement sans elle.

Dernière ligne

pass        from { (self), ($lan:network) }

Enfin la dernière ligne laisse passer tous les paquets qui ont pour origine, le routeur lui-même ( self ) ou le réseau de $lan.

Dnsmasq

J'utilise toujours Dnsmasq comme serveur DHCP et DNS local.

# If you want dnsmasq to listen for DHCP and DNS requests only on
# specified interfaces (and the loopback) give the name of the
# interface (eg eth0) here.
# Repeat the line for more than one interface.

interface=lo0
interface=vether0

################ eth
ra-param=vether0,low,1000,3600
dhcp-range=::100,::1000,constructor:vether0,ra-names,slaac,ra-stateless
dhcp-range=vether0,10.0.0.50,10.0.255.250,255.255.0.0,12h

Voyez, j'ai juste repris la configuration de l'interface eth originelle, changé le nom pour vether0 et commenté les options sur l'interface wifi.