Cascador, dans son infinie sagesse, m’a expliqué que j’étais fou de vouloir écrire ce truc. Je ne savais pas que c’était impossible. Alors je l’ai fais quand même.

Contexte

Je viens de m’installer un routeur personnel sous OpenBSD. Ça a l’air déjà suffisament dingue en soi !

Crazy people are sacred, because they dream with their eyes open.

Comme j’ai eu un peu de mal à trouver de la doc à jour, je me suis dis que ça vaudrait le coup de faire un article. Soyons fous, écrivons encore un article fleuve qui va me prendre des jours et des jours à rédiger, et ce dans deux langues !

Friends don’t let friends use commercial-grade routers.

Donc je vais décrire mon installation ici, et ce sera en même temps un tutoriel pour vous, si vous aussi souhaitez tenter le diable.

Cette installation est idéale pour le cas d’un fournisseur d’accès associatif, où la culture DIY est très forte. Je pense notamment aux FAI de FFDN.

NB : mon installation a depuis subi quelques changements. Vous pouvez lire les articles concernés ici :

Pré-requis

Ce tutoriel se veut didactique. Néanmoins, ça peut pas marcher si vous ne savez pas monter un OpenBSD, si vous ne savez pas ce qu’est une IP, le NAT, le DNS. Je vous renvoie à cet article pour plus de détails sur le réseau.

Matériel

J’ai fait l’acquisition d’un APU de PC engines.

Vous pouvez tout à fait utiliser autre chose. Un vieil ordinateur fera très bien l’affaire, pour autant qu’il ait au minimum deux cartes réseau (vous pouvez sûrement installer une ou plusieurs cartes réseaux supplémentaires dans un vieux PC tour). Vous pourrez alors aussi utiliser un vrai disque dûr. C’est du recyclage, c’est beau…

Si, comme moi, vous achetez un APU, pensez aussi à acheter le câble série ou série-usb qui vous permettra de contrôler la machine lors de l’install (et ultérieurement lorsque le réseau est coupé ou que vous faîtes une upgrade).

En guise de disque dur pour l’APU, je vous conseille l’utilisation d’un mini SSD. Ce n’est plus très cher et vous évitera de vous arracher les cheveux avec une carte SD (qui était la première solution que j’ai utilisée et qu’il faut mettre en lecture seule).

Le câble série-usb

Si vous souhaitez monter une carte Wifi, achetez-la aussi par la même occasion, avec les deux antennes et les deux pigtails qui vont bien.

Topologie du réseau

Un routeur, ça sert à connecter ensemble plusieurs réseaux. C’est donc très important de voir comment on va organiser ce réseau. Car il y a un piège !

Vous allez très certainement connecter une des interfaces réseau Ethernet à la connection internet proprement dit, et les autres interfaces au réseau local. Pour se faire, la plupart des documentations recommandent une interface virtuelle bridge(4) associée avec vether(4) sur toutes vos interfaces en LAN. Le résultat, c’est que les différentes interfaces fonctionnent toutes ensemble, avec un seul adressage, un seul réseau. C’est une très mauvaise idée. La machine devient en effet extrêmement lente lors de l’établissement des connections (ouvrir une bête page web prend un temps considérable).

NB : j’ai maintenant (octobre 2019) résolu ce problème et j’ai décris le tout dans cet article. Je ne prétends pas savoir quel était le problème initial.

Il vaut mieux découper franchement le réseau, attribuer une adresse par interface.

Si vous souhaitez avoir plusieurs interfaces Ethernet, utilisez un switch, ce sera beaucoup plus efficace. L’interconnexion des différents sous-réseaux de votre réseau local (wifi ↔ réseau filaire 1 ↔ réseau filaire 2) se fera via la couche de routage que l’on doit de toute façon configurer pour se connecter à internet.

Si vous souhaitez avoir du wifi, vous pouvez encore alléger davantage le travail de la machine en délégant ça à un point d’accès wifi. C’est ce que j’avais fait il y a quelques années.
L’avantage, c’est que vous n’avez pas à vous gratter la tête : le point d’accès est quasiment transparent, pas besoin d’un sous-réseau spécifique ni de la configuration associée qu’on va voir plus loin.
L’inconvénient : câblage supplémentaire, prise électrique utilisée, consommation électrique légèrement plus élevée. Et il faut acheter le point d’accès wifi lui-même et le sécuriser.

