Bridge sur le routeur OpenBSD
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.