---
categories: ['Traduction']
date: 2020-11-23T12:00:01+01:00
description: "Traduction du 'Guide du Routeur OpenBSD' du site unixsheikh.com"
draft: false
tags: ['Traduction','OpenBSD','Guide','Routeur']
title: "Guide du Routeur OpenBSD"
---
# Guide du Routeur OpenBSD
Pare-feu segmentant un réseau, avec DHCP, DNS (Unbound), blocage de domaine
et bien plus encore.
* OpenBSD: 6.9 · Publié : 2020-11-05 · Mis-à-jour : 2021-07-21 · Version : 1.9.4
## Introduction
Dans ce guide, nous verrons comment nous pouvons utiliser du matériel
"bas de gamme" bon marché pour construire un routeur OpenBSD terrible
avec des capacités de pare-feu, des réseaux locaux segmentés, du DNS
avec blocage de noms de domaines, du DHCP et bien plus.
Nous commencerons par paramétrer les segments réseaux (LAN) par trois
réseaux séparés, un pour les adultes à la maison, un pour les enfants
et un pour les serveurs face à Internet (comme une [DMZ](https://fr.wikipedia.org/wiki/Zone_d%C3%A9militaris%C3%A9e_(informatique))),
tel qu'un serveur web ou serveur mail privé.
Nous chercherons à voir comment nous pouvons utiliser DNS pour bloquer
les publicités, le porno, et d'autres sites sur Internet. Le routeur OpenBSD
peut aussi être utilisé dans de petites ou moyennes entreprises.
## Conventions typographiques utilisées dans ce guide
- La police à `largeur fixe` (mono-espacement) est utilisée pour les commandes
en console, les noms de fichiers et leurs chemins, les paramètres de
configuration, etc…
- Les commandes en console qui doivent être tapées en tant qu'utilisateur
`root` sont préfixées du symbole dièse `#` et la commande apparaît en
**gras** dans le texte.
- Les commandes en console qui doivent être tapées en tant qu'utilisateur
normal sont préfixées du symbole dollar `$` et la commande apparaît en
**gras** dans le texte.
## Pourquoi un pare-feu ?
{{< note info >}}
Actuellement ce guide aborde IPv4, car la plupart des personnes
n'utilisent pas IPv6 et beaucoup de FAI - *Fournisseur d'Accès à Internet* -
utilisent seulement IPv4, mais IPv6 est planifié dans le contexte d'une
future mise à jour de ce guide.
{{}}
Peu importe comment vous vous connectez à Internet depuis votre domicile
ou votre bureau, vous avez besoin d'un vrai pare-feu entre vous et le modem
ou routeur que vous fourni votre FAI.
Il est très rare que les modems ou routeurs grand public reçoivent des
mises à jour du micrologiciel et sont souvent vulnérables aux attaques
réseau qui transforment ces appareils en [Botnet](https://fr.wikipedia.org/wiki/Botnet),
tel que le fait le [logiciel malveillant Mirai](https://fr.wikipedia.org/wiki/Mirai_(logiciel_malveillant)).
De nombreux modems et routeurs grand public sont à blâmer à propos de
certaines [attaques par déni de service de grande envergure (DOS)](https://fr.wikipedia.org/wiki/Attaque_par_d%C3%A9ni_de_service)
Un pare-feu entre vous et le modem ou routeur de votre FAI ne peut pas
protéger votre dispositif modem ou routeur contre de telles attaques,
mais il peut protéger vos ordinateurs et dispositifs à l'intérieur du
réseau, et il peut vous aider à surveiller et contrôler le trafic qui
arrive vers votre réseau local et qui en part.
Sans un pare-feu entre votre réseau local et le modem ou routeur du FAI,
vous pouvez considérer basiquement que votre porte est grande ouverte,
comme laisser grande ouverte la porte de votre maison, ainsi vous ne pouvez
pas faire confiance en l'équipement de votre FAI.
C'est toujours réellement une bonne idée de mettre un vrai pare-feu entre
votre réseau local et Internet, et avec OpenBSD vous avez une solution très
solide.
## Le Matériel
Vous n'avez pas besoin d'acheter du matériel cher pour avoir un routeur
et un pare-feu efficaces pour votre maison ou votre bureau.
Même avec du matériel "bas de gamme" bon marché, vous pouvez avoir une
solution très solide.
J'ai créé de multiples solutions avec la carte-mère
[ASRock Q1900DC-ITX](https://www.asrock.com/mb/Intel/Q1900DC-ITX/) qui est
fournie avec un processeur Intel Celeron Quadri-Cœur.
{{< img a="ASRock Q1900DC-ITX" s="unixsheikh.com/asrock-q1900dc-itx.png" >}}
Je l'admet, c'est une carte-mère assez "pourrie", mais elle fait le boulot
et j'ai de nombreuses solutions très solides qui fonctionnent depuis de
nombreuses années sur des réseaux Gigabit avec saturation complète et le
pare-feu, DNS, faisant des "heures supplémentaires" et où le CPU ne chauffe
pas.
La carte-mère ASRock Q1900DC-ITX a pour avantage qu'elle est fournie
avec une prise jack DC-In (entrée électrique) qui est compatible avec
un adaptateur électrique 9-19V, ce qui la rend très économe en énergie.
Malheureusement, la carte-mère ASRock Q1900DC-ITX n'est plus fabriquée,
mais comme je l'utilise juste comme exemple ;
j'ai utilisé de nombreuses autres carte-mères bon marché tout aussi bien.
{{< note info >}}
Beaucoup d'autres carte-mères faites par d'autres fabricants
consommant peu peuvent être aussi bien utilisées, tel le fameux [APU2](https://www.pcengines.ch/apu2.htm).
{{}}
J'ai aussi utilisé l'ASRock Q1900-ITX (qui est fournie sans la prise jack
DC-In) combinée à un PicoPSU.
{{< img a="PicoPSU" s="/unixsheikh.com/picopsu.png" >}}
Vous pouvez trouvez différentes marques et version du PicoPSU, certains
sont de meilleurs qualités que d'autres. J'ai deux marques différentes,
l'original et une copie moins chère, toutes deux sont très performants et
permettent d'économiser par mal d'énergie contrairement à une alimentation
normale.
Enfin, j'utilise une carte réseau quadruple port Intel bon marché, trouvé
sur Ebay, tel que celle-ci :
{{< img a="Quad NIC Intel" s="/unixsheikh.com/intel-quad-nic.png" >}}
Je sais, il est préférable d'utiliser du matériel de qualité, spécifiquement
sur un réseau dont vous avez à prendre soin, mais ce tutoriel est relatif
au fait de comment vous pouvez vous en sortir en utilisant du matériel
bon marché tout en ayant un produit extrêmement utile qui continue à bien
vous servir pendant de nombreuses années - du moins, telle est mon expérience.
Je vous recommande de chercher une carte mini-ITX dont le matériel est
[pris en charge par OpenBSD](https://www.openbsd.org/amd64.html), tel qu'un
CPU Intel Celeron ou Intel i3. Ces cartes-mères sont typiquement peu chères,
peu gourmandes d'énergie, et ne prennent pas beaucoup de place.
Je ne recommande pas l'utilisation d'un CPU Intel Atom si vous avez un réseau
Gigabit, car il ne peut pas gérer la quantité de trafic.
Vous pourriez également avoir besoin de quelques commutateurs Gigabit
bon marché pour segmenter votre réseau local, au moins si vous avez plus
d'un ordinateur connecté sur le même LAN :)
## Pourquoi OpenBSD ?
En vérité, vous pouvez avoir le même paramétrage avec une autre saveur
BSD ou une des différentes [distributions Linux](https://fr.wikipedia.org/wiki/Distribution_Linux),
mais [OpenBSD](https://www.openbsd.org/) est spécifiquement très bien
adapté et conçu pour ce genre de tâche.
Non seulement il est livré avec tous les logiciels nécessaires dans
l'installation de base, mais il offre également une sécurité nettement
supérieure, et des tonnes de mesure d'atténuation améliorées déjà intégrées
dans le système d'exploitation.
Je [recommande chaudement](https://www.unixsheikh.com/articles/openbsd-is-fantastic.html)
OpenBSD plutôt que tout autre système d'exploitation pour ce genre de
tâches.
Ce guide ne vous montre pas comment installer OpenBSD.
Si vous ne savez pas faire, je vous recommande de faire fonctionner une
machine virtuelle avant ou de voir si vous avez du matériel inutilisé et
pris en charge avec lequel vous pourriez tester.
OpenBSD est un des systèmes d'exploitations des plus faciles et rapides à
installer.
N'ayez pas peur de l'approche sans GUI (interface utilisateur) ; une fois
que vous l'avez essayé, vous apprécierez vraiment sa simplicité.
Dans le doute, utilisez les paramètres par défaut.
Avant de commencer ce voyage, assurez-vous de consulter la documentation
d'OpenBSD !
Non seulement, chaque chose est très bien documentée, mais vous trouverez
très probablement toutes les réponses dont vous avez besoin.
Lisez la [FAQ OpenBSD](https://www.openbsd.org/faq/index.html),
regardez les différentes [pages de manuels](https://man.openbsd.org/) à
propos des différents logiciels que nous allons utiliser.
Un autre endroit vraiment utile où trouver des informations générales à
propos d'OpenBSD sont les [archives des listes de diffusions d'OpenBSD](https://marc.info/?l=openbsd-misc).
Aussi assurez-vous de rester à jour des informations pertinentes en
souscrivant à la liste de diffusion des [Annonces et avis de sécurité](https://www.openbsd.org/mail.html).
{{< note tip >}}
Veuillez considérer de [soutenir OpenBSD](https://www.openbsd.org/donations.html) !
Même si vous n'utilisez pas quotidiennement OpenBSD, vous
utilisez peut-être déjà [OpenSSH](https://www.openssh.com/) sur Linux,
alors vous utilisez vraiment un logiciel du projet OpenBSD.
Considérez de faire un petit, mais régulier, don pour soutenir le développement
de tous les excellents logiciels que les développeurs d'OpenBSD font.
{{}}
## Le réseau
Un routeur est basiquement un dispositif qui régule le trafic réseau entre
deux ou plusieurs réseaux séparés.
Le routeur garantira que le trafic réseau à destination du réseau local
ne circule pas sur Internet, et que le trafic sur Internet, qui n'est pas
à destination de votre réseau local, reste sur Internet.
{{< note info >}}
Un routeur est parfois aussi appelé passerelle, ce qui est généralement
le terme, mais en vérité une véritable passerelle joint des systèmes
différents, alors qu'un routeur joint des réseaux similaires.
Un exemple de passerelle serait un dispositif qui joint un réseau PC avec
un réseau télécom.
{{}}
Dans ce tutoriel, nous construirons un routeur et nous avons 4 réseaux
de même type à faire travailler ensemble.
L'un est Internet, et les trois autres sont segmentés intentionnellement
en réseaux locaux (LAN).
Certaines personnes préfèrent travailler avec des LAN virtuels (VLAN),
mais dans ce tutoriel nous utiliserons une interface réseau 4 ports,
telle que vue sur l'illustration ci-dessus.
Vous pouvez arriver au même résultat en utilisant de multiples cartes réseau
à port unique, si vous préférez ; vous devez juste vous assurez d'avoir
assez de place et de slot PCI libre sur la carte-mère.
Vous pouvez aussi utiliser le port Ethernet de la carte-mère, mais cela
dépend du pilote et de la prise en charge du dispositif.
Je n'ai pas de problème à utiliser un contrôleur Ethernet Gigabit PCI Realtek
qui est fourni avec beaucoup de carte-mères, bien que je recommande plutôt Intel.
Bien sûr, vous n'avez pas à segmenter le réseau en de nombreuses parties
si vous n'avez pas besoin de cela, et il serait très facile de changer les
paramètres de ce guide, mais j'ai décidé d'utiliser cette approche avant
de vous montrer comment vous pouvez protéger vos enfants en segmentant
leur réseau dans un LAN séparé qui permet non seulement de bloquer la
publicité et la pornographie grâce au blocage des DNS (tous les segments
en bénéficient), mais vous pouvez même mettre sur une liste blanche les
partie de l'Internet auxquelles vous voulez qu'ils aient accès.
La dernière partie à propos des listes blanches est difficile et n'est
généralement pas recommandé à moins que vos enfants aient besoin d'un
accès très limité, mais c'est faisable avec un peu de travail, et le guide
va vous montrer une façon de faire.
Ceci est une illustration du réseau que nous allons paramétrer :
Internet
|
xxx.xxx.xxx.xxx
Modem FAI (WAN)
10.24.0.23
|
OpenBSD
10.24.0.50
(routeur/parefeu)
|
┌────────────────────+────────────────────┐
| | |
NIC1 NIC2 NIC3 (DMZ)
192.168.1.1 192.168.2.1 192.168.3.1
LAN1 switch LAN2 switch LAN3 switch
| | |
└─ 192.168.1.x ├─ 192.168.2.x └─ 192.168.3.2
PC Adultes | PC1 Enfant Public web server
|
└─ 192.168.2.x
PC2 Enfant
Les adresses IP qui commencent par 10.24.0 sont n'importe quelle adresse
IP que le routeur ou modem de votre FAI vous donne ; elles peuvent être
très différentes. Les adresses IP commençant par 192.168 sont les adresses
IP que nous allons utiliser dans ce guide pour notre réseau local (LAN).
Ce guide ne s'occupe en aucun cas de connectivité Wifi.
Les micrologiciels des puces sans fil sont notoirement bogués et exploitables ;
je vous recommande de n'utiliser aucun type de connectivité sans fil, si
vous pouvez vous en passer.
Si vous avez besoin de la connectivité sans fil, je recommande chaudement
que vous désactiviez l'accès Wifi du modem ou routeur du FAI (si possible),
et ensuite d'acheter le meilleur routeur Wifi que vous pouvez trouver puis
de le mettre derrière le pare-feu dans un segment isolé.
Ainsi, si jamais votre appareil sans fil est compromis, vous pourrez mieux
contrôler le résultat et limiter les dégâts.
Vous pouvez en outre configurer le routeur sans fil de telle sorte que
tout appareil, qui y est connecté, dispose de ses propres adresses IP
qui passent directement par le routeur sans fil, tout en bloquant le
trafic provenant du routeur sans fil lui-même.
De cette façon, vous pouvez empêcher le routeur sans fil de "téléphoner à la maison".
Vous pouvez aussi avoir un adaptateur Wifi supporté par OpenBSD et que
votre routeur OpenBSD agisse en tant que point d'accès, toutefois je préfère
de beaucoup segmenter la partie Wifi soit par un routeur sans fil séparé,
soit par une autre machine OpenBSD servant de point d'accès Wifi derrière
le pare-feu lui-même.
{{< note info >}}
Actuellement, autant que je le sache, aucun des pilotes Wifi d'
OpenBSD ne posent pas encore de problèmes.
{{}}
### Paramétrer le réseau
La première chose que nous allons paramétrer sont les différentes interfaces
réseaux de notre routeur OpenBSD.
Sur ma machine, j'ai désactivé l'interface réseau qui est livré avec la
carte-mère via le BIOS, et je n'utilise que l'interface réseau 4 ports d'Intel.
Si vous suivez ce tutoriel et que vous souhaitez seulement un pare-feu
basique alors vous avez au moins besoin de deux interfaces réseaux séparées.
Avant de commencer, assurez-vous de lire et de comprendre les différentes
options de la page de manuel [hostname.if](https://man.openbsd.org/hostname.if).
Prenez aussi le temps de lire la section réseau de la [FAQ d'OpenBSD](https://www.openbsd.org/faq/faq6.html).
Puisque j'utilise Intel, le pilote [em](https://man.openbsd.org/em) est
celui qu'OpenBSD charge sur chacun des ports de cette interface réseau,
qui sont listés comme étant des cartes séparées.
Cela signifie que chaque carte est listée en tant qu'`emX` où X est le
numéro actuel du port de la carte.
`dmesg` liste ma carte réseau avec 4 ports de telle manière :
```
# dmesg
em0 at pci2 dev 0 function 0 "Intel I350" rev 0x01: msi, address a0:36:9f:a1:66:b8
em1 at pci2 dev 0 function 1 "Intel I350" rev 0x01: msi, address a0:36:9f:a1:66:b9
em2 at pci2 dev 0 function 2 "Intel I350" rev 0x01: msi, address a0:36:9f:a1:66:ba
em3 at pci2 dev 0 function 3 "Intel I350" rev 0x01: msi, address a0:36:9f:a1:66:bb
```
Ce qui montre que ma carte est reconnu comme étant une Intel I350-T4 PCI Express Quad Port Gigabit NIC.
Il faut ensuite déterminer quel est le port correspondant physiquement au
numéro indiqué ci-dessus.
Vous pouvez le faire en connectant manuellement un câble Ethernet, connecté
sur un commutateur actif, un modem ou un routeur, sur chacun des ports,
un à la fois, afin de voir quel port est activé et le noter ensuite quelque part.
Vous pouvez vérifier le statuts d'activité avec la commande `ifconfig`.
Un port sans câble Ethernet sera listé comme ayant le champ `status` notifié
`no carrier` alors qu'un port avec un câble attaché sera listé en `active`.
Tel que :
```
# ifconfig
em1: flags=8843 mtu 1500
lladdr a0:36:9f:a1:66:b9
index 2 priority 0 llprio 3
media: Ethernet autoselect (none)
status: active
em2: flags=8843 mtu 1500
lladdr a0:36:9f:a1:66:ba
index 3 priority 0 llprio 3
media: Ethernet autoselect (none)
status: no carrier
```
Nous allons utiliser le port `em0` afin de le connecter au modem ou routeur
de votre FAI, vers Internet.
Dans mon cas, j'ai une adresse IP publique fournie par mon FAI ; vous en
aurez besoin si vous voulez faire fonctionner un serveur web depuis votre
maison, mais si ce n'est pas le cas, vous n'en avez pas besoin, ainsi vous
pouvez paramétrer la carte par DHCP.
Dans mon cas, j'ai besoin de spécifier une adresse IP fixe pour `em0` qui
recevra alors le trafic redirigé depuis mon FAI vers mon adresse IP publique.
Pour faire cela, je paramètre `em0` avec l'information suivante :
```
# echo 'inet 10.24.0.50 255.255.254.0 NONE' > /etc/hostname.em0
```
Si vous n'avez pas besoin d'une adresse IP publique et que votre adresse
IP est obtenue par votre FAI via DHCP, alors écrivez juste `dhcp` à la place :
```
# echo 'dhcp' > /etc/hostname.em0
```
Ensuite, je paramètre le reste des ports de l'interface réseau avec leurs
adresses IP, tel que je l'ai précédemment illustré.
```
# echo 'inet 192.168.1.1 255.255.254.0 NONE' > /etc/hostname.em1
# echo 'inet 192.168.2.1 255.255.254.0 NONE' > /etc/hostname.em2
# echo 'inet 192.168.3.1 255.255.254.0 NONE' > /etc/hostname.em3
```
Regardez la page du manuel [hostname.if](https://man.openbsd.org/hostname.if)
pour avoir plus d'informations.
Ensuite, j'ai besoin de paramétrer l'IP de la passerelle du FAI.
Selon le paramétrage de votre FAI, cela peut être une autre adresse IP que
celle du modem ou routeur du FAI.
Si vous n'ajoutez pas le fichier `/etc/mygate` alors aucune passerelle par
défaut ne sera ajouté à la [table de routage](https://fr.wikipedia.org/wiki/Table_de_routage).
Vous n'avez pas besoin de `/etc/mygate` si votre IP est fournie par le
modem ou routeur de votre FAI via DHCP.
Si vous utilisez la directive `dhcp` dans n'importe quel fichier `hostname.ifX`
alors l'entrée dans le fichier `/etc/mygate` sera ignorée.
Cela est parce que la carte obtient son adresse IP depuis un serveur DHCP
qui fournira aussi l'information de routage vers la passerelle.
Enfin, mais pas des moindres, nous avons besoin d'activer la redirection IP.
La redirection IP est le processus qui dirige les paquets IP qui voyagent
entre les interfaces réseaux du routeur.
Par défaut, OpenBSD ne fera pas de redirection des paquets IP entre les
différentes interfaces réseaux.
En d'autres mots, les fonctions de routage (appelées aussi fonctions de
passerelles) sont désactivées.
Nous pouvons activer la redirection d'IP en utilisant les commandes suivantes :
```
# sysctl net.inet.ip.forwarding=1
# echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf
```
Maintenant OpenBSD sera capable de rediriger les paquets IPv4 depuis une
interface réseau vers une autre.
Ou, tel dans notre cas avec les 4 ports, d'un port à l'autre.
Regardez la page du manuel si vous avez besoin d'IPv6.
## DHCP
Maintenant nous sommes prêts à paramétrer le service [DHCP](https://fr.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol)
que nous exécuterons pour nos différents PC et dispositifs attachés aux
différents LAN.
Avant, assurons-nous de lire et de comprendre les différentes options de
la page du manuel [dhcp.conf](https://man.openbsd.org/dhcpd.conf).
Prenons aussi le temps de regarder la page de manuel [dhcp-options](https://man.openbsd.org/dhcp-options)
à propos des options que prend en charge dhcpd.
Nous avons une option pour cacher des adresses IP à de PC ou dispositifs
spécifiques qui se connectent sur nos différents ports.
Cela est nécessaire si nous voulons rediriger le trafic qui vient d'Internet
vers quelque chose comme un serveur web.
Nous pouvons cacher une adresse IP spécifique vers un PC spécifique via
l'adresse [MAC](https://en.wikipedia.org/wiki/MAC_address) de l'interface
réseau de la machine concernée.
Dans ce cas, je réserverais toutes les adresses IP dans un ensemble allant
de 10 à 254 pour le DHCP, tandis que je laisserais les autres qui restent
pour les éventuelles adresses fixes dont je pourrais avoir besoin.
Éditer le fichier `/etc/dhcpd.conf` avec votre éditeur de texte favori et
adapter le à vos besoins.
```
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.1.1;
option routers 192.168.1.1;
range 192.168.1.10 192.168.1.254;
}
subnet 192.168.2.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.2.1;
option routers 192.168.2.1;
range 192.168.2.10 192.168.2.254;
}
subnet 192.168.3.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.3.1;
option routers 192.168.3.1;
range 192.168.3.10 192.168.3.254;
host web.example.com {
fixed-address 191.168.3.2;
hardware ethernet 61:20:42:39:61:AF;
option host-name "webserver";
}
}
```
La ligne `option domain-name-servers` spécifie le serveur DNS que nous allons
faire fonctionner sur notre routeur.
De plus l'ordinateur qui est notre serveur web sur le LAN publique
a une adresse IP fixe et un nom d'hôte fixé.
De même, si vous ne voulez pas segmenter le réseau en différentes parties,
mais que vous avez seulement besoin d'un LAN alors vous pouvez juste laisser
de côté les autres sous-réseaux pour avoir juste cela :
```
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.1.1;
option routers 192.168.1.1;
range 192.168.1.10 192.168.1.254;
}
```
Ensuite, nous avons simplement besoin de nous assurer d'activer et de démarrer
le service `dhcpd` :
```
# rcctl enable dhcpd
# rcctl start dhcpd
```
{{< note info >}}
Regardez le chapitre {{< anchor "Ajouter l'option domain-name à DHCP et utiliser un FQDN" "Ajouter l'option domain-name à DHCP et utiliser un FQDN" >}} dans
l'appendice pour savoir comment ajouter facilement un [nom de domaine pleinement qualifié (FQDN)](https://fr.wikipedia.org/wiki/Fully_qualified_domain_name)
à votre paramétrage et comment vous pouvez utiliser l'option `domain-name`
dans DHCP afin d'éviter à avoir à écrire le FQDN à chaque fois que vous
en avez besoin.
Ce chapitre vous montrera aussi comment vous pouvez éviter d'avoir à vous
souvenir des adresses IP si votre LAN a de multiples ordinateurs ou
dispositifs connectés.
{{}}
## PF - un pare-feu filtrant
Un pare-feu filtrant examine chaque paquet qui croise le pare-feu et décide
quel paquet accepter ou refuser, selon l'examen des champs dans l'IP et
les entêtes de protocole du paquet, et selon l'ensemble des règles que
vous spécifiez.
Le filtrage de paquets fonctionne par inspection des adresses IP et du
port source et de destination contenus dans chaque paquet du protocole
TCP/IP (Transmission Control Protocol / Internet Protocol).
Les ports TCP/IP sont des numéros assignés à des services spécifiques
qui identifie pour quel service chaque paquet est destiné.
Une faiblesse commune des pare-feux simples à filtrage de paquets est que
le pare-feu examine chaque paquet de manière isolée sans tenir compte des
paquets qui ont déjà traversé le pare-feu et de ceux qui pourraient le
suivre.
Ils sont appelés pare-feu "sans état".
Exploiter un filtrage de paquets sans état est assez facile.
PF d'OpenBSD **n'est pas** un pare-feu sans états, c'est un
[pare-feu à états](https://fr.wikipedia.org/wiki/Pare-feu_%C3%A0_%C3%A9tats).
Un pare-feu à états garde trace des connexions ouvertes et permet seulement
le trafic correspondant à une connexion existante ou ouvre une nouvelle
connexion permise.
Quand l'état est spécifié par une règle correspondante, le pare-feu génère
dynamiquement des règles internes pour que chaque paquet anticipé puisse
être échangé durant la session.
Il a suffisamment de capacité de correspondance pour déterminer si un paquet
est valide pour une session.
Tout paquet qui ne correspond pas au modèle de session sera automatiquement
rejeté.
Un des avantages du filtrage à états est que c'est très rapide.
Il vous permet de vous focaliser sur le fait de bloquer ou laisser passer
de nouvelles sessions.
Si une nouvelle session est passée, tous les paquets conséquents sont
automatiquement alloués et tout paquet imposteur sera automatiquement
rejeté.
Si une nouvelle session est bloquée, aucun des paquets conséquents n'est
autorisé.
Le filtrage à états fournit aussi des capacités avancées de correspondance
capables de se défendre contre le flood de différentes méthodes d'attaques
employées par des attaquants.
La Traduction d'Adresse Réseau (NAT) permet à un réseau privé derrière le
pare-feu de partager une adresse IP publique unique.
La NAT permet à chaque ordinateur du réseau privé d'avoir un accès à Internet,
sans avoir besoin de comptes multiples à Internet, ou de multiples adresses
IP publiques.
La NAT traduira automatiquement l'adresse IP du réseau privé pour les
ordinateurs et dispositifs sur le réseau vers l'unique adresse IP publique
lorsque les paquets sortent du pare-feu vers Internet.
La NAT assume aussi la traduction inverse pour les paquets de retour.
Avec la NAT, vous pouvez rediriger un trafic spécifique, couramment déterminé
par un numéro de port ou un ensemble de numéros de port, entrant depuis
votre adresse IP publique depuis Internet vers le ou les serveurs spécifiques
localisés quelque part dans votre réseau local.
[PF - Packet Filter](https://man.openbsd.org/pf) est le système de pare-feu
d'OpenBSD pour le filtrage du trafic TCP/IP et faisant de la NAT.
PF est aussi capable de normaliser ou conditionner le trafic TCP/IP, aussi
bien que gérer le contrôle de la bande passante ou la priorisation de paquets.
PF est activement maintenu et développé par l'entière équipe d'OpenBSD.
### Paramétrage de PF
Avant que nous commencions, je présume que vous avez lu à la fois et le
[Guide de l'Utilisateur de PF](https://www.openbsd.org/faq/pf/index.html)
et la page du manuel [pf.conf](https://man.openbsd.org/pf.conf), spécifiquement
la page du manuel qui est très importante.
Même si vous ne comprenez pas toutes les différentes options, assurez-vous
de lire la documentation !
Lisez la page du manuel [pf](https://man.openbsd.org/pf) pour avoir une
complète compréhension en profondeur de ce que PF peut faire.
De plus, laissez-moi commencer par vous dire que même si la syntaxe de PF
est très lisible, il est **très facile** de faire des erreurs lors de l'écriture
des règles de pare-feu.
Même des seniors et des administrateurs systèmes expérimentés font des
erreurs lors de l'écriture des règles de pare-feu.
Écrire des règles de pare-feu requiert que vous ayez planifié vos buts
avec attention, compris comment implémenter les différentes règles avant
d'obtenir le résultat attendu, et en même temps de prendre vos précautions
afin de vous éviter de vous tromper et de vous déconnecter accidentellement :)
Je pense que nous l'avons tous fait à un moment ou l'autre, que ce soit
dans la précipitation, la fatigue ou simplement par erreur.
J'ai vécu cela de nombreuses fois.
{{< note info >}}
Veuillez noter que j'ai fait de mon mieux pour garder les choses simples
autant que possible et que j'utilise autant de commentaires afin d'expliquer
ce que fait chaque règle. En même temps, j'ai testé chaque règle et surveillé
l'impact et fait de mon mieux pour éviter les complications et erreurs.
{{}}
La partie la plus importante est de ne pas faire de suppositions.
Testez toujours vos règles de manière approfondie.
Si quelque chose ne fonctionne pas, essayez de supprimer autant de règles
que possible pour ne garder que le strict minimum. Puis introduisez une
règle à la fois jusqu'à trouver la règle qui pose problème.
Enfin, continuez avec le paramétrage étape par étape.
La partie réellement difficile est de se souvenir de comment les paquets
arrivent sur une interface, comment ils sont rediriger vers une machine
sur une autre interface, et de relier correctement ce "voyage" aux termes
**pass in**, **pass out**, **block in**, **block out**, **from** et **to**.
Souvent, ces termes ne fonctionnent pas exactement comme nous avons tendance
à le penser.
### Éclaircissements
Je tiens à démarrer en clarifiant certains des paramètres communs par défaut
et des mots clés dans PF.
Quand nous parlons du traffic **pass in** ou **pass out**, une bonne manière
de se rappeler ce dont il s'agit est de penser en terme de paquets de données.
Nous utilisons **pass in** pour les paquets de données entrants qui viennent
d'ordinateurs vers une interface réseau (les ordinateurs étant rattachés
à ce périphérique réseau) et **pass out** pour les paquets de données venant
de l'interface réseau vers les ordinateurs.
Le format est soit que nous filtrons les paquets de données sur la destination :
```
from source IP to destination IP [on] port
```
Soit que nous filtrons les paquets de données sur la source :
```
from source IP [on] port to destination
```
Veuillez noter que la partie `[on]` n'est pas une partie de la syntaxe.
* `quick`
* Si un paquet correspond à une règle `pass`, `block` ou `match` avec
le critère `quick`, le paquet **est passé sans inspection des règles de
filtrage conséquentes**.
La règle avec le critère `quick` devient la dernière règle correspondante.
* `keep state`
* Vous n'avez pas besoin de spécifier le critère `keep state` pour des
règles spécifiques `pass` ou `block`.
La première fois où un paquet correspond à une règle `pass` ou `block`,
**un état d'entrée est créé par défaut**.
Seulement si aucune règle ne correspond au paquet, l'action par défaut
est **de passer le paquet sans créer d'état**.
* `on` interface/`any`
* Cette règle s'applique seulement aux paquets **qui sont entrants**,
ou **qui passent au-travers** de cette interface en particulier ou d'un
groupe d'interface.
Le critère `on any` correspondra à toute interface existante, exceptée
celles de bouclage loopback.
* `inet`/`inet6`
* Les critères `inet` et `inet6` signifie que cette règle s'applique
seulement aux paquets **entrants**, ou **passant au-travers** ce domaine
particulier de routage, soit IPv4, soit IPv6.
Vous pouvez appliquer des règles pour des domaines particuliers de routage
sans spécifier l'interface réseau. Dans de ce cas, la règle correspondra
à tout trafic de toute nature sur toutes les interfaces réseaux. En
spécifiant `inet`, vous adressez explicitement le trafic IPv4 seulement.
* `proto`
* Se limiter à un protocole est faisable en utilisant le critère `proto`.
Une règle s'applique **seulement aux paquets de ce protocole**, les autres
protocoles ne sont pas affectés. Vous pouvez chercher les protocoles
dans le fichier `/etc/protocols`. Les protocoles communs sont [ICMP](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol)
[TCP](https://fr.wikipedia.org/wiki/Transmission_Control_Protocol) et
[UDP](https://fr.wikipedia.org/wiki/User_Datagram_Protocol).
* `in` et `out`
* C'est l'une des parties les plus faciles où se tromper : la direction
du trafic. Un paquet **entre** ou **sort** toujours par le port sur
l'interface Ethernet. `in` et `out` s'applique aux paquets entrants
et sortants au-travers du port Ethernet physique auquel est attaché
le câble Ethernet. **Si rien n'est spécifié, la règle correspondra
aux paquets dans les deux directions**.
`in` et `out` ne sont **jamais** utilisé pour gérer le trafic venant
d' une interface réseau vers une autre, ce qui est fait par la NAT, en
utilisant les options `nat-to` et `rdr-to`. `in` et `out` gèrent
seulement le trafic **entrant** et **sortant** du port Ethernet physique
d'une même carte.
* `from` et `to`
* Les critères `from` et `to` s'appliquent **seulement aux paquets avec
une adresse et des ports source et destination spécifiés**.
Des deux, du nom d'hôte ou de l'adresse IP, ou du port, voire les
spécifications OS sont optionnels.
Quand nous avons affaire avec un routeur ayant de multiples interfaces
réseaux, il est facile de penser cela :
*Je veux passer les paquets entrants depuis l'interface externe
(l'interface réseau attachée à Internet) puis qu'ils aillent sur la
première interface LAN et de là vers un PC spécifique sur le LAN*
signifiant que nous suivront le "chemin des données" dans notre esprit,
et alors nous écrivons quelque chose comme cela :
`pass in on $ext_if from $ext_if to $dmz port 80`.
Mais cela ne fait pas apparaître "par magie" le trafic HTTP sur le port 80
au PC ayant l'adresse IP spécifique sur le LAN. Il nous faudrait aussi une
règle `pass out` spécifique et déterminer exactement sur quelle machine
nous voulons que les données arrivent.
À moins que vous n'ayez affaire à une exigence très spécifique, vous
n'aurez jamais besoin d'une telle règle dans votre jeu de règles !
Les fonctionnalités [uRPF (Unicast Reverse Path Forwardint)](https://www.openbsd.org/faq/pf/filter.html#urpf)
de PF protégeront votre réseau interne aussi bien avec un paramétrage
de base de NAT, avec l'option `nat-to` et une redirection avec l'option
`rdr-to`, PF gérera les paquets venant de l'intérieur vers l'extérieur
et vice-versa.
Le paramètre `all` est équivalent à l'écriture `from any to any`.
**Sans une direction explicitement déclarée, la règle par défaut est
`from any to any`**. Cette règle : `pass in on $p_lan proto udp to port dns`
se traduit par : `pass in on em3 inet proto udp from any to any port = 53`.
Il n'est pas non plus nécessaire d'utiliser `to any port dns`, la
partie `any` étant celle par défaut. Vous avez cependant besoin de
`to port dns`.
* `nat-to` et `rdr-to`
* Les options NAT **modifient soit l'adresse et le port source ou destination
des paquets associées à une connexion d'états**.
PF modifie l'adresse spécifié et/ou le port dans le paquet et recalcule
les sommes de contrôle IP, TCP et UDP nécessaires.
Une option `nat-to` spécifie **que les adresses IP ont été changées car
le paquet traverse l'interface donnée**.
Cette technique permet à une ou plusieurs adresses IP sur l'hôte traduisant
(le routeur OpenBSD) de prendre en charge le trafic réseau pour un ensemble
plus grand de machines sur le réseau **interne**, tel qu'un LAN.
L'option `nat-to` est habituellement appliqué à la sortie, signifiant
**redirigé depuis le réseau interne vers Internet**.
`nat-to` vers une adresse IP locale **n'est pas pris en charge**.
L'option `rdr-to` est appliquée généralement à l'entrée, signifiant
**redirigé depuis Internet vers le réseau interne**.
* Liste d'éléments et d'ensemble d'adresses et de ports
* Quand vous avez besoin de spécifier de multiples éléments, e.g. de
multiples numéros de ports, vous pouvez les séparer avec une espace
ou une virgule.
Tel que `port { 53 853 }` ou `port { 53, 853 }`.
Un ensemble d'adresses est spécifié en utilisant l'opérateur `-`.
e.g. `192.168.1.2 - 192.168.1.10` signifie toutes les adresses IP
de 192.168.1.2 à 192.168.1.10, incluant les deux.
Un ensemble de ports a de multiples paramètres ; regardez la page du
manuel [pf.conf](https://man.openbsd.org/pf.conf) et cherchez le texte
*"Ports and ranges of ports are specified using these operators"*.
{{< note warning >}}
Veuillez noter que chaque fois qu'un paquet traité par PF arrive ou part
d'une interface, les règles de filtrage sont évaluées dans un ordre séquentiel,
de la première à la dernière.
Concernant `block` et `pass`, **la dernière règle correspondante décide
de quelle action prise**.
Si aucune règle ne correspond au paquet, l'action par défaut est de laisser
passer le paquet sans créer d'état.
Pour `match`, les règles sont évaluées **chaque fois qu'elles correspondent**.
{{}}
### Résolution de nom de domaine ou d'hôte
Si vous décidez d'utiliser des noms d'hôtes et/ou des noms de domaines
dans votre paramétrage de PF, vous avez besoin de savoir que **la résolution
de tout nom de domaine ou d'hôte est faite au moment du chargement du jeu
de règles**.
Cela signifie que quand l'adresse IP d'un hôte ou d'un nom de domaine change,
le jeu de règles **doit être rechargé pour que le changement soit pris en
compte par le noyau**.
Il n'est pas possible qu'à chaque fois qu'une règle s'applique, pour un
nom d'hôte ou de domaine listé, que PF fasse une nouvelle requête DNS pour
ce nom d'hôte ou de domaine particulier.
La requête DNS s'effectue seulement lors du chargement du jeu de règles.
Cela signifie aussi que vous devez vous assurer que le serveur DNS que vous
utiliser soit actif et fonctionnel **avant** que PF ne démarre, autrement
PF échouera à charger le jeu de règles car il ne peut résoudre le nom d'
hôte ou de domaine.
Sur OpenBSD, PF démarre **avant** Unbound ou tout autre service DNS installé,
ce qui est la bonne manière de faire d'un point de vue de la sécurité.
Je vous conseille d'éviter l'utilisation de noms d'hôtes ou de noms de
domaines lorsque vous utilisez les règles PF et de privilégier les adresses
IP, si possible.
Il est possible d'utiliser les noms d'hôtes et noms de domaines, mais
l'adressage d'IP directement est de loin le plus facile et le plus sûr.
### Un jeu de règles
C'est une bonne idée de tester votre jeu de règles sur une machine de test.
Il y a presque toujours plus d'une manière de faire pour arriver au même
résultat. Selon mon humble avis, la meilleure manière est celle qui vous
permet d'être le plus clair (i.e. facile à comprendre).
{{< note warning >}}
Ne jamais écrire de nouveaux jeux de règles sur un dispositif à
distance où vous êtes actif à moins de savoir ce que vous faites.
Être déconnecté d'une machine à distance n'est jamais agréable.
{{}}
Essayez de trouver comment vous pouvez faire en sorte que vos règles soient
aussi claires et simples que possible, en utilisant les valeurs par
défaut, quand c'est possible.
N'ayez pas peur de spécifier des critères qui rendent les règles plus
claires à comprendre, quand bien même ils sont identiques aux valeurs par
défaut.
Une valeur par défaut peut être `any to any`, et vous pouvez laisser cela
de côté, mais il serait plus facile de comprendre une règle particulière
quand il est écrit `any to any` textuellement dans le fichier de configuration.
Vous pouvez toujours analyser le jeu de règles et vérifier les erreurs
sans qu'il soit déployé avec la commande `pfctl -nf /etc/pf.conf`.
Une fois que vous avez chargé le jeu de règles avec la commande `pfctl -f /etc/pf.conf`,
vous pouvez voir comment le jeu de règles a été traduit par PF avec la
commande `pfctl -s rules`, que je vous conseille d'utiliser régulièrement.
Je préfère organiser mon jeu de règles par section et commentaires, je
ferais ainsi dans cet exemple.
Utilisez votre éditeur de texte favori et ouvrez le fichier `/etc/pf.conf`.
En premier, nous paramétrons quelques macros pour mieux se souvenir quelles
interfaces réseaux nous utilisons.
Utiliser des macros pour les interfaces réseaux rend aussi plus facile le
changement du nom du pilote de la carte si vous achetez une nouvelle carte,
ou de multiples nouvelles cartes.
```
#---------------------------------#
# Macros
#---------------------------------#
ext_if="em0" # Interface externe connectée au modem du FAI (Internet).
g_lan="em1" # LAN PC Adultes
c_lan="em2" # LAN PC Enfants
p_lan="em3" # LAN Publique.
```
Ensuite, nous paramétrons une table pour les adresses IP non routable.
Nous faisons cela, car une mauvaise configuration réseau courante est
celle qui permet du trafic avec des adresses non routable vers Internet.
Nous utiliserons la table dans notre jeu de règles afin de bloquer
tout essai d'initier un contact avec les adresses non routable au-travers
de l'interface externe du routeur.
```
#---------------------------------#
# Tables
#---------------------------------#
# Ceci est une table d'adresses IP privées non routables.
table { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 \
172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \
192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 \
203.0.113.0/24 }
```
{{< note warning >}}
Veuillez noter que les macros et les tables sont toujours écrites en début
du fichier `/etc/pf.conf`.
{{}}
Alors, commençons avec une **politique de blocage par défaut** et
activons une série de fonctionnalités de protection.
```
#---------------------------------#
# Protect and block by default
#---------------------------------#
set skip on lo0
# Protection vs l'usurpation d'adresses sur toutes les interfaces réseaux.
block in from no-route
block in quick from urpf-failed
# Bloquage des adresses privées non routable.
# Utilisation du paramétre "quick" pour que cette règle soit la dernière traversée.
block in quick on $ext_if from to any
block return out quick on $ext_if from any to
# Bloquage par défaut de tout trafic sur toutes les interfaces réseaux.
block return in on { $g_lan $c_lan $dmz }
# Bloquage par défaut de tout trafic sur l'interface reliée à Internet
# avec journalisation
block drop in log on $ext_if
# Autoriser ICMP.
match in on $ext_if inet proto icmp icmp-type {echoreq } tag ICMP_IN
block drop in on $ext_if proto icmp
pass in proto icmp tagged ICMP_IN max-pkt-rate 100/10
# Autoriser le routeur à accéder à Internet, au-travers de son interface réseau dédiée
pass out inet from $ext_if
```
Les adresses IP contenues dans la macro `martians` constituent les adresses
référencées dans la [RFC1918](https://tools.ietf.org/html/rfc1918) qui ne
doivent pas être utilisées sur Internet.
Le trafic venant ou allant vers de telles adresses doit être abandonné
sur l'interface externe du routeur.
Dans les précédentes versions de ce guide (avant la version 1.5.0), j'avais
l'habitude d'utiliser l'instruction [scrub](https://man.openbsd.org/pf.conf#Scrub)
dans le paramétrage ci-dessus, toutefois après avoir consulté l'équipe
OpenBSD avec [Henning Brauer](http://henningbrauer.com/) (Merci à Henning !)
et fais de plus amples recherches, j'ai décidé de la supprimer car elle
ne traite que des cas très spécifiques (veuillez lire la documentation).
Vous aurez besoin de la règle `scrub` seulement si un hôte sur votre réseau
génére des paquets fragmentés avec le drapeau "dont-fragment".
Le comportement par défaut de PF sans la règle `scrub` est mieux adapté
à un usage général.
La [FAQ](https://www.openbsd.org/faq/pf/example1.html) d'OpenBSD contient
un exemple de paramétrage pour un routeur très basique, avec certaines
valeurs spécifiques pour `scrub`, mais ma recommandation est d'utiliser
seulement `scrub` là où vous savez en avoir besoin.
Si vous n'en avez pas besoin, insérez-la dans la configuration après la
règle `set skip` pour l'interface de bouclage locale, tel que :
```
set skip on lo0
match in all scrub
```
Et ensuite ajoutez les paramètres à la règle `scrub` dont vous avez besoin.
J'utilisais aussi la règle [antispoof](https://man.openbsd.org/pf.conf#Blocking_Spoofed_Traffic)
suivante dans la section de protection contre l'usurpation :
```
antispoof quick for { $g_lan $c_lan $dmz }
```
J'ai depuis supprimé la règle `antispoof` puisque la fonctionnalité
[uRPF (Unicast Reverse Path Forwarding)](https://www.openbsd.org/faq/pf/filter.html#urpf)
que PF fournit a la même fonctionnalité, et en tant que tel nous n'en avons
plus besoin, à la place nous utilisons juste la règle `block in quick from urpf-failed`.
L'information suivante à-propos du critère `antispoof` est gardée à des
fins d'éducation.
L'usurpation est lorsque quelqu'un fabrique une adresse IP. Le critère
`antispoof` s'étend à un ensemble de règles de filtrage qui empêcheront
tout trafic avec une adresse IP source du réseau (directement connecté
à l'interface spécifiée) entrant sur le système par une autre interface.
Cela est parfois appelé "bleeding over" ou "bleeding through".
La directive `antispoof` est traduite par PF par ce qui suit :
```
block drop in quick on ! em1 inet from 192.168.1.0/24 to any
block drop in quick inet from 192.168.1.1 to any
block drop in quick on ! em2 inet from 192.168.2.0/24 to any
block drop in quick inet from 192.168.2.1 to any
block drop in quick on ! em3 inet from 192.168.3.0/24 to any
block drop in quick inet from 192.168.3.1 to any
```
Si nous prenons, e.g., la règle `block drop in quick on ! em1 inet from 192.168.1.0/24 to any`
de l'interface réseau `em1` qui signifie alors : *bloque tout trafic venant
du réseau ayant une adresse IP comprise entre 192.168.1.1 et 192.168.1.255,
qui n'est pas originaire depuis l'interface em1 elle-même, et qui va ailleurs*.
Puisque l'interface `em1` est l'interface réseau en charge de toutes les
adresses IP dans cet ensemble spécifique, alors aucun trafic avec de telles
adresses IP ne pourra être originaire de toute autre interface réseau.
{{< note warning >}}
L'utilisation d'`antispoof` doit être **restreinte** aux interfaces qui
ont une adresse IP assignée, ce qui signifie que si vous avez des interfaces
réseaux inutilisées, ou des ports d'une interface réseau, assurez-vous
d'assigner une adresse IP à chacune ou de ne pas les inclure dans l'option
`antispoof`.
{{}}
Ainsi que je l'ai mentionnée, j'ai supprimé la règle `antispoof` et nous
utiliserons à la place la vérification stricte d'uRPF.
Lorsqu'un paquet passe dans la vérification d'uRPF, l'adresse IP source
du paquet est recherchée dans la table de routage.
Si l'interface de sortie est trouvée dans la table de routage et que l'entrée
est la même que l'interface du paquet qui vient juste d'entrer, alors la
vérification d'uRPF autorise.
Autrement, il est possible que le paquet ait son adresse IP source usurpée
ainsi il sera bloqué.
Nous allons permettre [ICMP](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol)
dans notre paramétrage, quand bien même des administrateurs réseaux bloquent
complètement ICMP.
La plupart des personnes bloquent complètement ICMP à cause d'actions
injustifiées telles que les attaques par découverte de réseaux, les canaux
de communication, le [ping sweep](https://en.wikipedia.org/wiki/Ping_sweep),
le [ping flood](https://fr.wikipedia.org/wiki/Ping_flood), le [tunnel d'ICMP](https://en.wikipedia.org/wiki/ICMP_tunnel),
et la [redirection d'ICMP](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#Signification_du_type_5_(redirection)).
Toutefois, ICMP est bien plus que répondre à des ping.
Si nous bloquons complètement ICMP, les diagnostics, la fiabilité, et la
performance réseau peuvent être défectueuses puisque des mécanismes importants
sont désactivés lorsque le protocole ICMP est restreint.
Voici certaines raisons pour lesquelles ICMP ne devrait pas être bloqué :
- La découverte Path MTU (PMTUD) est utilisée pour déterminer la taille
maximale de l'unité de transmission pour les dispositifs réseau qui relient
la source et la destination afin d'éviter la fragmentation IP.
TCP dépend des paquets ICMP de type 3 code 4 pour "Path MTU Discovery".
ICMP type 3 code 4 et la taille maximale des paquets sont retournés quand
un paquet excède la taille MTU d'un dispositif réseau connecté.
Quand les messages ICMP sont bloqués, le système de destination requête
continuellement des paquets non délivrés et le système source continue à
les renvoyer indéfiniment mais en vain.
Ce comportement peut avoir pour résultat un [trou noir](https://fr.wikipedia.org/wiki/Black_hole_(informatique))
ICMP (des connexions IP congestionnées et des transmissions cassées).
- Time to live (TTL) définit le temps de vie d'un paquet de données.
Un réseau où ICMP est bloqué ne recevra pas le message de type 11, temps
écoulé, code 0, temps écoulé dans le transit des messages d'erreur.
Cela signifie que l'hôte source ne sera pas notifié pour augmenter le temps
de vie des données afin d'atteindre l'hôte de destination, si le datagram
échoue à atteindre l'hôte de destination.
- Une mauvaise performance du fait de bloquer la redirection ICMP.
La redirection ICMP est utilisée par un routeur pour informer un hôte d'un
chemin direct entre l'hôte source et celui de destination.
Cela réduit le nombre de saut que les données ont à faire pour atteindre
la destination.
Avec ICMP bloqué, l'hôte ne fera jamais attention à la route la plus optimale
vers la destination.
Dans le paramétrage ci-dessus, nous permettons ICMP, mais nous mettons une
"limite de taux" du nombre de requêtes ping auxquelles le routeur répondra.
Avec le critère `max-pkt-rate 100/10`, le routeur arrêtera de répondre aux
ping si nous en avons plus de 100 en 10 secondes.
{{< note info >}}
Si vous souhaitez toujours bloquer complètement ICMP pour une raison quelconque,
il suffit de supprimer les 3 règles après le commentaire "Allow ICMP".
{{}}
Maintenant paramétrons le segment LAN pour les adultes de la maison.
```
#---------------------------------#
# Paramétrage du réseau LAN adulte
#---------------------------------#
# Autoriser tout ordinateur ou dispositif sur le LAN adulte à envoyer des
# paquets de données entrants dans l'interface réseau. Cela signifie que
# tout ordinateur attaché à cette interface réseau peut envoyer des données
# partout, i.e. sur Internet ou tout ordinateur attaché au routeur.
pass in on $g_lan
# Toujours bloquer les requêtes DNS non adressées à notre serveur DNS.
block return in quick on $g_lan proto { udp tcp } to ! $g_lan port { 53 853 }
# J'ai une imprimante réseau et je ne veux pas qu'elle "téléphone maison".
# L'imprimange réseau à l'adresse IP 192.168.1.8.
block in quick on $g_lan from 192.168.1.8
# Autoriser les paquets de données venant du routeur à sortir par l'interface
# réseau vers les ordinateurs et dispositifs attachés à l'interface du
# réseau Adultes.
# Sans cela nous ne pouvons même pas pingués les ordinateurs attachés à
# l'interface du réseau Adultes depuis le routeur lui-même.
pass out on $g_lan inet keep state
```
Dans cet exemple, j'ai une imprimante réseau attachée au réseau des adultes
et je ne veux pas qu'elle accéde à Internet ou ailleurs (juste en cas où
il y aurait une sorte de micrologiciel espion).
Nous le faisons en disant : *bloque toutes les données entrantes sur em1
venant de l'adresse IP 192.168.1.8 allant vers toute adresse IP*.
De plus, nous nous assurons que toutes les requêtes DNS sur les ports 53
(DNS régulier) et 853 (DNS sur TLS) soient toujours bloquées si elles ne
viennent pas de notre serveur DNS.
{{< note info >}}
Avant, j'utilisais la redirection du trafic sur le port 53 non adressé à
notre serveur DNS vers notre serveur DNS.
Je faisais cela parce que nous bloquions toute requête DNS sur le port 53,
soit avec `return` ou `drop`, la requête prenant un délai sur le client,
ce qui avait pour conséquence que beaucoup de clients obtenaient un délai
sur la réponse.
Depuis j'ai changé cela en block parce que je crois que c'est une meilleure
approche.
Tous les clients DNS ont besoin de réaliser que la communication sur le
port 53 est bloqué, à moins qu'elle ne soit adressée à notre serveur DNS.
C'est aussi important quand nous avons des problèmes sur notre réseau.
Si nous avons une réponse redirigée vers notre serveur DNS, nous pourrions
ne pas être averti que nous avons été redirigé.
{{}}
{{< note info >}}
DNS utilise en premier UDP (User Datagram Protocol) sur le port 53 pour
servir les requêtes, mais quand la longueur de la réponse excède 512 bits
et que le client et le serveur prennent en charge EDNS, des paquets UDP
plus grands sont utilisés.
Toutefois, la requête est envoyée en utilisant TCP (Transmission Control Protocol).
Certaines implémentations de résolveurs DNS utilisent TCP pour toutes les
requêtes.
Ainsi nous avons besoin des deux protocoles UDP et TCP dans la règle pour
le port 53.
{{}}
Le réseau LAN pour les enfants est très similaire.
```
#---------------------------------#
# Paramétrage LAN enfants
#---------------------------------#
# Autoriser tout PC du LAN Enfant à envoyer des données au-travers du port
# de l'interface réseau
pass in on $c_lan
# Toujours bloquer les requêtes DNS qui ne sont pas adressées à notre
# serveur DNS.
block return in quick on $c_lan proto { udp tcp} to ! $c_lan port { 53 853 }
# Autorise les paquets de données à passer venant du routeur au-travers
# l'interface réseau vers les ordinateurs ou dispositifs attachés au
# LAN Enfants.
# Sans cela, nous ne pourrions même pas pingués les ordinateurs depuis
# le routeur lui-même
pass out on $c_lan inet keep state
```
Actuellement les deux réseaux Adultes et Enfants ont le même accès à Internet.
Un paramétrage plus restrictif est mentionné dans le chapitre
"{{< anchor "Liste Blanche pour enfants" "une liste blanche pour les enfants" >}}".
Occupons nous alors de la DMZ, i.e. de l'interface réseau qui répond publiquement
au serveur web.
Puisque nous avons un serveur web publique, nous allons définir un certain
nombre de restrictions.
Si le serveur web est compromis, l'intrus aura du mal à trouver ce qui est
localisé dans notre réseau interne.
Nous bloquons tous les accès excepté le DHCP, afin que le serveur web
ait une adresse IP depuis notre routeur, et alors d'ouvrir **seulement
manuellement** certaines choses pour quand nous avons besoin de mettre à
jour la machine ou quoi que ce soit d'autres.
J'ai commenté les options dont nous avons besoins, quand nous avons besoin
de telles choses, laissant les parties restreintes actives.
Quand vous aurez besoin de mettre à jour le serveur, ouvrez l'accès DNS
et l'accès général à Internet.
{{< note info >}}
Plutôt que changer manuellement le jeu de règles à chaque fois où nous avons
besoin de mettre à jour le serveur web, nous pouvons aussi utiliser une
[ancre](https://man.openbsd.org/pf.conf#ANCHORS), mais par esprit de
simplification, nous ne ferons pas cela ici.
{{}}
```
#---------------------------------#
# Paramétrage DMZ
#---------------------------------#
# Autorise tout ordinateur ou dispositif attaché à l'interface réseau DMZ
# à obtenir une adresse IP venant du DHCP depuis le routeur
pass in on $dmz inet proto udp from any port 67
# Autorise tout ordinateur ou dispositif attaché à l'interface réseau DMZ
# à faire des requêtes DNS. (décommentez si besoin)
#pass in on $dmz inet proto udp from any port 53
# Toujours bloquer les requêtes DNS non adressées à notre serveur DNS.
block return in quick on $dmz proto { udp tcp} to ! $dmz port { 53 853 }
# Pour autoriser tout ordinateur attaché à l'interface réseau DMZ à accéder
# à Internet, décommentez la ligne ci-dessous.
# (Cela est pertinent pour les màj)
#pass in on $dmz inet
# No matter what, we do not want the DMZ segment to reach any of the other
# network segments so we explicitly use a block last.
#
# We have several options. If we use this:
#
# block drop in on $dmz to 192.168/16
#
# Then we block for all subnets, but this also means that the computers
# attached to the DMZ NIC cannot do DNS queries when they need to be upgraded.
#
# In my opinion it is much better to be explicit and block the specific
# segments we want blocked.
#
# Bloque les ordinateurs depuis l'interface réseau DMZ essayant d'atteindre
# les autres sur les deux autres segments réseaux
block drop in on $dmz to { $g_lan:network $c_lan:network }
# En dernier, autorisons les paquets à sortir s'ils viennent de l'interface
# réseau DMZ vers les ordinateurs attachés, autrement pas de "discussion".
# Sans cela nous ne pouvons même pas pinguer les ordinateurs attachés à
# l'interface réseau DMZ depuis le routeur lui-même
pass out on $dmz inet keep state
```
Maintenant, occupons nous de la NAT.
C'est là où le routeur route les paquets venant d'un segment du réseau
vers un autre, dans le cas spécifique venant de notre réseau interne vers
Internet, et alors toute réponse venant d'Internet, à destination de
l'initiateur de la transmission.
Je préfère le paramètre `:network` qui traduit le(s) réseau(x)
attaché(s) à l'interface, et je préfère être spécifique avec une règle
pour chaque segment concerné.
```
#---------------------------------#
# NAT
#---------------------------------#
pass out on $ext_if inet from $g_lan:network to any nat-to ($ext_if)
pass out on $ext_if inet from $c_lan:network to any nat-to ($ext_if)
pass out on $ext_if inet from $dmz:network to any nat-to ($ext_if)
```
PF gardera une trace de tout le trafic, et quand, e.g. un navigateur web sur
le LAN Adultes demandera une page web de certains sites sur Internet,
la réponse venant du serveur web depuis Internet sera routé au-travers de
l'interface externe vers l'interface interne du LAN Adultes, et alors
directement vers le PC qui a initié la requête.
Enfin, occupons-nous de la partie relative à la redirection dans notre
jeu de règles.
C'est là où nous permettons le trafic venant d'Internet vers notre serveur
web publique sur l'interface réseau DMZ.
Vous devriez, bien sûr, laisser cette partie si vous n'avez pas de serveurs
publiques qui nécessitent de redirection.
Dans cet exemple, j'ai seulement permis le trafic IPv4.
```
#---------------------------------#
# Redirects
#---------------------------------#
# Our web server - let the Internet access it.
pass in on $ext_if inet proto tcp to $ext_if port { 80 443 } rdr-to 192.168.3.2
```
{{< note warning >}}
La redirection arrive toujours en dernier dans le jeu de règles !
{{}}
C'est tout concernant le paramétrage basique de nos règles filtrantes.
#### Une liste blanche pour les enfants
Si vous voulez bloquer tout Internet pour les enfants, exceptés peut être
quelques sites web ou certains serveurs de jeux, vous avez besoin de
connaître quelles adresses IP ces services ont et de créer une liste
blanche utilisant ces adresses IP.
Si c'est un simple site web avec une adresse IP unique, c'est très facile
et vous pouvez le faire avec cette règle placée en dernier dans le bloc
pour enfants (vous devez remplacer la partie x.x.x.x avec l'adresse IP
pertinente) :
```
#---------------------------------#
# Childrens LAN Setup
#---------------------------------#
# Allow any computer or device attached to the childrens NIC to get an IP
# address from DHCP on the router.
pass in on $c_lan inet proto udp from any port 67
# Allow any computer or device attached to the childrens NIC to make DNS
# queries.
pass in on $c_lan inet proto udp from any port 53
# Always block DNS queries not addressed to our DNS server.
block return in quick on $c_lan proto { udp tcp} to ! $c_lan port { 53 853 }
# Then allow any computer or device attached on the childrens LAN to reach
# the IP address x.x.x.x only.
pass in on $c_lan to x.x.x.x
```
Si le site web a de multiples adresses IP, nous devons comprendre lesquelles.
Parfois une requête de nom de domaine peut révéler toutes les adresses IP
concernées en une fois.
D'autres fois, nous avons besoin de répéter de multiples fois les requêtes
à différentes intervalles de la journée avant d'obtenir l'ensemble complet
des adresses IP.
Vous pouvez faire cela en mettant en place un script automatisé.
Parfois, nous aurons besoin de contacter l'entreprise en question et de
demander si nous pouvons avec l'ensemble des adresses IP pour notre liste
blanche (certaines compagnies publient publiquement l'information, d'autres
refusent de livrer l'information par peur d'un usage malicieux).
Une fois que vous avez déterminé quel est l'ensemble d'adresses IP, vous
pouvez faire une `table` PF pour l'utiliser.
Dans cet exemple, nous ajoutons une nouvelle table dans la section table
des règles et nous changeons les paramètres des règles pour enfants.
```
#---------------------------------#
# Tables
#---------------------------------#
…
# Whitelist for the children.
table { x.x.x.x y.y.y.y z.z.z.z }
```
Et ensuite dans la section pour enfants, changez :
```
pass in on $c_lan to x.x.x.x
```
en :
```
pass in on $c_lan to
```
Il n'est pas toujours possible d'avoir toutes les adresses IP dans une
liste blanche en une fois, mais en surveillant le réseau, en utilisant e.g.
[tcpdump](https://man.openbsd.org/tcpdump), quand le jeu essaye d’accéder
au serveur, vous pouvez établir une liste, bit après bit.
J'ai fait cela avec les serveurs de connexion Mojan et Minecraft et de
multiples autres serveurs de jeux.
##### Utilisation d'une table persistante
Une autre approche pour collecter les IP est d'utiliser une [table persistante](https://man.openbsd.org/pf.conf#TABLES)
en combinaison avec `/etc/rc.local` et les requêtes de noms de domaine.
`/etc/rc.local` est seulement exécuté **après** que PF soit démarré ainsi
les problèmes de résolution de DNS n'entraîneront pas des problèmes pour
PF.
Si vous souhaitez utiliser la solution des tables persistantes, vous pouvez
le faire en ajoutant une table persistante dans la section des tables
dans `/etc/pf.conf` :
```
table persist
```
Dans la section pour enfants, nous avons besoin de passer les données
qui viennent de la liste blanche ci-dessus :
```
pass in on $c_lan to
```
Alors, dans `/etc/rc.local`, nous pouvons ajouter la commande suivante :
```
pfctl -t whitelist -T add example.com
```
Où `example.com` est le domaine que PF doit chercher.
Quand vos enfants ne peuvent pas avoir accès parce que l'adresse IP valide
pourrait avoir changé, vous pouvez vous connecter au pare-feu et alors
mettre à jour manuellement la table avec plus d'adresses IP en exécutant
la commande :
```
pfctl -t whitelist -T add examples.com
```
Si vous voulez voir ce qui a été ajouté à cette liste, vous pouvez faire
ceci :
```
# pfctl -t whitelist -T show
74.6.143.25
74.6.143.26
74.6.231.20
74.6.231.21
98.137.11.163
98.137.11.164
216.58.208.110
2001:4998:24:120d::1:0
2001:4998:24:120d::1:1
2001:4998:44:3507::8000
2001:4998:44:3507::8001
2001:4998:124:1507::f000
2001:4998:124:1507::f001
2a00:1450:400e:80e::200e
```
Éventuellement, vous pouvez ajouter toutes les adresses IP que vous collectez
(avant qu'elles ne soient purgées) dans un fichier physique afin que l'option
`persist` prenne en entrée ce fichier, tel que :
```
table persist file "/etc/pf-whitelist.txt"
```
{{< note info >}}
Le fichier ne devra pas avoir d'adresses IP ajoutées en utilisant
l'option `add` à `pfctl`.
Une table persistante réside soit en mémoire, soit dans un fichier, mais
l'option `add` ne peut écrire sur le disque, seulement dans la mémoire.
Une table persistante depuis un fichier est ce dont vous avez besoin afin
de l'éditer manuellement depuis un éditeur de texte.
{{}}
### Chargement des règles
Une fois que vous avez fini de paramétrer votre jeu de règles, vous pouvez
le tester avec :
```
# pfctl -nf /etc/pf.conf
```
Si tout est bon, chargez votre jeu de règles en supprimant l'option `-n` :
```
# pfctl -f /etc/pf.conf
```
Regardez le résultat traduit avec :
```
# pfctl -s rules
```
### Journalisation et Monitoring
Ceci est un exemple de sortie venant du journal de PF des essais bloqués
accédant à l'interface externe, selon mon paramétrage. J'ai nettoyé la
sortie et supprimé quelques données spécifiques, et bien sûr 0.0.0.0 n'est
pas mon adresse IP publique, mais vous savez déjà cela ;)
```
# tcpdump -n -e -ttt -r /var/log/pflog
23:11:12 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.3422: S 1501043655:1501043655(0) win 1024
23:11:12 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.3481: S 311078394:311078394(0) win 1024
23:11:31 rule 14/(match) block in on em0: 176.214.44.229.25197 > 0.0.0.0.23: S 2084440900:2084440900(0) win 33620
23:11:33 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.3431: S 2774981044:2774981044(0) win 1024
23:11:43 rule 14/(match) block in on em0: 81.68.114.52.17191 > 0.0.0.0.23: S 1346864438:1346864438(0) win 26375
23:12:08 rule 14/(match) block in on em0: 193.27.229.26.53865 > 0.0.0.0.443: S 1057596009:1057596009(0) win 1024
23:12:31 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.4186: S 1233742605:1233742605(0) win 1024
23:12:44 rule 14/(match) block in on em0: 74.120.14.70.65509 > 0.0.0.0.9125: S 1836577847:1836577847(0) win 1024 [tos 0x20]
23:12:44 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.4128: S 2112968453:2112968453(0) win 1024
23:13:15 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.3669: S 3627248539:3627248539(0) win 1024
23:13:19 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.3654: S 3889665614:3889665614(0) win 1024
23:13:29 rule 14/(match) block in on em0: 45.129.33.129.42239 > 0.0.0.0.4997: S 2249816896:2249816896(0) win 1024
23:13:37 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.3612: S 3797528151:3797528151(0) win 1024
23:14:03 rule 14/(match) block in on em0: 190.207.89.17.64372 > 0.0.0.0.445: S 1097568353:1097568353(0) win 8192 (DF)
23:14:15 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.4219: S 2834775769:2834775769(0) win 1024
23:14:39 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.3702: S 1855726637:1855726637(0) win 1024
23:14:39 rule 14/(match) block in on em0: 45.129.33.4.45980 > 0.0.0.0.4210: S 3052103070:3052103070(0) win 1024
```
Comme vous pouvez le voir, il est un peu occupé, d'autant que je n'ai rien
en cours d'exécution qui soit publiquement sur Internet dans ce paramétrage.
Vous pouvez aussi monitorer PF en temps réel avec :
```
# tcpdump -n -e -ttt -i pflog0
```
## DNS
[DNS (Domain Name Service)](https://fr.wikipedia.org/wiki/Domain_Name_System)
est utilisé pour traduire un nom de domaine dans une adresse IP ou vice-versa.
Par exemple, quand vous écrivez [wikipedia.org](https://wikipedia.org/)
dans la barre d'adresse de votre navigateur web, un serveur DNS faisant
autorité traduit le nom de domaine "wikipedia.org" en une adresse IPv4,
telle que 91.198.174.192, et/ou une adresse IPv6, telle que 2620:0:862:ed1a::1.
DNS est aussi utilisé, en plus d'autres choses, pour stocker des informations
sur les serveurs de messagerie appartenant à un nom de domaine particulier,
le cas échéant.
Si vous utilisez un système d'exploitation de type UNIX, vous pouvez
démarrer un terminal et essayer de faire une recherche manuelle de nom
de domaine avec `host` :
```
$ host wikipedia.org
wikipedia.org has address 91.198.174.192
wikipedia.org has IPv6 address 2620:0:862:ed1a::1
wikipedia.org mail is handled by 10 mx1001.wikimedia.org.
wikipedia.org mail is handled by 50 mx2001.wikimedia.org.
```
{{< note info >}}
Si `host` n'est pas installé, ce qui dépend de votre plateforme, vous aurez
besoin d'installer [bind](https://www.isc.org/bind/) ou `dnsutils`.
Vous pouvez aussi utiliser quelque chose comme [dig](https://man.openbsd.org/dig),
qui vient de [bind](https://www.isc.org/bind/), ou [drill](https://linux.die.net/man/1/drill)
venant de [ldns](https://nlnetlabs.nl/projects/ldns/about/).
{{}}
La liste qui suit décrit certains des termes associés à DNS :
- `Forward DNS`
- Correspondance des noms d'hôtes ou de domaines avec les adresses IP.
- `Reverse DNS`
- Correspondance des adresses IP avec les noms d'hôtes ou de domaines.
- `Resolver`
- Un système par lequel une machine requiert un serveur de nom pour
la zone d'information, i.e. un autre nom pour "Serveur DNS".
- `Root zone`
- Le début de la hiérarchie des zones Internet. Toutes les zones sont
sous la [zone racine](https://en.wikipedia.org/wiki/DNS_root_zone),
similaire à ce que sont tous les fichiers dans un système de fichier
sous la hiérarchie racine /.
Ceci est un exemple de zone :
- `.` (un point) est la manière dont la zone racine est habituellement
référée dans la documentation.
- `org.` est le [TLD (Top-Level Domain)](https://fr.wikipedia.org/wiki/Domaine_de_premier_niveau)
sous la zone root.
- `wikipedia.org.` est la zone sous le TLD `org.`.
- `1.168.192.in-addr.arpa` est la zone référençant toutes les adresses IP
qui sont dans l'espace d'adresse IP `192.168.1.*`.
Quand un ordinateur sur Internet a besoin de résoudre un nom de domaine,
le résolveur découpe le nom dans ses labels de la droite vers la gauche.
Le premier composant, le TLD, est demandé en utilisant un serveur racine
pour obtenir le serveur faisant autorité responsable.
Les requêtes pour chaque label retournent des serveurs de noms plus
spécifiques jusqu'à ce qu'un serveur de noms renvoie la réponse à la
requête originale.
Même si un serveur DNS local peut implémenter ses propres serveurs de noms
racines privés, le terme "serveur racine de noms" est utilisé pour décrire
[les 13 serveur racines de noms bien connus](https://fr.wikipedia.org/wiki/Serveur_racine_du_DNS#Les_serveurs_racine_du_DNS)
qui mettent en œuvre le domaine de l'espace racine des noms pour la mise
en œuvre mondiale officielle du système de noms de domaine d'Internet.
Les résolveurs utilisent un petit fichier nommé `root.hints` de 3 Ko,
publié par [Internic](https://fr.wikipedia.org/wiki/InterNIC) pour amorcer
cette liste initiale d'adresses des serveurs racines.
Pour beaucoup de logiciels, incluant Unbound, cette liste est intégrée à
l'intérieur du logiciel.
Sur la [base de données de la zone racine](https://www.iana.org/domains/root/db),
vous pouvez chercher les détails de délégation des domaines TLD, incluant
des TLD tels que .com, .org, et des TLD ayant des codes de pays, tels que
.uk, .de.
{{< note info >}}
Puisque vous pouvez chercher les détails de délégation des domaines TLD,
vous pourriez vous attendre à ce qu'il soit possible d'aller en profondeur
et de chercher actuellement pour chaque domaine un serveur de domaine
en particulier qui a enregistré dans sa base de données.
Puisque nous avons, pour l'exemple, pris une liste des serveurs de noms
TLD responsables pour le TLD [.dk](https://www.iana.org/domains/root/db/dk.html),
nous pourrions nous attendre à ce qu'il soit possible d'interroger l'un de
ces serveurs de noms listés pour l'ensemble de la base de données des
serveurs faisant autorité, puis d'interroger l'un d'entre eux pour tous
les domaines enregistrés dans sa base de données.
Mais ce n'est pas comme cela que fonctionne DNS.
Il y a seulement deux manières pour obtenir la cartographie complète des
serveurs DNS.
Soit vous avez accès aux fichiers de la zone concernée, soit vous avez
besoin de construire physiquement une base de donnée en examinant le trafic
DNS au-travers un serveur DNS récursif et alors de reconstituer les données
de la zone à partir des données recueillies, jusqu'à ce que vous obteniez
tout, ce qui est très peu probable.
{{}}
Il y a deux types de configuration de serveur DNS :
- `Autorité`
- [Les serveurs de noms faisant autorité] publie les adresses pour les
domaines sous leur contrôle. Ces serveurs sont listés au début de la
chaîne d'autorité pour leurs domaines respectifs, et sont capables de
fournir une réponse définitive.
Les serveurs de noms faisant autorité peuvent être les serveurs de noms
primaires, connus aussi en tant que serveurs maîtres, i.e. ils contiennent
le jeu original des données, ou être des serveurs de noms secondaires
ou esclaves, contenant des copies des données habituellement obtenues
par synchronisation directe avec le serveur primaire.
Un serveur de nom faisant autorité est un serveur de nom qui donne
seulement des réponses aux requêtes DNS venant de données qui ont été
configurées par une source originale, par exemple, l'administrateur
de domaine.
Chaque zone DNS doit être assignée à un ensemble de serveurs de noms
faisant autorité.
Cet ensemble de serveurs est enregistré dans la zone de domaine parente
des enregistrements du serveur de noms (NS).
Un serveur faisant autorité indique son statut de fournisseur de
réponses définitives, considérées comme faisant autorité, en posant
un drapeau de protocole, appelé bit "Authoritative Answer" (AA), dans
ses réponses.
Vous pouvez utiliser un outil réseau, tel que [dig](https://man.openbsd.org/dig)
ou [drill](https://linux.die.net/man/1/drill) pour interroger un nom
de domaine ; l'outil répondra avec un drapeau faisant autorité qui
révèle si le serveur DNS vous avez interrogé est celui qui fait autorité.
- `Récursif`
- [Les serveurs récursifs](https://fr.wikipedia.org/wiki/Domain_Name_System)
parfois appelés "DNS caches" ou "serveurs de noms de cache seulement"
fournissent la résolution de noms DNS pour les applications, en relayant
les requêtes de l'application cliente vers la chaîne des serveurs de
noms faisant autorité afin de résoudre pleinement un nom de domaine.
(Typiquement) ils mettent en cache le résultat pour répondre a de
futures requêtes potentielles dans une certaine période de temps avant
expiration.
La plupart des utilisateurs d'Internet accèdent à un serveur DNS récursif
publique fournit par leur FAI ou un fournisseur de service DNS publique.
En théorie, les serveurs de noms faisant autorité sont suffisant pour
opérer sur Internet.
Toutefois, avec seulement les serveurs de noms faisant autorité opérant,
chaque requête DNS doit démarrer avec des requêtes successives à la
zone racine du système de nom de domaine et chaque utilisateur système
devrait avoir à implémenter un logiciel résolveur capable d'opérations
de résolution.
Pour améliorer l'efficacité, réduire le trafic DNS sur Internet, et
augmenter la performance des applications utilisateurs, le système de
noms de domaine prend en charge les résolveurs récursifs.
Une requête d'un DNS récursif est celle pour laquelle un serveur DNS
répond complètement à la requête en interrogeant d'autres serveurs
de noms, selon ses besoins.
Un serveur de noms peut être à la fois faisant autorité et récursif, mais
il n'est pas recommandé de combiner la configuration des deux types.
Pour être en mesure d'effectuer leur travail, les serveurs faisant autorité
doivent être disponibles à tous les clients, tout le temps.
D'un autre côté, étant donné que la requête récursive prend plus de temps
qu'une réponse faisant autorité, les serveurs récursifs devraient être
restreints à un nombre de clients seulement, car ils sont enclins à des
[attaques par déni de service distribué (DDoS)](https://fr.wikipedia.org/wiki/Attaque_par_d%C3%A9ni_de_service).
{{< note info >}}
Si besoin, je vous recommande de lire "How DNS Works" du
[chapitre 6 du Guide de l'Administrateur Réseau Linux](https://tldp.org/LDP/nag2/x-087-2-resolv.howdnsworks.html).
Je recommande aussi de lire l'article [DNS](https://fr.wikipedia.org/wiki/Domain_Name_System) sur Wikipédia.
{{}}
### Je vous présente Unbound
[Unbound](https://nlnetlabs.nl/projects/unbound/about/) est un résolveur
DNS Open Source récursif, cache et validant avec les fonctionnalités
suivantes :
- Cache avec possibilité de récupèrer des éléments populaires avant qu'ils
expirent.
- Serveur et Redirection DoT (DNS over TLS), avec validation de domaine
- DoH (DNS over HTTPS)
- Minimisation du nom de la requête
- Utilisation aggressive du cache validé par DNSSEC.
- Zones faisant autorité, pour une copie locale de la zone racine.
- DNS64
- DNSCrypt
- Validation DNSSEC
- Client de sous-réseau EDNS
Unbound est conçu pour être rapide et sécurisé et incorpore des fonctionnalités
modernes basées sur des normes ouvertes. Fin 2019, Unbound a été
[rigoureusement audité](https://ostif.org/wp-content/uploads/2019/12/X41-Unbound-Security-Audit-2019-Final-Report.pdf).
{{< note tip >}}
Une des principales raisons d'utiliser Unbound plutôt que de nombreux autres
résolveurs cache seulement, tel que [dnsmasq](https://fr.wikipedia.org/wiki/Dnsmasq)
par exemple, est que si vous n'utilisez pas l'option **forward** dans la
configuration d'Unbound, Unbound **fera des requêtes directement aux serveurs
racines** en utilisant leurs adresses IP enregistrées et listées dans le
[fichier Root Hints](https://www.iana.org/domains/root/files).
Ceci vous libèrera des serveurs DNS de votre FAI, et de tout serveur DNS
publique, tel que Google ou Cloudflare, et tout enregistrement, vente et
manipulation de données, tels qu'ils le font sera évité.
Un simple serveur cache tel que dnsmasq devra toujours rediriger ses requêtes
vers un autre serveur, là où Unbound interrogera les serveurs racines
directement et suivra la chaîne des domaines jusqu'à ce qu'il obtienne
l'enregistrement pertinent depuis le serveur DNS faisant autorité pour le
domaine concerné.
Cela signifie que le serveur DNS qui sait spécifiquement ce que vous
recherchez soit aussi celui qui fait autorité pour répondre à la question.
{{}}
{{< note warning >}}
Si votre FAI fait du détournement de trafic DNS, Unbound ne vous aidera
en aucune manière.
Lisez la section {{< anchor "Détournement de DNS" "Détournement de DNS" >}} concernant
l'information afin que vous puissiez déterminer sir le trafic
de votre DNS est détourné.
{{}}
Dans notre paramétrage avec Unbound, une requête pour un domaine tel que
"wikipedia.org" ressemblera à ceci :
1. Votre navigateur envoie une requête au système d'exploitation, avec
la question "Quelle est l'adresse IP de wikipedia.org ?"
2. Le système d'exploitation, plus spécifiquement les routines du résolveur
dans la bibliothèque C, qui fournit l'accès au Système de Noms de Domaines
sur Internet, redirigera la requête DNS vers le(s) serveur(s) de noms de
domaine listé dans [/etc/resolv.conf](https://man.openbsd.org/resolv.conf)
(sur des systèmes d'exploitation de type UNIX)
3. Unbound reçoit la requête et en premier cherche "wikipedia.org" dans son
cache et s'il ne le trouve pas, interroge un des serveurs racines listés
dans son fichier Root Hints pour le domaine TLD ".org".
4. Le serveur racine répond par une référence aux serveurs concernés du
domaine TLD ".org".
5. Unbound envoie alors une requête à l'un des serveurs concernés demandant
quels sont les serveurs DNS faisant autorité pour "wikipedia.org".
6. Le serveur répond avec une référence aux serveurs de noms faisant autorité
enregistrés pour "wikipedia.org".
7. Unbound envoie alors une requête à l'un des serveurs de noms faisant
autorité et demande l'adresse IP pour "wikipedia.org".
8. Le serveur de noms faisant autorité répond par l'envoi de l'adresse IP
listée dans les enregistrements "A" et/ou "AAAA" pour le domaine
"wikipedia.org".
9. Unbound reçoit l'adresse IP du serveur de noms faisant autorité et
retourne la réponse au client.
10. Si cela est activé, Unbound met en cache alors l'information pour une
longueur de temps prédéterminée pour de futures requêtes pour le même nom
de domaine.
Vous pouvez essayer de faire une `trace` DNS par vous-mêmes pour voir le
propos ci-dessus. J'utilise [drill](https://linux.die.net/man/1/drill)
dans cet exemple avec l'option `trace` activée.
```
# drill -T wikipedia.org
. 518400 IN NS l.root-servers.net.
. 518400 IN NS k.root-servers.net.
. 518400 IN NS e.root-servers.net.
. 518400 IN NS a.root-servers.net.
. 518400 IN NS m.root-servers.net.
. 518400 IN NS h.root-servers.net.
. 518400 IN NS i.root-servers.net.
. 518400 IN NS f.root-servers.net.
. 518400 IN NS c.root-servers.net.
. 518400 IN NS b.root-servers.net.
. 518400 IN NS g.root-servers.net.
. 518400 IN NS d.root-servers.net.
. 518400 IN NS j.root-servers.net.
org. 172800 IN NS a0.org.afilias-nst.info.
org. 172800 IN NS a2.org.afilias-nst.info.
org. 172800 IN NS b0.org.afilias-nst.org.
org. 172800 IN NS b2.org.afilias-nst.org.
org. 172800 IN NS c0.org.afilias-nst.info.
org. 172800 IN NS d0.org.afilias-nst.org.
wikipedia.org. 86400 IN NS ns0.wikimedia.org.
wikipedia.org. 86400 IN NS ns1.wikimedia.org.
wikipedia.org. 86400 IN NS ns2.wikimedia.org.
wikipedia.org. 600 IN A 91.198.174.192
```
{{< note info >}}
Unbound a la capacité de valider les réponses qu'il reçoit comme correctes.
C'est habituellement accompli par l'utilisation de
[DNSSEC](https://fr.wikipedia.org/wiki/Domain_Name_System_Security_Extensions)
ou l'utilisation de bits aléatoires encodés 0x20 dans la requête pour
déjouer les tentatives d'usurpation d'identité.
À l'exception des [bits aléatoires encodés 0x20](https://man.openbsd.org/unbound.conf#use~3),
tous les autres paramétres de validation tel que [harden-glue](https://man.openbsd.org/unbound.conf#harden~3)
et [hardened dnssec-stripped data](https://man.openbsd.org/unbound.conf#harden~4)
sont tous activés par défaut dans Unbound pour OpenBSD.
{{}}
### Blocage par DNS
Le blocage par DNS, appelé aussi filtrage ou usurpation DNS, est le processus
qui vous permet de fournir une "fausse" réponse au client qui effectue
la requête.
Nous bloquons une requête pour une adresse IP valide soit en répondant avec
un [NXDOMAIN](https://tools.ietf.org/html/rfc8020), signifiant nom de domaine
inexistant, ou soit en redirigeant vers une autre adresse IP que celle prévue
par le propriétaire du domaine.
Cela nous oblige à créer une liste, ou des listes multiples, de domaines
que nous voulons bloquer et plutôt que de fournir à l'utilisateur l'adresse
IP correcte pour un certain domaine, nous renvoyons le message que le
domaine est "inexistant", ce qui bloquera toute communication vers la
destination prévue pour l'application.
Normalement, toutes les requêtes DNS sont envoyés vers le port 53 soit sur
le protocole UDP, soit TCP, lors de la mise en place du serveur DNS, ce que
nous faisons avec Unbound, et en s'assurant que tout le trafic du port 53
atteigne notre serveur DNS ou autrement soit bloqué ; nous pouvons nous
assurer que toutes les réponses DNS viennent de notre serveur Unbound interne
à notre routeur OpenBSD.
{{< note info >}}
Vous ne pouvez pas pleinement faire confiance au blocage par DNS car le
blocage par DNS peut être contourné.
Même en ayant une solide approche en place, il est toujours possible pour
quelqu'un d'utiliser un [service VPN](https://fr.wikipedia.org/wiki/R%C3%A9seau_priv%C3%A9_virtuel)
pour contourner cela.
Nous n'essayons pas de construire un système 100% infaillible - même si
nous y reviendrons un peu plus loin dans ce guide - nous essayons juste
de protéger nos familles de la meilleure manière.
Il y a toujours aussi les autres points d'accès à Internet que nous devons
considérer, tels que les téléphones, ceux des amis ou leur maison, les
accès publique à Internet, etc.
{{}}
#### NXDOMAIN vs redirection
Quand nous voulons bloquer un domaine en utilisant DNS, nous pouvons choisir
entre différentes méthodes, mais les deux plus populaires sont soit de
rediriger la requête DNS vers une adresse IP locale, tel que 127.0.0.1 ou
0.0.0.0, ou de répondre par une définition NXDOMAIN.
NXDOMAIN est une norme de réponse pour un "nom de domaine Intranet ou
Internet non existant".
Si le nom de domaine est incapable d'être résolu en utilisant DNS, une
condition appellée NXDOMAIN est obtenue.
Nous pouvons essayer de résoudre un domaine non existant avec la commande
`host` :
```
$ host a1b7c3n9m3b0.com
Host a1b7c3n9m3b0.com not found: 3(NXDOMAIN)
```
Puisque le nom de domaine "a1b7c3n9m3b0.com" n'est enregistré par personne
(au moins pas durant le temps où j'écris cela), nous obtenons une réponse
"NXDOMAIN".
Nous pouvons aussi utiliser `drill`. L'information pertinente depuis la
sortie de `drill` est le champ `rcode` dans la section "HEADER" :
```
$ drill a1b7c3n9m3b0.com
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 39710
…
```
Ou si vous préférez `dig`, alors l'information pertinente est localisée
dans le champ `status` dans la section "HEADER" :
```
$ dig a1b7c3n9m3b0.com
; <<>> DiG 9.16.8 <<>> +search a1b7c3n9m3b0.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 48858
…
```
Utiliser une réponse NXDOMAIN n'est pas seulement la manière correcte de
bloquer un domaine, en accord avec la [RFC8020](https://tools.ietf.org/html/rfc8020),
mais c'est aussi la meilleure manière de le faire puisque une redirection
vers une adresse IP, telle que 127.0.0.1 ou 0.0.0.0 fera simplement que
le client qui initie la requête DNS se parlera à lui-même.
Il se peut que le navigateur réponde avec quelque chose comme :
`Firefox can't establish a connection to the server at 0.0.0.0.`.
Toutefois, puisque l'adresse IP 0.0.0.0 se traduit simplement par notre
machine locale, nous pouvons toujours envoyé un ping à cette adresse, car
elle est synonyme d'un ping à 127.0.0.1 :
```
$ ping 0.0.0.0
PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.049 ms
```
Et puisque je recommande que vous utilisiez une réponse NXDOMAIN, c'est
ce que nous allons utiliser dans ce tutoriel.
{{< note tip >}}
Unbound peut gérer des listes énormes de domaines bloqués avec une réponse
NXDOMAIN, mais il ne peut pas gérer de grandes listes de domaines qui ont
besoin d'être redirigés aussi bien.
Si pour certaines raisons, vous devriez insister sur la redirection plutôt
que d'utiliser NXDOMAIN, je vous recommande de paramétrer
[dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html)
avec l'option **--addn-hosts=\**, pour qu'il écoute le port 53 et
qu'il redirige tous les domaines bloqués, pendant qu'il redirige les requêtes
DNS normales vers Unbound. Cela demande de paramétrer Unbound afin d'écouter
sur un port non standard, tel que le port 5353.
Contrairement à Unbound, dnsmasq peut gérer d'énormes listes de redirection
très bien, mais il ne peut gérer de grandes liste de domaines NXDOMAIN
aussi bien, devenant extrêmement lent.
{{}}
### Le problème avec DNS sur HTTPS (DOH)
Avec l'introduction de [DoH (DNS over HTTPS)](https://fr.wikipedia.org/wiki/DNS_over_HTTPS),
le blocage par DNS est devenu beaucoup plus difficile, et, bien que j'ai
un certain respect pour l'idée originale derrière la promotion de DoH du
point de vue de la confidentialité, DoH est mal construit d'un point de
vue de la sécurité, et c'est une **MAUVAISE** approche.
Avec le nombre déjà croissant de serveurs DNS publiques capable de servir
du DNS sur HTTPs, toute application peut maintenant utiliser DoH et
contourner complétement le blocage par DNS au niveau privé et entreprise.
Non seulement cela, mais DoH a ouvert une large porte pour les dévelopeurs
d'application afin de paramétrer leurs propres serveurs DoH et de les
utiliser dans leurs applications au lieu du serveur DNS régulier attaché
au réseau interne.
C'est spécifiquement un problème pour le
[logiciel propriétaire](https://fr.wikipedia.org/wiki/Logiciel_propri%C3%A9taire)
dont nous ne pouvons pas voir le code source, mais dont nous ne pouvons
pas aussi changer les paramétres DoH.
À cause de DoH, nous ne pouvons plus bloquer simplement des domaines, tels
que les publicitaires ou le porno, nous devons aussi commencer à bloquer
les serveurs DoH publiques via le pare-feu.
Toutefois, bien que garder une liste croissante d'un nombre d'adresses IP
de serveurs DoH publique soit assez problèmatique, garder une liste de
serveurs DoH publiques inconnus, qui peuvent être utilisé par du logiciel
propriétaire, tel que du micro-logiciel dans des dispositifs
[IoT](https://fr.wikipedia.org/wiki/Internet_des_objets), est impossible.
DoH est aussi un complet cauchemard pour les entreprises car il rend
basiquement possible de surpasser les paramétres DNS imposés centralement.
Cela rend impossible de fournir des solutions de filtrage, telle que
celle que nous faisons, pour bloquer la publicité et le porno, et rend
impossible pour les administrateurs systèmes de surveiller les paramétres
DNS du système d'exploitation afin de prévenir les attaques de
[manipulation DNS](https://fr.wikipedia.org/wiki/Manipulation_de_l%27espace_des_noms_de_domaine).
Avoir de multiples applications qui ont leur unique paramétre DoH est un
cauchemar.
DoH gène complétement l'analyse réseau et la surveillance du trafic DNS
à des fins de sécurité.
En 2019, Godlua, un bot Linux DDoS, était le premier
[logiciel malveillant](https://fr.wikipedia.org/wiki/Logiciel_malveillant)
vu à [utiliser DoH pour cacher son trafic DNS](https://www.zdnet.com/article/first-ever-malware-strain-spotted-abusing-new-doh-dns-over-https-protocol/).
De plus, et c'est peut-être l'aspect le plus important, DoH **n'empêche
aucunément le suivi des utilisateurs**.
Certaines parties de la connection HTTPS ne sont pas chiffrées, tels que
les [champs SNI](https://fr.wikipedia.org/wiki/Server_Name_Indication)
(mais on y arrive lentement), les [connexions OCSP](https://fr.wikipedia.org/wiki/Online_Certificate_Status_Protocol),
et bien sûr **les adresses IP de destination**, ce qui à mon humble avis
est le point le plus crucial de la communication qui a besoin d'être caché !
Les personnes qui ont vraiment besoin de confidentialité, tels que les
journalistes dans des pays ayant une politique de confidentialité compromise,
ne peuvent faire confiance à DoH !
L'adresse IP du serveur de destination ne peut pas être caché avec DoH,
même si tout le trafic est lui-même chiffré.
Si quelqu'un a vraiment besoin de chiffrer la communication, il a besoin
d'une stratégie complétement différente de DoH.
Cela me fait me demander qui a pensé que DoH était une bonne idée au départ ?!
Ne comprennent-ils pas les bases derrière les communications avec HTTPS,
ou peut-être est-ce l'agenda poussé par quelques entreprises privées de
service DNS, tel que Cloudflare, qui tire profit en collectant davantage
de données utilisateurs ?
Certains fournisseurs de service DNS publique status que d'un point de vue
de la confidentialité, DoH est meilleur que d'autres alternatives, telle
[DoT (DNS over TLS)](https://en.wikipedia.org/wiki/DNS_over_TLS), puisque
les requêtes DNS sont cachées dans le large flux du trafic HTTPS.
Cela donne aux administrateurs réseaux moins de visibilité mais fournit
aux utilisateurs plus de confidentialité.
Ce message est problématique.
Bien qu'il soit vrai que la recherche initiale d'un nom de domaine soit
caché dans le trafic HTTPS, l'adresse IP de destination fournit par le
serveur DoH ne l'est pas.
Quand l'application cliente visite l'adresse IP de destination, les deux
adresses IP, celle de source et celle de destination, sont journalisées
au niveau du FAI (et possiblement à de multiples autres niveaux, aussi bien).
Bien qu'il ne soit pas immédiatement possible de déterminer exactement
quel nom de domaine l'utilisateur essaye d'atteindre, spécifiquement si
le serveur web fait fonctionner de multiples domaines sur la même adresse
IP, ce n'est définitivement pas impossible voire n'est même pas difficile.
{{< note info >}}
Dans l'appendice, vous pouvez trouver un chapitre appellé
{{< anchor "Inspecter DNS sur HTTPS (DOH)" "Inspecter DNS sur HTTPS (DOH)" >}},
dans laquelle nous ferons une démonstration de comment l'adresse IP de
destination est révélée dans la communication DoH.
Vous pouvez aussi trouver un chapitre appellé
{{< anchor "Bloquer DNS sur HTTPS (DOH)" "Bloquer DNS sur HTTPS (DOH)" >}} dans
laquelle nous utilisons le pare-feu PF pour bloquer les serveurs DoH publiques.
{{}}
### Paramétrage d'Unbound
#### Paramétrages de base
Paramètrer Unbound est très facile, car Unbound est fourni avec les meilleurs
paramètres par défaut, mais est aussi très bien documenté.
Avant que nous commencions, je vous recommande de regarder les pages des
manuels OpenBSD pour [unbound](https://man.openbsd.org/unbound),
[unbound-checkconf](https://man.openbsd.org/unbound-checkconf)
et [unbound.conf](https://man.openbsd.org/unbound.conf).
Du fait qu'Unbound soit [chrooté](https://fr.wikipedia.org/wiki/Chroot)
sur OpenBSD, le fichier de configuration `unbound.conf` ne réside pas
dans `/etc`, là où il devrait être normalement, mais à la place réside
dans `/var/unbound/etc/`.
Copiez le fichier de configuration existant d'Unbound :
```
# mv /var/unbound/etc/unbound.conf /var/unbound/etc/unbound.conf.backup
```
Ensuite, utilisez votre éditeur texte favori et créer un nouveau fichier
`/var/unbound/etc/unbound.conf` et remplissez-le avec le contenu suivant :
```
server:
# Logging (default is no).
# Uncomment this section if you want to enable logging.
# Note enabling logging makes the server (significantly) slower.
# verbosity: 2
# log-queries: yes
# log-replies: yes
# log-tag-queryreply: yes
# log-local-actions: yes
interface: 127.0.0.1
interface: 192.168.1.1
interface: 192.168.2.1
interface: 192.168.3.1
# In case you need Unbound to listen on an alternative port, this is the
# syntax:
# interface: 127.0.0.1@5353
# Control who has access.
access-control: 0.0.0.0/0 refuse
access-control: ::0/0 refuse
access-control: 127.0.0.0/8 allow
access-control: ::1 allow
access-control: 192.168.1.0/24 allow
access-control: 192.168.2.0/24 allow
access-control: 192.168.3.0/24 allow
# "id.server" and "hostname.bind" queries are refused.
hide-identity: yes
# "version.server" and "version.bind" queries are refused.
hide-version: yes
# Cache elements are prefetched before they expire to keep the cache up to date.
prefetch: yes
# Our LAN segments.
private-address: 192.168.0.0/16
# We want DNSSEC validation.
auto-trust-anchor-file: "/var/unbound/db/root.key"
# Enable the usage of the unbound-control command.
remote-control:
control-enable: yes
control-interface: /var/run/unbound.sock
```
J'ai commenté les options ci-dessus, mais si vous avez besoin d'explications
plus profondes concernant la configuration, regardez la page du manuel
[unbound.conf](https://man.openbsd.org/unbound.conf).
La journalisation est faite par défaut vers syslog.
Si vous voulez changer cela, vous pouvez créer un fichier log dans le
chroot d'Unbound et ainsi avoir le journal d'Unbound :
```
# mkdir /var/unbound/log
# touch /var/unbound/log/unbound.log
# chown -R root._unbound /var/unbound/log
# chmod -R 774 /var/unbound/log
```
Et, dans le fichier `unbound.conf`, ajoutez les options suivantes vers la
section de journalisation :
```
logfile: "/log/unbound.log"
use-syslog: no
log-time-ascii: yes
```
{{< note info >}}
Nous n'utilisons pas le chemin complet du fichier de log parce qu'Unbound
est chrooté.
Avec l'option `logfile` ci-dessus, le fichier log se retrouve dans
`/var/unbound/log/unbound.log`.
{{}}
Puis, redémarrez Unbound :
```
# rcctl restart unbound
```
Dans les paramétres ci-dessus, j'ai autorisé Unbound à écouter l'interface
loopback (127.0.0.1) en premier afin que les applications réseaux locales
soient capables de faire des recherches si besoin.
Dans le fichier `etc/resolv.conf` de notre routeur OpenBSD, j'ai listé
notre serveur DNS Unbound, car je ne veux rien sur le routeur qui interroge
les serveurs DNS du FAI :
```
nameserver 127.0.0.1
```
Si vous utilisez DHCP sur l'interface externe (l'interface connecté au
modem ou routeur de votre FAI), vous devez vous assurez que [dhclient](https://man.openbsd.org/dhclient)
ne change pas la configuration du fichier `/etc/resolv.conf`.
Éditez le fichier `/etc/dhclient.conf` et ajoutez :
```
supersede domain-name-servers 127.0.0.1;
```
Cela permettra de s'assurer que nous avons notre serveur DNS local listé.
Activez Unbound avec :
```
# rcctl enable unbound
```
Lorsque vous changez la configuration d'Unbound, vous pouvez soit juste
redémarrer Unbound avec :
```
# rcctl restart unbound
```
ou simplement recharger les options de configuration (ce qui purge aussi
le cache) :
```
# unbound-control reload
```
Vous pouvez lister avec quels paramétres Unbound est démarré par la commande
suivante (qui est fourni pour tout service sous OpenBSD) :
```
# rcctl get unbound
```
Si vous voulez avec certaines statitiques des données, vous pouvez exécuter :
```
# unbound-control stats_noreset
thread0.num.queries=2056
thread0.num.queries_ip_ratelimited=0
thread0.num.cachehits=678
thread0.num.cachemiss=1378
thread0.num.prefetch=15
thread0.num.expired=0
…
```
Vous pouvez aussi avoir un dump du cache :
```
# unbound-control dump_cache|less
```
Si vous voulez voir quelles sont les requêtes du serveur de nom Unbound
fait pour un domaine spécifique, vous pouvez faire cela avec :
```
# unbound-control lookup wikipedia.org
```
Si vous voulez purger le cache pour un domaine spécifique, vous pouvez
faire cela avec :
```
# unbound-control flush example.com
```
Prenez le temps de regarder la page du manuel d'[unbound-control](https://man.openbsd.org/unbound-control)
pour les autres options et commandes.
#### Ignorer les réglages TTL ridiculeusement bas
Une chose qui crée une grande nuisance est le paramétrage de certaines
personnes sur des valeurs TTL ridiculeusement basses pour leurs domaines.
Pour certaines raisons, il est presque tendance d'avoir une valeur par
défaut de 60 secondes.
Le problème avec un TTL très bas est que cela rend complétement inutile
le DNS cache.
Une requête utilisera seulement la réponse en cache aussi longtemps que
le TTL ne soit pas expiré.
Même au-travers des RFC qui disent qu'un TTL doit être respecté, de telles
valeurs basses rend le DNS extrêmement inefficace.
Je recommande toutefois que vous surchargiez le paramétrage TTL par celui
d'une heure par défaut.
Une autre amélioration dans la vitesse de requête de DNS est de réduire
la latence en se servant des enregistrements périmés avant de les mettre
à jour d'une autre manière au lieu de faire l'inverse.
```
cache-min-ttl: 3600
serve-expired: yes
```
Un problème théorique avec l'augmentation du TTL est que le domaine pourrait
obtenir une nouvelle adresse IP qui ne peut pas être résolu puisque
l'ancienne entrée est dans le cache.
Toutefois, dans la pratique le risque de fonctionner sur un domaine périmé
est minime et ça vaut la peine d'améliorer l'utilisation du cache en fixant
un TTL d'une heure minimum par défaut.
#### Bloquons certains domaines !
Maintenant, intéressons-nous à la partie du blocage de domaines.
J'ai créé un simple script shell appelé [DNSBlockBuster](https://codeberg.org/unixsheikh/dnsblockbuster)
qui télécharge automatiquement un jeu de fichiers hosts depuis diverses
sources en-ligne, les concaténant ensemble en une seule, la nettoyant,
et convertissant le résultat en une liste de blocage de domaines pour
Unbound et dnsmasq.
Elle bloque principalement les publicités, les sites de porno et de pistage.
Avec DNSBlockBuster, vous avez l'option de créer une liste blanche, si pour
vous l'un des domaines listés dans les fichiers hosts est un faux positif,
et vous pouvez ajouter votre propre liste de blocage dans le cas où vous
voulez bloquer manuellement certains domaines qui ne sont pas listés dans
les fichiers hosts.
Vous pouvez facilement ajouter de nouvelles listes de blocage ou supprimer
l'une des listes de blocage fournies.
Bien sûr, vous n'avez pas besoin d'utiliser mon script, mais je l'utiliserais
dans ce tutoriel.
Actuellement le script créé une énorme liste de domaines avec plus de deux
millions de domaines listés et Unbound prend près de 705 Mo de mémoire au
total quand la liste de blocage est chargée en entier.
Afin d'éviter qu'Unbound tombe en panne lors du chargement de la liste,
éditez `/etc/rc.conf.local` et ajoutez ce qui suit :
```
unbound_timeout=240
```
Puis redémarrez Unbound :
```
# rcctl restart unbound
```
Regardez la section [Usage](https://codeberg.org/unixsheikh/dnsblockbuster#user-content-usage)
dans la documentation de DNSBlockBuster pour savoir comment l'utiliser.
C'est simple et facile.
Une fois que vous avez créé votre liste de blocage pour Unbound, placez
la dans `/var/unbound/etc/` et éditez le fichier de configuration d'Unbound
`/var/unbound/etc/unbound.conf` pour insérer quelque chose comme :
```
include: "/var/unbound/etc/unbound-blocked-hosts.conf"
```
Maintenant rechargez Unbound avec :
```
# unbound-control reload
```
Si vous exécutez la commande `top` dans un autre terminal, vous remarquerez
qu'Unbound consomme pas mal de ressources CPU lors du chargement initial
de la liste.
Remarquez aussi la consommation mémoire.
Vous pouvez maintenant tester notre blocage DNS en faisant une requête
vers un domaine bloqué de la liste :
```
$ drill 3lift.com
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 55906
…
```
Essayez le même avec le serveur DNS de Cloudflare :
```
$ drill 3lift.com @1.1.1.1
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 48771
…
```
Comme nous pouvons le voir, notre serveur DNS bloque l'accès au domaine
3lift.com en répondant avec un NXDOMAIN, alors que le serveur DNS de
Cloudflare répond avec l'adresse IP correcte.
### Sécurité DNS
La sécurité DNS est un vaste sujet.
Dans cette section, nous allons discuter de certains des sujets qui nous
concernent plus particulièrement à propos de notre propre serveur DNS.
Le protocole DNS n'est pas chiffré et ne tient, par défaut, aucun compte
de la confidentialité, de l'intégrité ou de l'authentification.
Si vous utilisez un réseau non fiable, ou un FAI malveillant, vos requêtes
DNS peuvent être écoutées et les réponses manipulées.
En outre, les FAI peuvent procéder à des détournements de DNS.
#### Détournement de DNS
Le détournement de DNS signifie que les requêtes DNS que vous faites sont
redirigées vers un autre serveur DNS.
C'est typiquement fait en redirigeant tout le trafic sur le port 53 à
destination d'un autre.
Un des manières les plus simples pour déterminer si votre FAI détourne
votre trafic DNS est d'interroger directement un serveur DNS faisant autorité.
Nous pouvons utiliser de multiples outils pour cela.
Dans cet exemple, nous utiliserons en premier `drill`.
Ces options, dans cet exemple, sont les mêmes pour `dig`.
Nous utiliserons encore le domaine "wikipedia.org".
En premier, nous avons besoin d'avoir les serveurs faisant autorité.
Ils apparaîtront dans la section "ANSWER SECTION" :
```
$ drill NS wikipedia.org
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 28789
;; flags: qr rd ra ; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; wikipedia.org. IN NS
;; ANSWER SECTION:
wikipedia.org. 85948 IN NS ns2.wikimedia.org.
wikipedia.org. 85948 IN NS ns0.wikimedia.org.
wikipedia.org. 85948 IN NS ns1.wikimedia.org.
;; AUTHORITY SECTION:
;; ADDITIONAL SECTION:
;; Query time: 1 msec
;; SERVER: 127.0.0.1
;; WHEN: Thu Nov 5 07:53:19 2020
;; MSG SIZE rcvd: 95
```
Alors nous devons interroger l'un de ses serveurs faisant autorité directement.
Le champ important auquel nous devons faire attention est flags dans le
champ "HEADER".
Pour que la réponse fasse autorité, le drapeau `aa` doit être listé.
```
$ drill @ns1.wikimedia.org wikipedia.org
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 57611
;; flags: qr aa rd ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; wikipedia.org. IN A
;; ANSWER SECTION:
wikipedia.org. 600 IN A 91.198.174.192
;; AUTHORITY SECTION:
;; ADDITIONAL SECTION:
;; Query time: 127 msec
;; SERVER: 208.80.153.231
;; WHEN: Thu Nov 5 07:56:10 2020
;; MSG SIZE rcvd: 47
```
Cela montre que la réponse que nous avons n'a pas été détournée puisque
la réponse fait autorité.
Essayons de l'obtenir depuis le serveur DNS publique de Cloudflare avec
la même requête :
```
$ drill @1.1.1.1 wikipedia.org
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 40562
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; wikipedia.org. IN A
;; ANSWER SECTION:
wikipedia.org. 555 IN A 91.198.174.192
;; AUTHORITY SECTION:
;; ADDITIONAL SECTION:
;; Query time: 3 msec
;; SERVER: 1.1.1.1
;; WHEN: Thu Nov 5 08:02:58 2020
;; MSG SIZE rcvd: 47
```
Notez que le drapeau `aa` est manquant dans le champ "HEADER".
Cela signifie que la réponse ne fait pas autorité.
Un autre outil simple est [nslookup](https://man.openbsd.org/nslookup).
En premier interrogeons les serveurs de noms faisant autorité :
```
nslookup -querytype=NS wikipedia.org
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
wikipedia.org nameserver = ns1.wikimedia.org.
wikipedia.org nameserver = ns2.wikimedia.org.
wikipedia.org nameserver = ns0.wikimedia.org.
```
Essayons alors d'interroger notre propre serveur DNS pour le domaine :
```
$ nslookup wikipedia.org
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: wikipedia.org
Address: 91.198.174.192
Server: ns2.wikimedia.org
Address: 91.198.174.239#53
Name: wikipedia.org
Address: 91.198.174.192
```
Le message `Non-authoritative` montre clairement que la réponse n'est pas
faite depuis un serveur DNS faisant autorité.
C'est très bien, puisque nous avons interrogé notre propre serveur DNS.
Essayons d'interroger un des serveurs faisant autorité directement :
```
$ nslookup wikipedia.org ns0.wikimedia.org
Server: ns0.wikimedia.org
Address: 208.80.154.238#53
Name: wikipedia.org
Address: 91.198.174.192
```
Le message `Non-authoritative` n'est plus là, la réponse que nous avons
obtenu **faisait autorité**, ce qui signifie que notre requête DNS n'a pas
été détournée.
J'ai maintenant activé un service VPN que je connais pour intercepter les
requêtes DNS afin de protéger les clients contre la [fuite DNS](https://en.wikipedia.org/wiki/DNS_leak)
puis je fais une requête à nouveau vers les serveurs faisant autorité :
```
$ nslookup wikipedia.org ns0.wikimedia.org
Server: ns0.wikimedia.org
Address: 208.80.154.238#53
Non-authoritative answer:
Name: wikipedia.org
Address: 91.198.174.192
Name: wikipedia.org
Address: 2620:0:862:ed1a::1
```
Comme attendu la réponse ne fait pas autorité quand bien même j'ai interrogé
directement le serveur faisant autorité.
Le trafic DNS **a été détourné** et la réponse a été redirigé depuis un
autre serveur DNS inconnu.
Le détournement DNS, qu'il soit effectué par un FAI ou par quelqu'un d'autre,
est hautement problèmatique.
Tout d'abord, nous ne pouvons avoir pleinement confiance aux réponses que
nous obtenons depuis le serveur DNS.
En second, même si la réponse DNS fournit des données non falsifiées,
le trafic DNS a été détourné pour une raison inconnue, qui peut être de
la collecte et de l'enregistrement de données, ou pour une raison
complètement différente.
{{< note info >}}
Certains FAI, tels qu'Optimum Online, Comcast, Time Warner, Cox Communications,
RCN, Rogers, Charter Communications, Verizon, Virgin Media, Frontier Communications,
Bell Sympatico, Airtel, OpenDNS et d'autres ont commencé leurs pratiques
de détournement de DNS sur des noms de domaines inexistants (NXDOMAIN)
pour monétiser l'affichage de publicités.
Le serveur DNS redirigait une requête pour un nom de domaine non existant
vers une fausse adresse IP qui contenait un site web avec publicités.
Je ne sais pas combien de FAI et fournisseurs de service DNS publique le
font encore.
{{}}
##### Prévention contre le détournement de DNS
Si vous avez découvert que votre trafic DNS sur le port 53 est détourné,
vous avez basiquement seulement trois options afin de vous protéger :
1. Si cela vous est possible, changez de FAI !
Votre FAI ne devrait pas détourner votre trafic DNS.
2. Paramétrez votre propre serveur DNS à distance dans un centre d'hébergement
qui ne fait pas de détournement ou ne bloque pas le port 53.
Ensuite, que votre serveur DNS à distance écoute vos connexions DNS sur
un port non standard et rediriger toutes vos requêtes DNS vers votre
serveur DNS à distance.
3. Utilisez un VPN de confiance qui ne détourne pas le trafic DNS, ou s'il
le fait, assurez-vous que vous pouvez faire confiance à leur politique
de non journalisation.
#### Usurpation de DNS
L'usurpation de DNS, aussi appelé empoisonnement du cache DNS, est différent
du détournement de DNS.
Alors que le trafic est redirigé d'une destination vers une autre dans
une attaque de détournement de DNS, c'est la donnée elle-même qui est
manipulée dans une attaque d'usurpation DNS.
Souvent ces deux stratégies d'attaques sont combinées.
Dans une attaque d'usurpation de DNS, la donnée manipulée est introduite
dans le cache du résolveur DNS, résultant que le serveur de nom retourne
un résultat incorrect, e.g. une mauvaise adresse IP.
##### Prévention contre l'usurpation de DNS
Ce type d'attaque peut être atténuée au niveau de la couche transport ou
de la couche application en effectuant une validation de bout en bout une
fois qu'une connexion est établie.
Un exemple courant de cela est l'utilisation de TLS et des signatures digitales.
[DNSSEC](https://fr.wikipedia.org/wiki/Domain_Name_System_Security_Extensions)
utilise des signatures digitales cryptographiques avec un certificat de clé
publique de confiance pour déterminer l'authenticité des données.
DNSSEC peut protéger contre l'usurpation de DNS, toutefois beaucoup
d'administrateurs DNS ne l'ont pas encore implémenté.
À partir de 2020, tous les TLD originaux prennent en charge DNSSEC, comme
le font les TLD de code de pays, mais de nombreux TLD de code de pays ne
le font toujours pas.
## Appendices
### Inspecter DNS sur HTTPS (DOH)
Je veux illustrer le fait que DoH ne fournit pas réellement une véritable
confidentialité autant de l'adresse IP source que celle de destination,
qui peuvent être vues clairement dans la communication HTTPS.
En premier, je m'assure que DoH soit désactivé dans Firefox, sur un des
ordinateurs du LAN pour adultes, et je surveille le trafic sur l'interface
`em1` par l'utilisation de [tcdump](https://man.openbsd.org/tcpdump).
J'ai aussi activé la journalisation dans Unbound, juste pour éviter de
remplir inutilement syslog avec trop de bruits DNS, et j'ai utilisé
[tail](https://man.openbsd.org/tail) pour surveiller le journal.
J'irais sur "wikipedia.org" dans le navigateur et voir ce que révèle la
surveillance sur le routeur.
```
# tcpdump -n -i em1 src host 192.168.1.5 and not arp
tcpdump: listening on em1, link-type EN10MB
23:30:33.494352 192.168.1.5.55724 > 192.168.1.1.53: 58136+ A? wikipedia.org.(31) (DF)
23:30:33.774439 192.168.1.5.58372 > 192.168.1.1.53: 58448+ A? www.wikipedia.org.(35) (DF)
23:30:34.184287 192.168.1.5.46639 > 192.168.1.1.53: 15167+ A? www.wikipedia.org.(35) (DF)
…
```
```
# tail -f /var/unbound/log/unbound.log
Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 wikipedia.org. A IN
Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 wikipedia.org. A IN NOERROR 0.097209 0 47
Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN
Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.154989 0 80
Nov 05 23:30:34 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN
Nov 05 23:30:34 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.000000 1 80
…
```
Naturellement nous avons vu la requête autant dans le trafic de l'interface
que dans le journal d'Unbound.
J'ai activé alors DoH et désactivé le DNS régulier dans Firefox, en
paramétrant la valeur de `network.trr.mode` à `4`.
J'ai alors changé les `paramétres réseaux` et paramétré Cloudflare en
tant que fournisseur DoH.
{{< note tip >}}
Si vous activez juste DoH via les préférences, Firefox utilisera toujours
le DNS régulier comme solution de repli.
Avant de forcer Firefox à utiliser seulement DoH, vous devez paramétrer
la value de `network.trr.mode`.
Écrivez `about:config` dans la barre d'adresses et pressez la touche
Entrée pour accéder au panneau de configuration caché de Firefox.
Étape 2 : Cherchez le paramétre `network.trr.mode`.
Il contrôle la prise en charge de DoH.
Ce paramétre a 4 valeurs :
1. DoH est désactivé, par défaut
2. DoH est actif, mais Firefox utilise à la fois DoH et le DNS régulier
selon la rapidité de la réponse retournée.
3. DoH est actif, et le DNS régulier fonctionne en repli.
4. DoH est actif, et le DNS régulier est désactivé
5. DoH est désactivé, par choix.
Étape 3 : Cherchez le paramétre `network.trr.bootstrapAddress`.
Il contrôle l'adresse IP numérique de votre serveur DoH.
Entrez la valeur `1.1.1.1` et appuyez sur la touche Entrée.
{{}}
Cette fois, je visiterais "freebsd.org".
```
# tcpdump -n -i em1 src 192.168.1.5 and not arp
tcpdump: listening on em1, link-type EN10MB
00:21:10.944243 192.168.1.5.32856 > 1.1.1.1.443: P 2223446146:2223446202(56) ack 157857007 win 501 (DF)
00:21:10.948719 192.168.1.5.46584 > 96.47.72.84.80: S 922508523:922508523(0) win 64240 (DF)
00:21:11.133801 192.168.1.5.33298 > 96.47.72.84.443: S 3275123911:3275123911(0) win 64240 (DF)
…
```
```
# tail -f /var/unbound/log/unbound.log
Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 wikipedia.org. A IN
Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 wikipedia.org. A IN NOERROR 0.097209 0 47
Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN
Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.154989 0 80
Nov 05 23:30:34 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN
Nov 05 23:30:34 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.000000 1 80
…
```
Cela révèle, depuis la surveillance de l'interface réseau, qu'une connexion
a été faite vers le serveur DNS de Cloudflare à l'adresse 1.1.1.1 sur le
port 443 (HTTPS) et que nous avons visité l'adresse IP de destination
96.47.72.84 juste après.
Dans le même temps, rien n'est arrivé dans le journal d'Unbound, `tail`
nous montrant juste toujours la requête précédente.
Si nous faisons une requête au DNS régulier sur le serveur, nous pouvons
vérifier que l'adresse IP 96.47.72.84 est bien l'adresse IP de "freebsd.org".
De plus, dans cet exemple spécifique, nous pouvons même accéder au site
web de "freebsd.org" en écrivant juste l'adresse IP de destination
96.47.72.84 dans le champ de la barre d'adresse du navigateur.
Cela démontre que même si DoH bypasse la requête d'un DNS régulier, il
n'est pas capable de cacher l'adresse IP de destination qui est toujours
présente en clair dans le trafic de la communication.
### Bloquer DNS sur HTTPS (DOH)
Auparavant, le script [DNSBlockBuster](https://codeberg.org/unixsheikh/dnsblockbuster)
comportait certains noms de domaines DoH dans la liste, que j'avais ajouté
aléatoirement, mais j'ai depuis supprimé le blocage DoH du serveur DNS, car
il faut vraiment que cela soit géré au niveau du pare-feu.
Bloquer DoH via les noms de domaine n'a pas beaucoup de sens à mon humble
opinion car un nom de domaine peut être cherché en premier lieu.
La plupart des clients qui utilisent DoH ont l'adresse IP de l'hôte du
serveur DoH encodé directement dans leur code source.
J'ai cherché sur de multiples sites sur Internet, mais aucun n'a trouvé
une simple manière de mettre à jour la liste des serveurs publiques DoH,
ainsi j'ai décidé de faire ma propre liste appelée [DoHBlockBuster](https://codeberg.org/unixsheikh/dohblockbuster).
Toutefois c'est une tâche énorme, dont je sais que je n'aurais pas le
temps de tenir à jour à l'avenir, à moins que d'autres personnnes ne s'y
mettent ; alors si vous avez du temps libre, aidez à tenir à jour les
listes (en faisant une demande de retrait ou en m'envoyant un courriel).
En outre, cette liste n'est en aucun cas exhaustive.
Si vous n'utilisez pas IPv6, vous pouvez bloquer tout le trafic IPv6, et
utilisez alors seulement la liste IPv4 de DoHBlockBuster.
Changez le paramétre `pass out`, dans la section "Default protect and block"
de `/etc/pf.conf` en `pass out inet`.
C'est la manière pour permettre seulement le trafic IPv4 sortant, sans
avoir à bloquer spécifiquement les adresses IPv6 relatives à DoH.
Téléchargez les listes depuis [DoHBlockBuster](https://codeberg.org/unixsheikh/dohblockbuster)
et éditez les selon vos besoins et enregistrez les quelque part sur le
disque.
J'ai fait un sous-répertoire à `/etc/pf-block-lists` où j'ai placé toutes
les listes de blocage dont j'ai besoin pour PF.
Créez alors un fichier persistant pour PF dans la section "Tables" de
`/etc/pf.conf` :
```
# Public DoH servers.
table persist file "/etc/pf-block-lists/dohblockbuster-ipv4.txt"
```
Si vous avez besoin d'IPv6, ajoutez alors cela aussi :
```
table persist file "/etc/pf-block-lists/dohblockbuster-ipv4.txt" file "/etc/pf-block-lists/dohblockbuster-ipv6.txt"
```
Et, alors ajoutez un `block` à la section "Protect and block by default"
du pare-feu :
```
# Let's block DoH.
block in quick on { $g_lan $c_lan $dmz } to
```
Rechargez PF :
```
# pfctl -f /etc/pf.conf
```
Vérifiez la liste avec :
```
# pfctl -vvt block_doh -T show
```
Si - après quelques temps - vous voulez voir quelles adresses IP sont
actuellement bloquées, vous pouvez filtrer la sortie :
```
# pfctl -vvt block_doh -T show | awk '/\[/ {p+=$4; b+=$6} END {print p, b}'
```
Comme mentionné précédemment, cette solution ne prend pas en considération
les serveurs DoH inconnus.
De plus afin que la liste soit efficace, elle a besoin d'être tenue à jour.
### Ajouter l'option domain-name à DHCP et utiliser un FQDN
Si nous paramétrons notre réseau de telle manière que tous les ordinateurs
et dispositifs aient leurs adresses IP fixes et noms d'hôtes, beaucoup
d'outils ne fonctionneront pas nativement avec ces noms d'hôtes sans ajouter
un nom de domaine au serveur DNS.
Cela est dû à des outils tel que `host` qui s'attend à ce que la recherche
vers un nom d'hôte soit
[un nom de domaine pleinement qualifié (FQDN)](https://fr.wikipedia.org/wiki/Fully_qualified_domain_name).
Disons que j'ai paramétré un ordinateur sur mon LAN ayant pour nom d'hôte
"foo" et l'adresse IP fixée à 192.168.1.7.
Je ne me souviens peut être pas que "foo" est l'ordinateur avec telle
adresse, ou je ne me souviens pas quel hôte a l'adresse IP 192.168.1.7
associée.
Avec un FQDN, nous pouvons faire une recherche telle que :
```
$ host foo.example.com
foo.example.com has address 192.168.1.7
```
Alors nous pouvons faire :
```
# host 192.168.1.7
7.1.168.192.in-addr.arpa domain name pointer foo.example.com
```
Toutefois, il est ennuyeux de devoir écrire le nom de domaine complet à
chaque fois.
Si nous ajoutons l'option [domain-name](https://man.openbsd.org/dhcp-options#option~24)
à `/etc/resolv.conf` le nom de domaine sera automatiquement ajouté.
Ainsi, nous pouvons faire juste cela :
```
$ host foo
foo.example.com has address 192.168.1.7
```
Certaines personnes recommandent d'enregistrer un nom de domaine et de
l'utiliser en interne sur votre LAN, et bien que ce soit certainement
fonctionnel, ce n'est pas intéressant du tout.
Pour l'utilisation à la maison, vous pouvez utilisez les TLD `.intranet`,
`.home` ou `.lan`, en accord avec la
[RFC 6762](https://tools.ietf.org/html/rfc6762#appendix-G) sans aucun
problème.
Toutefois, n'utilisez pas `.local`.
Démarrons en faisant quelques changements dans la configuration de `/etc/dhcpd.conf`.
Juste pour faire simple, j'utiliserais le serveur web de notre LAN publique
en exemple, mais vous pouvez étendre cela à tout segment où vous le désirez,
et vous pouvez aussi l'utiliser sur plusieurs segments si besoin.
Dans notre paramétrage actuel, nous avons déjà le domaine `example.com`
attaché à notre serveur web ainsi nous pouvons juste l'utiliser.
Mais si vous n'avez pas de serveur publique qui a un réel nom de domaine,
changez-le juste par quelque chose comme `net.home`.
J'ai changé le nom de notre serveur web par "lilo" (oui, de Lilo & Stitch,
parce que c'est plus cool que "Luke" ou "Yoda" !).
```
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.1.1;
option domain-name "example.com";
option routers 192.168.1.1;
range 192.168.1.10 192.168.1.254;
}
subnet 192.168.2.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.2.1;
option domain-name "example.com";
option routers 192.168.2.1;
range 192.168.2.10 192.168.2.254;
}
subnet 192.168.3.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.3.1;
option domain-name "example.com";
option routers 192.168.3.1;
range 192.168.3.10 192.168.3.254;
host lilo.example.com {
fixed-address 191.168.3.2;
hardware ethernet 61:20:42:39:61:AF;
option host-name "lilo";
}
}
```
Si vous préférez utiliser de multiples domaines plutôt qu'un seul, dites-vous
que `example.com` est pour votre développement web professionnel, et que
`net.home` pour votre LAN privé, vous pouvez faire une [recherche de domaine](https://en.wikipedia.org/wiki/Search_domain)
avec l'option `domain-search` dans `/etc/dhcpd.conf` au lieu de l'option
`domain-name`.
La différence entre les deux est qu'avec `domain-name`, seulement un seul
domaine est ajouté, alors qu'avec l'option `domain-search`, de multiples
domaines peuvent être ajoutés et sont alors "cherchés" un par un jusqu'à
ce que l'hôte soit trouvé.
L'option `domain-search` ressemble à ceci :
```
option domain-search "example.com", "net.home"
```
Alors nous avons besoin de paramétrer Unbound pour gérer nos adresses IP
fixes.
Dans cet exemple, nous avons seulement le serveur web, mais nous pouvons
utiliser autant d'hôtes que nécessaires.
Vous pouvez juste éditer le fichier de configuration principale d'Unbound,
mais je préfére mettre cela dans un fichier séparé et l'inclure dans le
fichier principal.
Créez un nouveau fichier appelé tel que `/var/unbound/etc/unbound-local.conf`,
par exemple, et paramétrez vos hôtes :
```
local-data: "lilo.example.com IN A 192.168.3.2"
local-data-ptr: "192.168.3.2 lilo.example.com"
```
Ou, si vous utilisez la version `net.home` :
```
local-data: "lilo.net.home IN A 192.168.3.2"
local-data-ptr: "192.168.3.2 lilo.net.home"
```
Notez comment l'adresse IP dans le champ `local-data-ptr` est retourné,
ce qui n'est pas une erreur.
Ajoutez alors ce qui suit à notre `/var/unbound/etc/unbound.conf` :
```
private-address: 192.168.0.0/16
private-domain: example.com # Use net.home instead if you need that.
include: "/var/unbound/etc/unbound-local.conf"
```
Redémarrez dhcpd et Unbound :
```
# rcctl restart dhcpd
# rcctl restart unbound
```
Si vous retirez le câble Ethernet de l'un des ordinateurs connectés à l'un
des LAN et le connectez à nouveau, vous serez notifié que `/etc/resolv.conf`
a ajouté l'option `domain` :
```
domain example.com
nameserver 192.168.1.1
```
Vous pouvez étendre cet exemple ci-dessus à de multiples domaines et de
multiples dans tous les segments.
### Ajouter pf-badhost
Lorsque vous avez paramétré votre routeur OpenBSD, je vous encourage
fortement à paramétrer [pf-badhost](https://www.geoghegan.ca/pfbadhost.html) !
pf-badhost est un script de sécurité léger fait par [Jordan Geoghegan](https://www.geoghegan.ca/about.html)
qui bloque les plus grandes choses irritantes d'Internet.
Les désagréments tels les brute-forceurs SSH et SMTP sont largement éliminés
par ce script.
pf-badhost ajoute périodiqument des addresses IP depuis des bases de données
de spammeurs d'IP bien connus, tel Spamhaus, Firehol, Emerging Threats
and Binary Defense, où ces mauvaises adressses IP sont fréquemment
journalisées.
pf-badhost les ajoute alors aux adresses IP collectées vers le pare-feu
PF dans une table qui est bloquée par défaut.
### Lectures recommandées
- [OpenBSD PF - User's Guide](https://www.openbsd.org/faq/pf/index.html)
de la FAQ d'OpenBSD *(et sa version FR : [Guide de l'Utilisateur PF](https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/pf/start) officieuse)*
- [Absolute OpenBSD, 2nd edition](https://mwl.io/nonfiction/os#ao2e) de
Michael Warren Lucas.
Certaines syntaxes de PF ont déjà changées depuis que Michael a écrit le
livre, mais il est toujours très utile.
- [Networking for System Administrators](https://mwl.io/nonfiction/networking#n4sa)
de Michael Warren Lucas.
- [OpenBSD and You](https://mwl.io/nonfiction/networking#n4sa)
- [Stop using ridiculously low DNS TTLs](https://blog.apnic.net/2019/11/12/stop-using-ridiculously-low-dns-ttls/)
### Comment contribuer à ce guide ?
Veuillez considérer de contribuer si vous avez n'importe quel commentaire,
correction, ou changement que vous considéré comme approprié.
- Faites un clone sur [Github](https://github.com/unixsheikh/openbsd-router-guide)
- Soumettez un PR pour examen
Vous pouvez aussi juste envoyer un [courriel](https://www.unixsheikh.com/contact.html).
### Traductions de ce guide
Veuillez noter que les traductions listées ici sont commitées par d'autres
personnes contribuant généreusement à ce guide. De fait, je ne suis pas
responsable de garder à jour ces traductions.
- [Français](https://doc.huc.fr.eu.org/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/)
---
Créé et maintenu par
[Unix Sheikh](https://unixsheikh.com/)
Le [Guide du Routeur OpenBSD](https://openbsdrouterguide.net/)
est sous licence [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/).
Si vous trouvez ce contenu utile, soutenez-moi sur [Patreon](https://patreon.com/unixsheikh).
---
#### Contribuer à la version FR
Cette version traduite du Guide du Routeur OpenBSD est faite par [mes soins](https://huc.fr.eu.org).
Vous pouvez contribuer au-travers de mon dépôt [Framagit.org](https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/raw/master/content/fr/trad/unixsheikh.com/Guide-du-Routeur-OpenBSD.md).
Par facilité, cette traduction est placée aussi sous licence [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/).
Vous pouvez soutenir mon effort de traduction en me payant un {{< inside "don" "bon café à l'italienne comme je les <3" >}}… :D
---