Je préfère rassembler toutes ces fonctions en un seul point, après tout, c’est pas si compliqué.

Voila donc la topologie de réseau que je vais présenter :

Installation

L’installation du système d’exploitation en lui-même n’est pas plus compliqué qu’une autre installation d’OpenBSD. Vous pouvez jeter un coup d’œil sur la faq si nécessaire.

Le plus raide, c’est certainement comment, concrètement, on contrôle la machine la première fois (et même les fois suivantes, puisqu’on va certainement pas réussir à tout installer correctement du premier coup). Vigdis décrit la procédure, mais je vais quand même vous l’expliquer.

Dans un terminal Linux ou BSD, vous allez devoir utiliser, en tant que Root la commande cu ou screen. Je crois me souvenir qu’il y en a d’autres, mais c’est déjà pas mal.

Mettez la carte SD dans l’apu. Branchez l’APU sur l’électricité, puis le câble série. Pour ma part, j’ai un câble série-usb. L’APU apparaît donc comme un périphérique usb sur mon laptop (Jabberwocky) :

[stephane@Jabberwocky ~]$ dmesg|tail
[12527.053556] usbcore: registered new interface driver usbserial
[12527.053574] usbcore: registered new interface driver usbserial_generic
[12527.053587] usbserial: USB Serial support registered for generic
[12527.058604] usbcore: registered new interface driver ftdi_sio
[12527.058624] usbserial: USB Serial support registered for FTDI USB Serial Device
[12527.058720] ftdi_sio 2-1.2:1.0: FTDI USB Serial Device converter detected
[12527.058774] usb 2-1.2: Detected FT232RL
[12527.059219] usb 2-1.2: FTDI USB Serial Device converter now attached to ttyUSB0

On se connecte à l’apu via votre machine locale :

[stephane@Jabberwocky ~]$ sudo screen /dev/ttyUSB0 115200

Le dernier paramètre, c’est la vitesse de connection, en bauds. Me demandez pas ce que ça veut dire, j’en sais que pouik.
Si vous obtenez un écran vide, tappez entrée deux ou trois fois.

Avec cu, ça donnerait :

sudo cu -s 115200 -l /dev/ttyUSB0

Si vous n’avez toujours pas la main à ce moment là, alors vous débranchez l’alimentation électrique de l’apu et rebranchez sans avoir débranché le câble série lui-même.

Pour que vous compreniez bien, on va entrer les commandes sur l’APU via le clavier et l’écran d’une autre machine. Cette autre machine ne perdra pas sa connection internet, rien de grave ne lui arrivera. Et vous pouvez toujours l’utiliser normalement dans ses autres fonctions en même temps que vous contrôlez l’apu avec.

Je ne dis rien des détails de l’install’. Vigdis et Thuban ont très bien décrit ce bazar.

Bon, pour la durée de l’installation, vous êtes Root sur l’apu, via le câble série, ok ?

Les interfaces ? Quelle interface physique correspond à quoi en virtuel ?

Énumérons les interfaces avec ifconfig :

ifconfig
lo0: flags=8049<LOOPBACK,RUNNING,MULTICAST> mtu 32768
        priority: 0
        groups: lo
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6
        inet 127.0.0.1 netmask 0xff000000
re0: flags=18843<BROADCAST,SIMPLEX,MULTICAST,MPSAFE> mtu 1500
        lladdr 00:0d:b9:3e:a8:10
        priority: 0
        media: Ethernet autoselect (10baseT half-duplex)
        status: no carrier
re1: flags=18802<BROADCAST,SIMPLEX,MULTICAST,MPSAFE> mtu 1500
        lladdr 00:0d:b9:3e:a8:11
        priority: 0
        media: Ethernet autoselect (10baseT half-duplex)
        status: no carrier
re2: flags=18843<BROADCAST,SIMPLEX,MULTICAST,MPSAFE> mtu 1500
        lladdr 00:0d:b9:3e:a8:12
        priority: 0
        media: Ethernet autoselect (10baseT half-duplex)
        status: no carrier
enc0: flags=0<> 
        priority: 0 
        groups: enc  
        status: active   
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33144
        priority: 0
        groups: pflog

Les adresses MAC des interfaces, notées lladdr, se suivent et leur dernier numéro correspond au numéro de l’interface.

C’est mon cas. Je ne suis absolument pas certain que ce soit pareil chez vous, même si c’est probable.

On remarque en branchant un câble Ethernet sur une interface et en lançant dhclient que l’interface physique correspond, en virtuel, à l’interface de numéro inférieur.

C’est à dire que si vous branchez l’interface indiquée LAN1 sur la carte (oui, je sais, faut faire vachement gaffe pour la trouver celle-là !), alors ce sera l’interface re0 qui prend dans le système.

Une fois que vous avez tout compris, je vous encourage vivement à noter tout ça sur un papier ou une étiquette et à coller ça sur ou dans la boîte du routeur.

Pour ma part, j’ai noté les MAC des interfaces réseau, et la vitesse de connection en bauds.

J’ai donné à la machine le nom “Alix”. Néanmoins, c’est bien un APU.

Configuration

On rentre donc dans le feu de l’action.

Style des fichiers de conf'

Quand je peux, je fais mes fichiers de configuration de cette manière :

  • Beaucoup de tabulations, pour aligner les champs verticalement, en particulier quand les lignes de conf’ sont identiques.
  • À chaque fois que j’utilise un code trouvé sur internet, j’indique dans le commentaire au dessus l’url où ce code a été trouvé, et si possible une date.
  • À chaque fois que la ligne de conf’ n’est pas évidente, j’indique son utilité dans le commentaire au dessus.
  • Plutôt commenter une ligne que la supprimer quand on est en plein travail ou en debugging.
  • Ne faire le ménage (effacer les lignes de conf’ commentées) que plusieurs semaines après que la conf’ actuelle ait été chargée.
  • Le ménage en question est assez conservateur: mieux vaut conserver une option commentée que la supprimer, et pleurer deux mois/ans plus tard quand vous en avez besoin.
  • Ne pas hésiter à mettre des lignes vides.

Dans l’ensemble, j’ai des fichiers de conf assez nets, même si un peu fouillis des fois à cause de ce conservatisme. Mais on m’a récemment complimenté pour la propreté du pf.conf que j’indique en dessous, où vous allez voir l’avantage de ces diverses pratiques.

Je vous encourage donc à vous en inspirer.

Adresse publique : re0

J’ai connecté l’interface re0 au modem internet.

Pour ma part, j’ai ça dans le /etc/hostname.re0 :

dhcp
up

Il est fort possible que votre fournisseur d’accès internet ait une configuration tout à fait différente.

J’ai aussi ca dans mon /etc/dhclient.conf :

send host-name "alix.22decembre.eu";
ignore domain-name-servers, domain-name;

Je ne crois pas que le send host-name soit utile. En revanche, la ligne ignore est indispensable si vous voulez configurer votre propre serveur DNS (Si vous ne l’avez pas, le fichier resolv.conf sera réécrit à chaque requête DHCP, quand bien même votre adresse serait statique).

Une fois que vous pouvez pinger une ip connue (au hasard : 8.8.8.8), c’est que votre connection internet est active. Vous pouvez maintenant passer à l’étape suivante, à savoir la configuration du réseau local.

Lan

J’ai décidé de faire mon LAN avec un 10.0.0.0/8. Chaque sous-réseau (Wifi et Ethernet) sera un /16, ce qui fait beaucoup de place pour faire des trucs pas catholiques.

Ethernet : re2

L’interface re2 va servir le réseau local filaire et je vais lui attribuer l’adresse 10.0.0.1. Les fichiers des interfaces suivent la syntaxe décrite dans le manuel hostname.if(5):

inet            adresse     masque de réseau    adresse de broadcast

Ici la configuration dans /etc/hostname.re2 :

inet            10.0.0.1     255.255.0.0     10.0.255.255
up

Wifi : athn0

L’interface athn0 est une carte wifi issue de mon ordinateur portable qui m’a lâché au moment même où je construisais ce routeur. La votre sera peut-être autre chose. Si vous achetez une carte wifi, essayez de vous assurer à l’avance qu’elle supporte le mode hostap, soit la mise en point d’accès.

Je lui assigne l’adresse 10.1.0.1.

La configuration dans /etc/hostname.athn0:

inet            10.1.0.1    255.255.0.0    10.1.255.255
mediaopt        hostap
nwid            nomderesau
wpakey          motdepassereseautreslongetcomplique
up

J’utilise bien du wpa plutôt que la solution maison de OpenBSD qui consiste à laisser passer tous ceux capables de s’authentifier en ssh. Vigdis a décrit ce type d’install en français.

Le soucis avec ssh, c’est que tout le monde ne sait pas l’utiliser, ne sait pas qu’il existe, ou ne l’a pas sur son ordinateur.

Tadam… J’avais un smartphone Geeksphone Revolution avec FirefoxOS dessus. C’est un ordinateur ! Comme tous les smartphones. Et je n’avais pas de client ssh dessus. Donc je ne vais pas m’enfermer moi-même en dehors de mon propre réseau…
Idem, les Windows n’ont pas de client ssh natif. Même certaines distributions Linux n’en ont pas !

D’autre part, un des aspects du wifi, c’est que beaucoup de potes que tu connais et squattent chez toi de manière occasionnelle vont utiliser ton wifi pour acceder à internet et je me vois mal expliquer à ces mêmes potes l’existence de ssh et comment l’utiliser.

Si vous voulez utiliser la solution d’OpenBSD, je vous encourage à le faire. Je n’irais pas vous taper dessus, c’est au contraire très bien.

Pour changer le nom du réseau ou le mot de passe du wifi (ou clé wifi), il suffit d’éditer le hostname.athn0 et recharger la conf’ :

stephane@alix:/home/stephane doas sh /etc/netstart athn0     
doas (stephane@alix.22decembre.eu) password:  
stephane@alix:/home/stephane

NFS et YP

Puisqu’on a maintenant de la connectivité sur le réseau local, on va en profiter.

Je partage déjà le /home du serveur via NFS. Montons le donc sur Alix :

/etc/fstab

70f100c03c540720.b none     swap    sw
70f100c03c540720.a  /       ffs     rw,noatime,softdep 1 1
70f100c03c540720.d  /usr    ffs     rw,nodev,noatime,softdep 1 2
70f100c03c540720.e  /var    ffs     rw,nodev,nosuid,noatime,softdep 1 2

swap                /tmp    mfs     rw,nosuid,nodev 0 0
blackblock:/home    /home   nfs     rw

Je n’ai pas touché aux premières lignes. J’ai juste ajouté le NFS et le système de fichier volatile sur /tmp.

Maintenant on peut récupérer les mots de passe via YP. C’est assez simple. La procédure côté serveur est indiquée en pied d’article. Sur le routeur, ajoutez un nom de domaine YP dans /etc/defaultdomain. Ajoutez ensuite “+:::::::::” et “+:::” à /etc/master.passwd et /etc/group et régénérez la base de donnée de passwd (en tant que root) :

pwd_mkdb -p /etc/master.passwd

Reste plus qu’à démarrer portmap et ypbind.

L’avantage de tout ça, c’est qu’on a un seul mot de passe, une seule configuration perso (.profile et autres fichiers du /home/user) et un espace de travail commun puisque vous pouvez directement travailler sur des fichiers dans le répertoire partagé de NFS. Reste plus qu’à les copier à la bonne place dans le système après.
L’inconvénient, c’est que si le serveur ne fonctionne pas, ou que NFS et/ou YP déconne, alors vous aurez des problèmes avec le routeur.

Ntp

Comme j’ai une ip publique fixe, je me suis inscrit dans le pool de serveurs ntp. C’est le routeur qui sert le temps sur le réseau. Ça me facilite la vie avec Dnsmasq.

Sysctl

Le fichier /etc/sysctl.conf permet la configuration du noyau. Dans le cadre d’un routeur, il faut surtout s’assurer que les paquets sont bien redirigés (forward).

net.inet.ip.forwarding=1

kern.bufcachepercent=80  
net.inet.ip.ifq.maxlen=1024     # 256 * number of real internet devices

PF

Pf c’est à la fois le pare-feu et la couche de routage. (C’est le principe du NAT).

Là aussi quelques conseils (en plus de ceux donnés plus haut) :

  • Perso, j’utilise pas trop les macros sur les ports, je prefère mettre les listes de ports directement dans la ligne en question. Ça me permet de savoir directement à quoi sert la ligne en question. Par exemple je peux desactiver le courriel d’un seul coup (mais seulement le courriel) d’un coup de commentaire.
  • Se renseigner sur les groupes d’interfaces. Par exemple, il y a une raison pour laquelle j’utilise self plutôt que internet sur la ligne de ntp. (Je suis un peu vache là, vous pouvez pas deviner la raison en question)
  • Faire des politiques d’ouverture pass assez précises et restreintes et limiter autant que possible les pass any to any, contrairement à de nombreuses docs que j’ai pû lire ici ou là.
  • Faire au contraire des politiques de fermeture assez large.

/etc/pf.conf

eth="re2"
wifi="athn0"
internet="re0"
blackblock_ipv4="10.0.0.2"

set block-policy drop
set limit { frags 5000, states 30000 }
set optimization normal
set skip on lo0
set skip on enc0
set state-policy if-bound

table <broken> { 224.0.0.22 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 169.254.0.0/16 \
        192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24,  240.0.0.0/4, 255.255.255.255/32 }

block in        on egress
block in quick  on $internet   from { <broken> urpf-failed no-route }  to any
pass out all

pass in                 proto udp  from any to (self)      port ntp

pass in on $internet    proto tcp  from any to (egress)    port { https,www }                      rdr-to $blackblock_ipv4
pass in on $internet    proto tcp  from any to (egress)    port { submission,smtp,sieve,imap }     rdr-to $blackblock_ipv4
pass in on $internet    proto tcp  from any to (egress)    port { git,ssh }                        rdr-to $blackblock_ipv4

pass in on $internet    proto { tcp,udp } from any to (egress)  port domain    rdr-to $blackblock_ipv4 port 5355

# nat
match in  on $internet scrub (no-df random-id max-mss 1440)
match out on $internet inet             from !($internet:network) to any nat-to ($internet:0)

# allow ping and co
pass    inet6   proto ipv6-icmp         all icmp6-type { echoreq, unreach }
pass    inet    proto icmp              all icmp-type { echoreq, unreach }

pass            proto { udp,tcp }       from $eth:network to any
pass            proto { udp,tcp }       from $wifi:network to any

# By default, do not permit remote connections to X11
#block return in on ! lo0 proto tcp to port 6000:6010

Dnsmasq

On va utiliser Dnsmasq sur le routeur. C’est même le seul logiciel qu’on va y installer.

Je me suis fais engueuler par des utilisateurs OpenBSD sur IRC, avec des remarques genre…

Pourquoi n’utilise tu pas les logiciels en Base ?
Plusieurs démons et la séparation des privilèges, c’est bien.
Tu perds le bénéfice de pledge et d’autres systèmes de sécurité.
On a déjà suffisament de docs de ce genre.

Oui, bon, d’accord. Si vous êtes pas contents, vous lisez pas ma doc. C’est simple non ? Si je publie cette doc, c’est peut-être pour avoir un truc accessible, en français aussi, et avoir d’autres exemples, d’autres configurations que celles fournies dans la doc officielle.

Les logiciels tiers en paquetages, c’est pas fait pour rien. Pour ceux qui ignorent, Pledge(2) est la toute nouvelle fonction de sécurité introduite récemment et qui s’est répandue dans tout le système d’OpenBSD. C’est super comme idée, je reconnais.

Dans mon cas Dnsmasq va jouer le rôle de serveur Dhcp et DNS pour le réseau local, alimenté par le Dhcp cité précédemment et par le fichier hosts du routeur. La résolution DNS pour tout internet sera quand à elle faite sur le serveur principal. J’utilise juste mon installation telle que configurée ici.

stephane@alix:/home/stephane doas pkg_add dnsmasq

Le fichier de configuration de Dnsmasq est un très long truc. Je vais donc me limiter aux options actives (non commentées). Chaque option est expliquée en commentaire au dessus, soit le commentaire du développeur, soit le mien.

# Never forward plain names (without a dot or domain part)
domain-needed

# Never forward addresses in the non-routed address spaces.
bogus-priv

# By  default,  dnsmasq  will  send queries to any of the upstream
# servers it knows about and tries to favour servers to are  known
# to  be  up.  Uncommenting this forces dnsmasq to try each query
# with  each  server  strictly  in  the  order  they   appear   in
# /etc/resolv.conf
strict-order

# Send all recursive queries appart from the local ones
# to another server (Unbound on Blackblock).
server=10.0.0.3

# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
local=/22decembre.eu/22december.dk/

# 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=re2
interface=athn0

# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts

# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
#     as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
#    domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
domain=22decembre.eu

################ wifi

dhcp-range=athn0,10.1.0.0,10.1.255.250, 255.255.0.0,12h

################ eth

dhcp-range=re2,10.0.0.20,10.0.255.250,255.255.0.0,12h

# Set the NTP time server addresses and DNS server addresses
# to the router itself (and unbound).
dhcp-option=option:ntp-server,0.0.0.0
dhcp-option=option:dns-server,0.0.0.0,10.0.0.3

# Set the default target for MX records created using the localmx option.
mx-target=blackblock

# Return an MX record pointing to the mx-target for all local
# machines.
localmx

Mail

Le routeur peut envoyer des mails. J’ai donc configuré son serveur smtp pour qu’il renvoie tout sur blackblock, mon serveur principal.

/etc/mail/smtpd.conf

# To accept external mail, replace with: listen on all

listen on lo0
accept from any relay via smtp://blackblock

rc.conf.local

Le fichier /etc/rc.conf.local du routeur :

pkg_scripts="dnsmasq"
portmap=YES
portmap_flags=""
sndiod_flags=NO
ypbind_flags="" 

unbound_flags=NO

check_quotas=NO

Je désactive les quotas partout, sinon le processus de boot est beaucoup trop lent (il faut qu’il se rende compte qu’effectivement, je n’ai pas de quotas…).

Une fois que tout est en place, y compris côté serveur (je pense notamment à NFS et YP), vous pouvez rebooter le routeur. L’APU est rebootable en commande, mais exécuter sync (cette commande va en fait écrire sur la mémoire de masse tout ce qui est encore en mémoire vive. Ainsi, vous ne perdez pas de données en débranchant.) , puis débrancher et rebrancher la machine passe aussi. Par contre on ne peut pas l’éteindre en commande. Donc il faut effectivement se rappeler de sync.
C’est une bonne idée d’assister à son premier vrai boot avec la console série toujours active, ça permet de bien voir si tout est en ordre, où ça peut coincer, où il faut optimiser.

Conf’ sur le serveur

Route

Il faut renseigner la route sur le serveur, à savoir l’adresse Ethernet du routeur :

/etc/mygate

10.0.0.1

hostname.if

On configure bien entendu le serveur en ip fixe. Chez moi, le serveur a également une interface re:

/etc/hostname.re0

inet            10.0.0.2        255.255.0.0     10.0.255.255
inet            10.0.0.3        255.255.0.0     10.0.255.255
up

NB: l’adresse 10.0.0.3 est reservée à unbound. De cette facon tous les serveurs de noms écoute sur une adresse dédiée, ce qui s’avère nettement plus pratique pour les debuggages :

  • NSD, serveur authoritaire pour mes domaines écoute sur l’adresse 10.0.0.2 (sur laquelle pointe le nom blackblock)
  • Unbound, serveur recursif et validateur écoute sur 10.0.0.3 (sur laquelle je mets le nom unbound pour me faciliter la vie)
  • Dnsmasq, demon DNS local écoute sur les interfaces LAN du routeur.

Les deux derniers se parlent et sont annoncés par les annonces dhcp de Dnsmasq.

Mail

Puisqu’on veut que le routeur puisse envoyer ses quelques courriers sur le serveur, il faut dire à ce dernier d’accepter le courrier en provenance du réseau local.

L’important ici, ce sont les lignes avec localnet :

table domains { 22decembre.eu, 22december.dk }

pki blackblock.22decembre.eu key                "/var/le/certs/current/serverkey.pem"
pki blackblock.22decembre.eu certificate        "/var/le/certs/current/cert.pem"

listen on lo0

table localnet { 10.0.0.0/8, 127.0.0.1, fe80::/64, 2001:470:2099::/48}
table aliases file:/etc/mail/aliases

# écoute pour les courriers en entree
listen on $eth  port smtp           tls     pki blackblock.22decembre.eu
listen on $eth  port submission     tls     pki blackblock.22decembre.eu auth

accept from source <localnet>   for domain "*.22decembre.eu"    alias <aliases> deliver to lmtp "/var/dovecot/lmtp"
accept from any                 for domain <domains>            alias <aliases> deliver to lmtp "/var/dovecot/lmtp"
accept for local                                                alias <aliases> deliver to lmtp "/var/dovecot/lmtp"

YP

Si vous n’avez pas déjà configuré un partage des mots de passe, alors c’est le moment.

Mettez le nom de domaine YP dans /etc/defaultdomain et initialisez le système avec ypinit -m.

Ensuite de quoi, il suffit normalement de faire, en tant que root :

# cd /var/yp
# make

J’ai mis une tâche cron pour régénérer les bases de données yp régulièrement, comme ça si je change mon mot de passe sur le serveur, le routeur est au courant peu après.

Vous pouvez bien entendu modifier un peu vos paramètres, mais je ne vous aiderais pas là dessus.

Reste plus qu’à autoriser portmap dans le rc.conf.local, le démarrer, puis ypserv. Là ça devrait marcher.

Unbound

En dehors des détails fournis ici, il y a quand même deux changements notable: la redirection des requêtes locales vers Dnsmasq (donc sur l’adresse du routeur) et l’assignatation d’une adresse spécifique pour unbound:

server:
    interface: 10.0.0.3
    interface: 127.0.0.1

forward-zone:
        name: "10.in-addr.arpa."
        forward-addr: 10.0.0.1

forward-zone:
        name: "22decembre.eu."
        forward-addr: 10.0.0.1

forward-zone:
        name: "22december.dk."
        forward-addr: 10.0.0.1

/etc/resolv.conf

Le resolv.conf du serveur et du routeur doivent pointer sur les mêmes adresses: le routeur et le serveur.

S’il ne peut résoudre, Dnsmasq passera la main à Unbound tel que configué dans /etc/dnsmasq.conf tout en étant très rapide pour les adresses locales.

search 22decembre.eu
nameserver 10.0.0.1
nameserver 10.0.0.3

hosts

Les fichiers hosts sur le serveur et le routeur doivent être à peu près les mêmes, contenir les adresses du routeur, et du serveur et ses alias au minimum :

127.0.0.1       localhost localhost4

10.0.0.2        blackblock www photos
10.0.0.3        unbound
10.0.0.1        alix
10.1.0.1        alix

Une suite ?

J’espère que ce texte vous aidera à monter votre projet. Je rapelle qu’il est en licence CC-by et que vous pouvez donc vous en servir librement dans vos propres projets sous reserve d’indiquer un lien vers cet article.

Les commentaires sont les bienvenus pour apporter davantage de points techniques. Vous pouvez aussi m’écrire. Je mettrais à jour si je découvre ou reçois des remarques pertinentes.

Et oui, il y a une suite.

PS: Si l’article vous a plu ou vous semble utile, ou si vous m’aimez bien, tout simplement, alors n’hésitez pas à tiper ou donner via liberapay.