Vinishor's blog - infrahttps://blog.vinishor.xyz/2024-01-23T10:00:00+01:00Configurer un serveur mail sous OpenSMTP2024-01-23T10:00:00+01:002024-01-23T10:00:00+01:00Vincent Financetag:blog.vinishor.xyz,2024-01-23:/posts/Configurer-Opensmtpd.html<p>Un tutoriel pour vous expliquer comment configurer OpenSMTPD et vous donner plusieurs exemples de configurations concrètes, avec quelques commandes utiles pour sa gestion quotidienne.</p><p>OpenSMTP est un logiciel d'envoi de courriels conçu par des membres du projet OpenBSD. Au même titre que LibreSSL ou OpenSSH, ce logiciel a été conçu pour le système d'exploitation OpenBSD et porté sur plusieurs distributions par la suite. Son objectif est de gérer l'envoi de courriels vers l'extérieur tout en utilisant une syntaxe simple à comprendre et à utiliser. Il peut convenir comme alternative à Postfix, Exim ou encore Sendmail.</p>
<p>Ayant plusieurs machines avec OpenSMTPD, le but de cet article de vous donner quelques exemples d'usages pour ce logiciel et quelques commandes utiles pour son administration au quotidien. Ces exemples sont compatibles avec OpenBSD et plusieurs distributions GNU/Linux (Debian notamment).</p>
<h2>Configuration type sur OpenSMTPD</h2>
<p>Faisons un peu de théorie avant de passer aux exemples. OpenSMTPD utilise plusieurs types d'instructions pour savoir quoi utiliser et comment réagir dans toutes les situations :</p>
<ul>
<li>Les instructions <code>listen</code> servent pour définir comment écouter sur le réseau. On peut écouter sur toutes les interfaces avec <code>all</code> ou bien choisir une interface en particulier. OpenBSD écoute par défaut sur <code>socket</code> et <code>lo0</code>, l'interface privée locale</li>
<li>Les parties de type <code>table</code> servent à définir des tableaux de données. On peut y stocker des alias, des noms de comptes, des utilisateurs ou encore des mots de passe, comme sous Postfix. Elles font références à des fichiers texte ou bien des bases de données en <code>.db</code></li>
<li>Les instructions <code>pki</code> sont réservées aux certificats TLS</li>
<li>Les instructions <code>filter</code> servent au filtrage, notamment pour intégrer un anti-spam</li>
<li>Les instructions <code>match</code> et <code>action</code> fonctionnent ensemble : <code>match</code> permet de définir des contextes où sont exécutées les séquences <code>action</code> associées</li>
</ul>
<p>Ce jeu d'options permet d'obtenir un fichier lisible et simple à comprendre. La syntaxe a d'ailleurs été retravaillée en ce sens pour que l'utilisateur soit plus à l'aise.</p>
<h2>Exemples de configuration</h2>
<h3>Serveur mail complet</h3>
<p>Dans cet exemple, j'ai choisi de configurer directement un serveur mail complet et qui est capable de supporter plusieurs noms de domaine (ce qui est assez courant chez ceux qui gèrent le courrier de plusieurs personnes ou qui gèrent des plateformes d'hébergement). Il utilise Dovecot pour gérer la partie réception du courrier et Rspamd pour la gestion du spam.<br>
Je me suis grandement inspiré de la <a href="https://si3t.ch/w/doku.php?id=ah:fr:05-mail" title="Configuration de SMTPD pour OpenBSD par prx">configuration proposée par @prx</a> dans son guide pour installer un serveur OpenBSD et c'est typiquement celle qui est en production sur mon serveur mail secondaire :</p>
<div class="highlight"><pre><span></span><code><span class="c1">## Tables</span>
table<span class="w"> </span>aliases<span class="w"> </span>file:/etc/mail/aliases
table<span class="w"> </span>passwd<span class="w"> </span><span class="s2">"/etc/mail/passwd"</span>
table<span class="w"> </span>virtuals<span class="w"> </span><span class="s2">"/etc/mail/virtuals"</span>
table<span class="w"> </span>domains<span class="w"> </span><span class="s2">"/etc/mail/domains"</span>
<span class="c1">## Certificats</span>
pki<span class="w"> </span>domaine.tld<span class="w"> </span>key<span class="w"> </span><span class="s2">"/chemin/vers/la/cleducert.pem"</span>
pki<span class="w"> </span>domaine.tld<span class="w"> </span>cert<span class="w"> </span><span class="s2">"/chemin/vers/le/cert.pem"</span>
<span class="c1">## Filtrage</span>
filter<span class="w"> </span>senderscore<span class="w"> </span>proc-exec<span class="w"> </span><span class="s2">"filter-senderscore -blockBelow 10 -junkBelow 70 -slowFactor 2000"</span>
filter<span class="w"> </span>rspamd<span class="w"> </span>proc-exec<span class="w"> </span><span class="s2">"filter-rspamd"</span>
<span class="c1">## Ecoute</span>
<span class="c1">### Reception</span>
listen<span class="w"> </span>on<span class="w"> </span>all<span class="w"> </span>tls<span class="w"> </span>pki<span class="w"> </span>domaine.tld<span class="w"> </span>filter<span class="w"> </span><span class="o">{</span><span class="w"> </span>senderscore,<span class="w"> </span>rspamd<span class="w"> </span><span class="o">}</span><span class="w"> </span>hostname<span class="w"> </span><span class="s2">"domaine.tld"</span>
<span class="c1">### Envoi</span>
listen<span class="w"> </span>on<span class="w"> </span>all<span class="w"> </span>port<span class="w"> </span>submission<span class="w"> </span>tls-require<span class="w"> </span>pki<span class="w"> </span>domaine.tld<span class="w"> </span>auth<span class="w"> </span><passwd><span class="w"> </span>filter<span class="w"> </span>rspamd<span class="w"> </span>hostname<span class="w"> </span><span class="s2">"domaine.tld"</span>
<span class="c1">## Actions</span>
action<span class="w"> </span><span class="s2">"relay"</span><span class="w"> </span>relay
action<span class="w"> </span><span class="s2">"local_mail"</span><span class="w"> </span>maildir<span class="w"> </span><span class="nb">alias</span><span class="w"> </span><aliases>
action<span class="w"> </span><span class="s2">"virtual_maildir"</span><span class="w"> </span>lmtp<span class="w"> </span><span class="s2">"/var/run/dovecot-lmtp"</span><span class="w"> </span>rcpt-to<span class="w"> </span>virtual<span class="w"> </span><virtuals>
<span class="c1">## Envoi et reception des mails</span>
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nb">local</span><span class="w"> </span>action<span class="w"> </span>local_mail
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span><span class="k">for</span><span class="w"> </span>domain<span class="w"> </span><domains><span class="w"> </span>action<span class="w"> </span>virtual_maildir
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span>auth<span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"relay"</span>
match<span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"relay"</span>
</code></pre></div>
<h3>Avoir un serveur SMTP de secours (backup relay)</h3>
<p>Une bonne pratique à avoir quand on gère du mail est d'avoir un serveur de secours qui va se charger de récupérer les mails non distribués si votre serveur principal tombe en panne. C'est ce qu'on appelle un <em>backup relay</em> : il récupère les mails à distribuer et tente de les renvoyer jusqu'à ce que le serveur principal réponde à nouveau.<br>
Sur mon infrastructure, un de mes VPS sert notamment de système de secours pour mes propres domaines et ceux de mon ami <a href="https://si3t.ch/w/" title="Site personnel de prx">@prx</a>.</p>
<p>Sous OpenSMTPD, cela se fait directement avec les options <code>relay backup</code>, comme ci-dessous :</p>
<div class="highlight"><pre><span></span><code>action<span class="w"> </span><span class="s2">"backup"</span><span class="w"> </span>relay<span class="w"> </span>backup<span class="w"> </span>tls<span class="w"> </span>helo<span class="w"> </span><span class="s2">"autredomaine.tld"</span>
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span><span class="k">for</span><span class="w"> </span>domain<span class="w"> </span><span class="s2">"autredomaine.tld"</span><span class="w"> </span>action<span class="w"> </span><span class="s2">"backup"</span>
</code></pre></div>
<p>Dans mon cas, j'ai donc rajouté ces lignes dans la configuration fournie dans la section du dessus pour obtenir cet exemple :</p>
<div class="highlight"><pre><span></span><code><span class="c1">## Tables</span>
table<span class="w"> </span>aliases<span class="w"> </span>file:/etc/mail/aliases
table<span class="w"> </span>passwd<span class="w"> </span><span class="s2">"/etc/mail/passwd"</span>
table<span class="w"> </span>virtuals<span class="w"> </span><span class="s2">"/etc/mail/virtuals"</span>
table<span class="w"> </span>domains<span class="w"> </span><span class="s2">"/etc/mail/domains"</span>
<span class="c1">## Certificats</span>
pki<span class="w"> </span>domaine.tld<span class="w"> </span>key<span class="w"> </span><span class="s2">"/chemin/vers/la/cleducert.pem"</span>
pki<span class="w"> </span>domaine.tld<span class="w"> </span>cert<span class="w"> </span><span class="s2">"/chemin/vers/le/cert.pem"</span>
<span class="c1">## Filtrage</span>
filter<span class="w"> </span>senderscore<span class="w"> </span>proc-exec<span class="w"> </span><span class="s2">"filter-senderscore -blockBelow 10 -junkBelow 70 -slowFactor 2000"</span>
filter<span class="w"> </span>rspamd<span class="w"> </span>proc-exec<span class="w"> </span><span class="s2">"filter-rspamd"</span>
<span class="c1">## Ecoute</span>
<span class="c1">### Reception</span>
listen<span class="w"> </span>on<span class="w"> </span>all<span class="w"> </span>tls<span class="w"> </span>pki<span class="w"> </span>domaine.tld<span class="w"> </span>filter<span class="w"> </span><span class="o">{</span><span class="w"> </span>senderscore,<span class="w"> </span>rspamd<span class="w"> </span><span class="o">}</span><span class="w"> </span>hostname<span class="w"> </span><span class="s2">"domaine.tld"</span>
<span class="c1">### Envoi</span>
listen<span class="w"> </span>on<span class="w"> </span>all<span class="w"> </span>port<span class="w"> </span>submission<span class="w"> </span>tls-require<span class="w"> </span>pki<span class="w"> </span>domaine.tld<span class="w"> </span>auth<span class="w"> </span><passwd><span class="w"> </span>filter<span class="w"> </span>rspamd<span class="w"> </span>hostname<span class="w"> </span><span class="s2">"domaine.tld"</span>
<span class="c1">## Actions</span>
action<span class="w"> </span><span class="s2">"relay"</span><span class="w"> </span>relay
action<span class="w"> </span><span class="s2">"local_mail"</span><span class="w"> </span>maildir<span class="w"> </span><span class="nb">alias</span><span class="w"> </span><aliases>
action<span class="w"> </span><span class="s2">"backup"</span><span class="w"> </span>relay<span class="w"> </span>backup<span class="w"> </span>tls<span class="w"> </span>helo<span class="w"> </span><span class="s2">"autredomaine.tld"</span>
action<span class="w"> </span><span class="s2">"virtual_maildir"</span><span class="w"> </span>lmtp<span class="w"> </span><span class="s2">"/var/run/dovecot-lmtp"</span><span class="w"> </span>rcpt-to<span class="w"> </span>virtual<span class="w"> </span><virtuals>
<span class="c1">## Envoi et reception des mails</span>
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nb">local</span><span class="w"> </span>action<span class="w"> </span>local_mail
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span><span class="k">for</span><span class="w"> </span>domain<span class="w"> </span><span class="s2">"autredomaine.tld"</span><span class="w"> </span>action<span class="w"> </span><span class="s2">"backup"</span>
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span><span class="k">for</span><span class="w"> </span>domain<span class="w"> </span><domains><span class="w"> </span>action<span class="w"> </span>virtual_maildir
match<span class="w"> </span>from<span class="w"> </span>any<span class="w"> </span>auth<span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"relay"</span>
match<span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"relay"</span>
</code></pre></div>
<h3>Relais interne vers des serveurs externes</h3>
<p>Ici, je me suis inspiré d'une configuration en place sur une des machines de <a href="https://dataswamp.org/~solene/" title="Site personnel de solene">solene</a>. L'idée est d'utiliser plusieurs relais SMTP pour envoyer des mails vers plusieurs destinations différentes, le tout en écoutant que sur l'interface locale de la machine.<br>
Cela peut notamment servir à faire le tri entre les envois ou répartir la charge sur plusieurs services :</p>
<div class="highlight"><pre><span></span><code><span class="c1">## /etc/mail/smtpd.conf</span>
listen<span class="w"> </span>on<span class="w"> </span>lo0
table<span class="w"> </span>aliases<span class="w"> </span>file:/etc/mail/aliases
table<span class="w"> </span>secrets<span class="w"> </span>file:/etc/mail/secrets
action<span class="w"> </span><span class="s2">"local"</span><span class="w"> </span>mbox<span class="w"> </span><span class="nb">alias</span><span class="w"> </span><aliases>
action<span class="w"> </span><span class="s2">"relay"</span><span class="w"> </span>relay
action<span class="w"> </span><span class="s2">"monserveur"</span><span class="w"> </span>relay<span class="w"> </span>host<span class="w"> </span>smtps://login@domaine.tld<span class="w"> </span>auth<span class="w"> </span><secrets>
action<span class="w"> </span><span class="s2">"unautreserveur"</span><span class="w"> </span>relay<span class="w"> </span>host<span class="w"> </span>localhost:2525
match<span class="w"> </span>mail-from<span class="w"> </span><span class="s2">"@domaine.tld"</span><span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"monserveur"</span>
match<span class="w"> </span>mail-from<span class="w"> </span><span class="s2">"@domaine2.tld"</span><span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"unautreserveur"</span>
match<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nb">local</span><span class="w"> </span>action<span class="w"> </span><span class="s2">"local"</span>
match<span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"relay"</span>
</code></pre></div>
<h3>Relais SMTP pour un réseau local</h3>
<p>Par rapport à la configuration précédente, on cherche ici à écouter sur toutes les interfaces et on rajoute une règle qui permet à tout ordinateur situé dans le même réseau local que notre machine de l'utiliser pour envoyer des mails vers l'extérieur. Ainsi, cet exemple correspond tout à fait au rôle d'un routeur qui redirige des mails de notifications vers une boîte mail en ligne :</p>
<div class="highlight"><pre><span></span><code><span class="c1">## /etc/mail/smtpd.conf</span>
listen<span class="w"> </span>on<span class="w"> </span>all
table<span class="w"> </span>aliases<span class="w"> </span>file:/etc/mail/aliases
table<span class="w"> </span>secrets<span class="w"> </span>file:/etc/mail/secrets
action<span class="w"> </span><span class="s2">"local"</span><span class="w"> </span>mbox<span class="w"> </span><span class="nb">alias</span><span class="w"> </span><aliases>
action<span class="w"> </span><span class="s2">"relay"</span><span class="w"> </span>relay<span class="w"> </span>host<span class="w"> </span>smtps://login@domaine.tld<span class="w"> </span>auth<span class="w"> </span><secrets>
match<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nb">local</span><span class="w"> </span>action<span class="w"> </span><span class="s2">"local"</span>
match<span class="w"> </span>from<span class="w"> </span><span class="nb">local</span><span class="w"> </span><span class="k">for</span><span class="w"> </span>any<span class="w"> </span>action<span class="w"> </span><span class="s2">"relay"</span>
match<span class="w"> </span>from<span class="w"> </span>src<span class="w"> </span><span class="m">10</span>.10.0.0/16<span class="w"> </span><span class="k">for</span><span class="w"> </span>action<span class="w"> </span><span class="s2">"relay"</span>
</code></pre></div>
<h2>Commandes de base pour un usage quotidien</h2>
<h3>S'occuper de la queue et la visualiser</h3>
<p>Les commandes suivantes permettent de gérer la queue, c'est-à-dire la file d'attente des mails que le logiciel doit traiter. Elles sont à lancer en mode administrateur (avec <code>sudo</code> ou <code>doas</code> par exemple).</p>
<ul>
<li>Afficher la queue : <code>smtpctl show queue</code></li>
<li>Programmer l'envoi d'un mail en particulier : <code>smtpctl schedule 1de69809e7a84423 # smtpctl show queue affiche les ID</code></li>
<li>Programmer l'envoi de tous les mails de la queue : <code>smtpctl schedule all</code></li>
</ul>
<h3>Générer les fichiers associés à la configuration</h3>
<p>Pour générer les fichiers comme <code>/etc/mail/aliases</code> ou <code>/etc/mail/secrets</code>, vous pouvez utiliser les commandes ci-dessous. Il est important de bien attribuer les bonnes permissions pour qu'OpenSMTPD (et lui seul) soit capable de lire les fichiers et assurer la bonne confidentialité des infos contenues.</p>
<div class="highlight"><pre><span></span><code>mkdir<span class="w"> </span>-p<span class="w"> </span>/etc/mail/<span class="w"> </span><span class="c1">## Si ce dossier n'existe pas (Linux)</span>
touch<span class="w"> </span>/etc/mail/secrets
chmod<span class="w"> </span><span class="m">640</span><span class="w"> </span>/etc/mail/secrets
<span class="c1">## Sous OpenBSD</span>
chown<span class="w"> </span>root:_smtpd<span class="w"> </span>/etc/mail/secrets
<span class="c1">## Sous Linux (ici Debian)</span>
chown<span class="w"> </span>root:opensmtpd<span class="w"> </span>/etc/mail/secrets
</code></pre></div>
<p>En cas de modification d'un de ces fichiers, on peut indiquer à OpenSMTPD de se mettre à jour en lançant une commande <code>update</code> : <code>smtpctl update table nomdelatable</code></p>
<p>En cas d'ajout d'utilisateurs dans le fichier <code>secrets</code>, on peut demander à l'utilitaire de générer des hashs des mots de passe choisis avec la commande <code>encrypt</code> : <code>smtpctl encrypt mot_de_passe</code>. Cette commande affichera simplement un hash du mot de passe et il faudra le recopier pour l'ajouter dans le fichier correspondant.</p>
<h2>Conclusion</h2>
<p>Si besoin d'une version plus détaillée pour utiliser un serveur mail sous OpenSMTPD, je peux vous citer une référence de confiance sur le sujet, même si elle est dédiée au système OpenBSD : <a href="https://si3t.ch/w/doku.php?id=ah:fr:05-mail">https://si3t.ch/w/doku.php?id=ah:fr:05-mail</a><br>
L'objectif de cet article est surtout de donner des exemples pour configurer rapidement un serveur OpenSMTPD sans se préoccuper des autres éléments constitutifs d'un service de messagerie électronique.</p>
<hr>
<p>Sources utilisées :</p>
<ul>
<li><a href="https://dataswamp.org/~solene/2018-10-24-smtpd-queue.html">Show OpenSMTPD queue and force sending queued mails</a></li>
<li><a href="https://dataswamp.org/~solene/2018-09-06-openbsd-opensmtpd-relay.html">Configuration of OpenSMTPD to relay mails to outbound smtp server</a></li>
<li><a href="https://dataswamp.org/~solene/2018-10-29-opensmtpd-relay.html">Configure OpenSMTPD to relay on a network</a></li>
<li><a href="https://dataswamp.org/~solene/2021-07-13-smtpd-rspamd.html">Filtering spam using Rspamd and OpenSMTPD on OpenBSD</a></li>
</ul>Créer un NAS maison avec un HP Data Vault2023-12-25T15:00:00+01:002023-12-25T15:00:00+01:00Vincent Financetag:blog.vinishor.xyz,2023-12-25:/posts/nas-hp-datavault.html<p>Un tutoriel pour expliquer comment convertir un NAS sous Windows Home Server en NAS tout à fait correct.</p><h2>Présentation du projet</h2>
<p>Au sein de mon infrastructure maison, j'avais besoin d'avoir un système centralisé pour stocker mes sauvegardes et partager des fichiers. C'est pour cela que je cherchais à me construire un vrai NAS, afin de remplacer mon ancienne machine fourre-tout et d'avoir une vraie machine dédiée au stockage.<br>
Pour autant, économies et écologie obligent, j'ai essayé de trouver du matériel d'occasion pour construire le NAS idéal. On tombe ainsi souvent sur des solutions toutes prêtes à base de Synology, de Netgear ou encore de QNAP. Or, même si ces solutions sont très pratiques et faciles à mettre en place, leur obsolescence est un problème sur le long-terme et ce type de NAS grand public peut être limité au niveau des fonctions et des programmes fournis.</p>
<p>Après quelques recherches, je suis finalement tombé sur quelque chose d'assez rare : <a href="https://support.hpe.com/hpesc/public/docDisplay?docId=c02263904&docLocale=en_US">un HP DataVault X510</a>. Il s'agit d'un petit NAS conçu par HP, pouvant contenir 4 disques durs et équipé de base avec <a href="https://fr.wikipedia.org/wiki/Windows_Home_Server">Windows Home Server</a>. Ce système étant désuet, non maintenu et assez limité, on peut se dire que ce genre de matériel n'est pas intéressant.<br>
Mais c'est justement tout l'inverse, car ces modèles fonctionnent un peu comme des PC classiques : le BIOS intégré peut démarrer automatiquement sur une clé USB si les disques durs sont absents, et il est possible d'augmenter la RAM installée, de changer le processeur, voire remplacer le système d'exploitation par quelque chose de plus récent. Cela permet ainsi de supprimer la limitation de 2 To par disque dur, imposée de manière logicielle par WHS, et d'avoir du matériel à jour et tout à fait capable de fonctionner. L'objectif de cet article est donc de vous montrer comment j'ai fait pour convertir ce matériel sous GNU/Linux.</p>
<p>Dans mon cas, le vendeur de cette machine avait déjà rajouté 2 Go de RAM sur les 2 Go existants et m'a offert un disque dur de 1 To pour le système, ce qui n'est pas négligeable.</p>
<p>Pour ce projet, je vais donc partir sur la chose suivante :</p>
<ul>
<li>Disque système : le disque de 1 To vendu avec la machine</li>
<li>Disques de données : trois disques de 2 To chacun</li>
<li>Technologie de réplication : RAID 5 logiciel</li>
<li>Système d'exploitation : Debian GNU/Linux 12</li>
</ul>
<h2>Installation du système d'exploitation de remplacement</h2>
<p>Avant de commencer, il est important de comprendre que sur les 4 disques durs, la machine cherche automatiquement à démarrer sur le disque 4 (celui tout en bas) avant de basculer sur le port USB et cela n'est pas changeable par défaut, sauf si on cherche à utiliser le port VGA interne. Pour utiliser un écran, il est nécessaire de récupérer le signal via un port propriétaire (ce qui est faisable en achetant une carte d'extension particulière). Ce n'est pas ce que je vais présenter ici.</p>
<p>Comme la machine ne fournit pas de connectique pour un écran, il est donc nécessaire d'installer notre système de remplacement sur le disque dur avant de le mettre dans la machine. Nous avons donc besoin de trois éléments pour faire cela :</p>
<ul>
<li>Le disque dur réservé au système</li>
<li>Un boîtier SATA pour disques au format 3,5 pouces</li>
<li>Une PC capable de faire tourner une machine virtuelle</li>
</ul>
<p>On commence par insérer le disque dur vierge dans le boîtier et on le connecte sur le PC hébergeant la machine virtuelle. On allume le boîtier et on l'ajoute en tant que périphérique USB dans la machine virtuelle via une allocation de ressources (QEMU/KVM via libvirt et VirtualBox sont capables de le faire en quelques clics). Ajouter ensuite le DVD de Debian GNU/Linux dans la machine virtuelle et la démarrer.</p>
<p>Au bout de quelques minutes, l'installateur s'affiche et on peut suivre les étapes comme on le ferait sur une installation classique de Debian. Dans la section <code>Partitionnement</code>, choisir alors le disque vierge dans le menu et créer un schéma d'installation selon le principe suivant :</p>
<ul>
<li>Une partition <code>/boot</code> de 1024 Mo, en ext4</li>
<li>Une partition <code>/</code> de 75 Go, en xfs</li>
<li>Une partition <code>/srv</code> pour stocker des <strong>données non importantes</strong>, en xfs</li>
</ul>
<p>Valider et lancer l'installation. Sur l'écran de sélection des logiciels à installer, ne choisir que <em>Serveur SSH</em> et <em>Utilitaires système</em>. Au bout de 10 minutes, l'installateur vous propose de redémarrer. Valider et sélectionner ensuite le disque dur externe dans le BIOS de votre hyperviseur virtuel pour démarrer dessus, afin de vérifier le fonctionnement. Une installation fraîche de Debian se lance et on peut maintenant passer à la suite.</p>
<h2>Configuration préliminaire</h2>
<h3>Cockpit</h3>
<p>Avant d'insérer le disque dur dans le NAS, nous allons installer quelques outils pour avoir une machine opérationnelle.</p>
<p>On met donc à jour notre système et on installe quelques utilitaires dont Cockpit :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>update<span class="w"> </span><span class="o">&&</span><span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>upgrade<span class="w"> </span>-y
$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span>htop<span class="w"> </span>rsync<span class="w"> </span>cockpit<span class="w"> </span>cockpit-storaged<span class="w"> </span>nginx
</code></pre></div>
<p>L'intérêt de Cockpit est de fournir une interface Web très pratique pour gérer son NAS et tous ses éléments, notamment pour la gestion des disques et les mises à jour. On va donc le configurer pour le rendre accessible depuis notre réseau local, comme sur un NAS du commerce. Ici, nous allons utiliser nginx comme <em>proxy inverse</em> (reverse proxy en anglais) pour utiliser Cockpit dans de bonnes conditions.</p>
<p>On crée donc un fichier de configuration dédié à Cockpit pour autoriser Nginx à faire les redirections nécessaires :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>nano<span class="w"> </span>/etc/cockpit/cockpit.conf
<span class="c1">## Configuration for Cockpit</span>
<span class="o">[</span>WebService<span class="o">]</span>
<span class="nv">Origins</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>https://nas.home.arpa<span class="w"> </span>wss://nas.home.arpa<span class="w"> </span><span class="c1">## Vous pouvez changer nas.home.arpa par ce qui vous plaît ou bien par l'adresse IP de la machine</span>
<span class="nv">ProtocolHeader</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>X-Forwarded-Proto
$<span class="w"> </span>sudo<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>cockpit.socket
$<span class="w"> </span>sudo<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>cockpit
</code></pre></div>
<p>On installe ensuite la configuration suivante dans le dossier <code>/etc/nginx/sites-available/</code> de la machine :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>vim<span class="w"> </span>/etc/nginx/sites-available/cockpit.conf
server<span class="w"> </span><span class="o">{</span>
<span class="w"> </span>listen<span class="w"> </span><span class="m">443</span><span class="w"> </span>ssl<span class="w"> </span>http2<span class="p">;</span>
<span class="w"> </span>listen<span class="w"> </span><span class="o">[</span>::<span class="o">]</span>:443<span class="w"> </span>ssl<span class="w"> </span>http2<span class="p">;</span>
<span class="w"> </span><span class="c1"># Nom de domaine</span>
<span class="w"> </span>server_name<span class="w"> </span>nas.home.arpa<span class="p">;</span><span class="w"> </span><span class="c1">## Vous pouvez changer cette partie par ce qui vous plaît ou bien par l'adresse IP de la machine</span>
<span class="w"> </span><span class="c1"># Options pour le certificat SSL</span>
<span class="w"> </span>ssl_certificate<span class="w"> </span>/etc/ssl/cockpit.crt<span class="p">;</span>
<span class="w"> </span>ssl_certificate_key<span class="w"> </span>/etc/ssl/private/cockpit.key<span class="p">;</span>
<span class="w"> </span><span class="c1"># Logs</span>
<span class="w"> </span>access_log<span class="w"> </span>/var/log/nginx/cockpit-access.log<span class="p">;</span>
<span class="w"> </span>error_log<span class="w"> </span>/var/log/nginx/cockpit-error.log<span class="p">;</span>
<span class="w"> </span><span class="c1"># Redirection for Cockpit</span>
<span class="w"> </span>location<span class="w"> </span>/<span class="w"> </span><span class="o">{</span>
<span class="w"> </span>proxy_pass<span class="w"> </span>https://127.0.0.1:9090<span class="p">;</span>
<span class="w"> </span>proxy_set_header<span class="w"> </span>Host<span class="w"> </span><span class="nv">$host</span><span class="p">;</span>
<span class="w"> </span>proxy_set_header<span class="w"> </span>X-Forwarded-Proto<span class="w"> </span><span class="nv">$scheme</span><span class="p">;</span>
<span class="w"> </span><span class="c1"># Required for web sockets to function</span>
<span class="w"> </span>proxy_http_version<span class="w"> </span><span class="m">1</span>.1<span class="p">;</span>
<span class="w"> </span>proxy_buffering<span class="w"> </span>off<span class="p">;</span>
<span class="w"> </span>proxy_set_header<span class="w"> </span>Upgrade<span class="w"> </span><span class="nv">$http_upgrade</span><span class="p">;</span>
<span class="w"> </span>proxy_set_header<span class="w"> </span>Connection<span class="w"> </span><span class="s2">"upgrade"</span><span class="p">;</span>
<span class="w"> </span><span class="c1"># Pass ETag header from Cockpit to clients.</span>
<span class="w"> </span><span class="c1"># See: https://github.com/cockpit-project/cockpit/issues/5239</span>
<span class="w"> </span>gzip<span class="w"> </span>off<span class="p">;</span>
<span class="w"> </span><span class="o">}</span>
<span class="o">}</span>
</code></pre></div>
<p>Générer un certificat auto-signé dans le dossier <code>/etc/ssl</code> et activer la configuration du nouveau site :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>openssl<span class="w"> </span>req<span class="w"> </span>-x509<span class="w"> </span>-newkey<span class="w"> </span>rsa:4096<span class="w"> </span>-keyout<span class="w"> </span>/etc/ssl/private/cockpit.key<span class="w"> </span>-out<span class="w"> </span>/etc/ssl/cockpit.crt<span class="w"> </span>-sha256<span class="w"> </span>-days<span class="w"> </span><span class="m">3650</span><span class="w"> </span>-nodes<span class="w"> </span>-subj<span class="w"> </span><span class="s2">"/C=FR/ST=Auvergne Rhone Alpes/L=Lyon/O=Automario/CN=nas.home.arpa"</span>
$<span class="w"> </span>sudo<span class="w"> </span>ln<span class="w"> </span>-s<span class="w"> </span>/etc/nginx/sites-available/cockpit.conf<span class="w"> </span>/etc/nginx/sites-enabled/cockpit.conf
</code></pre></div>
<p>Ici, le <em>CN=</em> correspond au nom de domaine présent dans la partie <em>server_name</em>, mais vous pouvez mettre une adresse IP à la place.</p>
<p>Vérifier la configuration de Nginx avant de le lancer :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>nginx<span class="w"> </span>-t
nginx:<span class="w"> </span>the<span class="w"> </span>configuration<span class="w"> </span>file<span class="w"> </span>/etc/nginx/nginx.conf<span class="w"> </span>syntax<span class="w"> </span>is<span class="w"> </span>ok
nginx:<span class="w"> </span>configuration<span class="w"> </span>file<span class="w"> </span>/etc/nginx/nginx.conf<span class="w"> </span><span class="nb">test</span><span class="w"> </span>is<span class="w"> </span>successful
</code></pre></div>
<p>Relancer Nginx pour charger la nouvelle configuration :</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>nginx
</code></pre></div>
<p>Ouvrir les ports 80 et 443 de votre pare-feu (via firewalld, iptables ou nftables) et tester l'URL définie dans Nginx. La page de connexion de Cockpit s'affiche alors et on peut tester le bon affichage de l'interface de Cockpit.</p>
<h3>Interface réseau ?</h3>
<p>Vu qu'on n'a pas d'interface graphique, il n'est pas facile de connaître le nom de l'interface réseau du NAS du premier coup. Pour pallier ce souci, j'édite le fichier <code>/etc/network/interfaces</code> pour ajouter plusieurs interfaces réseau comme ceci :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>nano<span class="w"> </span>/etc/network/interfaces
<span class="c1"># This file describes the network interfaces available on your system</span>
<span class="c1"># and how to activate them. For more information, see interfaces(5).</span>
<span class="nb">source</span><span class="w"> </span>/etc/network/interfaces.d/*
<span class="c1"># The loopback network interface</span>
auto<span class="w"> </span>lo
iface<span class="w"> </span>lo<span class="w"> </span>inet<span class="w"> </span>loopback
<span class="c1"># The primary network interface</span>
allow-hotplug<span class="w"> </span>enp1s0
iface<span class="w"> </span>enp1s0<span class="w"> </span>inet<span class="w"> </span>dhcp
allow-hotplug<span class="w"> </span>enp2s0
iface<span class="w"> </span>enp2s0<span class="w"> </span>inet<span class="w"> </span>dhcp
allow-hotplug<span class="w"> </span>enp3s0
iface<span class="w"> </span>enp3s0<span class="w"> </span>inet<span class="w"> </span>dhcp
allow-hotplug<span class="w"> </span>enp4s0
iface<span class="w"> </span>enp4s0<span class="w"> </span>inet<span class="w"> </span>dhcp
allow-hotplug<span class="w"> </span>enp5s0
iface<span class="w"> </span>enp5s0<span class="w"> </span>inet<span class="w"> </span>dhcp
</code></pre></div>
<p>S'il est vrai que c'est un peu artisanal, cette technique permet à Debian de lancer plusieurs tentatives de connexion en essayant de deviner le nom de l'interface réseau. La ligne <code>allow-hotplug</code> permet d'activer l'interface uniquement si elle est branchée, ce qui évite de la pollution inutile si on lance une commande de type <code>ip a show</code> après démarrage.</p>
<h2>Insertion du disque dans le NAS</h2>
<p>Une fois que tout est bon, éteindre la machine virtuelle, retirer le disque dur du boîtier et l'insérer dans le quatrième tiroir de la baie du NAS. Après insertion, on peut démarrer la machine pour vérifier que le disque est bien reconnu et que notre système se lance bien. Au bout de quelques minutes, la machine se connecte toute seule au réseau, mais on doit la retrouver manuellement.<br>
Deux solutions sont possibles : soit on se connecte sur l'interface de son routeur ou de sa box pour regarder quelles sont les IP attribuées récemment, soit on utilise le logiciel <code>nmap</code> pour faire un scan complet du réseau local et trouver une machine avec plusieurs ports ouverts : le port TCP/22, le port TCP/80 et le port TCP/443.</p>
<p>Une fois l'IP récupérée, on peut utiliser l'adresse <code>https://adresseipdelamachine/</code> pour se connecter sur Cockpit avec son compte utilisateur et apprécier le bon fonctionnement de notre NAS.</p>
<p><a href="/images/articles/computers/cockpit.png"><picture><source media="(min-width: 650px)" srcset="/images/miniatures/computers/cockpit.png"><source media="(max-width: 350px)" srcset="/images/mobile/computers/cockpit.png"><img alt="Capture d'écran de l'interface de Cockpit" src="/images/medium/computers/cockpit.png"/></picture></a></p>
<h2>Créer un périphérique RAID</h2>
<p>Après avoir vérifié l'accès au NAS, on peut l'éteindre pour installer les trois disques durs dans les baies restantes et relancer la machine. Une fois le serveur démarré, on utilise l'interface de Cockpit pour formater chaque disque ajouté et l'initialiser selon ces étapes :</p>
<ul>
<li>Sur l'écran principal de Cockpit, aller sur <em>Storage</em> (Stockage)</li>
<li>Dans la page <em>Storage</em>, il y a une section <em>Drives</em> qui liste les disques détectés. Cliquer sur un des trois nouveaux disques</li>
<li>Si le disque n'est pas initialisé, cliquer sur le bouton <strong>Create partition table</strong></li>
<li>Dans la section <em>Partitions</em>, utiliser le bouton <strong>Format</strong> pour créer une partition vide sans système de fichiers</li>
</ul>
<p>Si besoin, la documentation de référence se trouve dans les notes de bas de page.</p>
<p>Une fois que l'initialisation est terminée, on peut créer un périphérique RAID et le monter automatiquement :</p>
<ul>
<li>Sur l'écran principal de Cockpit, aller sur <em>Storage</em> (Stockage)</li>
<li>Dans la page <em>Storage</em>, il y a une section <em>Devices</em> qui liste les périphériques RAID présents. Cliquer sur le bouton en burger et choisir <strong>Create RAID device</strong></li>
<li>Laisser le nom par défaut, choisir le mode <strong>RAID 5</strong> et cocher les trois cases qui s'affichent pour inclure les trois disques. Valider en cliquant sur <strong>Create</strong></li>
<li>Dans la section <em>Filesystem</em>, cliquer sur la nouvelle ligne commençant par <strong>/dev/md</strong>. Il s'agit de notre RAID nouvellement créé.</li>
<li>Dans la section <em>Content</em>, cliquer sur la ligne présente pour créer une nouvelle partition de données avec les options suivantes :</li>
<li>Système de fichiers (<em>Filesystem</em>) : XFS (un peu mieux par rapport à Ext4)</li>
<li>Point de montage (<em>Mount point</em>) : <code>/share</code></li>
</ul>
<p>Si besoin, vous pouvez utiliser le bouton <em>Mount</em> pour monter la partition. Cela activera alors son montage automatique lors du démarrage du NAS.</p>
<p>La documentation de référence pour cette partie est également présente dans les notes de bas de page.</p>
<h2>Faire des partages de fichiers avec NFS</h2>
<p>NFS est un protocole de partage de fichiers pour les systèmes de type Unix et dérivés, bien qu'il soit compatible avec MacOS et Windows. Il est souvent utilisé pour monter des chemins réseau ou encore des dossiers de sauvegarde. Chez moi, je m'en sers principalement pour partager mes fichiers entre mes machines Linux et pour stocker les sauvegardes quotidiennes de mes machines virtuelles sous Proxmox.</p>
<p>Pour installer NFS, il suffit d'installer le module du noyau Linux via APT :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>-y<span class="w"> </span>install<span class="w"> </span>nfs-kernel-server
</code></pre></div>
<p>On configure ensuite deux fichiers : <code>/etc/idmapd.conf</code> et <code>/etc/exports</code>.<br>
Le premier sert notamment à définir quelques options pour les versions 3 et 4 du protocole. Nous allons juste modifier la ligne <code>Domain</code> pour utiliser le domaine local (chez moi, j'utilise <code>home.arpa</code>) :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>vim<span class="w"> </span>/etc/idmapd.conf
<span class="nv">Domain</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"home.arpa"</span>
</code></pre></div>
<p>Le deuxième fichier est la partie centrale du serveur NFS : c'est lui qui gère les partages réseaux et les autorisations. Sous NFS, il n'y a pas d'identification par mot de passe, mais on peut restreindre les accès en autorisant des plages réseau. Dans mon cas, je vais mettre en place deux partages sur mon NAS : un pour les sauvegardes de machines et un pour partager mes films entre nos PC portables. Cela donne donc quelque chose comme l'exemple suivant :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>vim<span class="w"> </span>/etc/exports
<span class="c1">## NFS exports configuration</span>
/share/nfs/vms<span class="w"> </span><span class="m">10</span>.10.10.3/32<span class="o">(</span>rw,sync,no_root_squash<span class="o">)</span><span class="w"> </span><span class="m">10</span>.10.10.5/32<span class="o">(</span>rw,sync,no_root_squash,no_subtree_check<span class="o">)</span>
/share/movies<span class="w"> </span><span class="m">10</span>.10.20.0/24<span class="o">(</span>rw,sync,no_root_squash,no_subtree_check
</code></pre></div>
<p>On crée également les deux dossiers pour s'assurer qu'il existe bien et une fois que tout est bon, on peut activer les services liés à NFS : </p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>mkdir<span class="w"> </span>-p<span class="w"> </span>/share/nfs/vms<span class="w"> </span><span class="o">&&</span><span class="w"> </span>sudo<span class="w"> </span>mkdir<span class="w"> </span>-p<span class="w"> </span>/share/movies
$<span class="w"> </span>sudo<span class="w"> </span>systemctl<span class="w"> </span><span class="nb">enable</span><span class="w"> </span>nfs-server<span class="w"> </span>nfs-idmapd
$<span class="w"> </span>sudo<span class="w"> </span>systemctl<span class="w"> </span>restart<span class="w"> </span>nfs-server<span class="w"> </span>nfs-idmapd
</code></pre></div>
<p>On peut vérifier que tout est correct en utilisant la commande <code>showmount --exports x.x.x.x</code> pour afficher les montages disponibles :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>showmount<span class="w"> </span>--exports<span class="w"> </span>nas.home.arpa
Export<span class="w"> </span>list<span class="w"> </span><span class="k">for</span><span class="w"> </span>nas.home.arpa:
/share/movies<span class="w"> </span><span class="m">10</span>.10.20.0/24
/share/nfs/vms<span class="w"> </span><span class="m">10</span>.10.10.5/32,10.10.10.6/32,10.10.10.3/32
</code></pre></div>
<p>Si vous rééditez le fichier des exports NFS, il est nécessaire de recharger son contenu pour prise en compte. Cela peut se faire directement via la commande <code>exportfs</code> :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>exportfs<span class="w"> </span>-ra
</code></pre></div>
<h2>Conclusion</h2>
<p>Avec cet article, vous pouvez désormais, vous aussi, convertir ce genre de vieux NAS HP sous quelque chose d'utilisable au quotidien et de tout aussi moderne qu'un NAS grand public. Cela demande un peu plus de maintenance, mais le fonctionnement est tout aussi pratique à l'aide de Cockpit. Je n'ai pas abordé la partie Samba pour gérer des partages sous Windows, mais il existe de nombreux tutoriels pour mettre en place ce type de partages.</p>
<hr>
<p>Sources utilisées :</p>
<ul>
<li><a href="https://garrett.github.io/cockpit-project.github.io/external/wiki/Proxying-Cockpit-over-NGINX">Proxying Cockpit over NGINX</a> (en anglais)</li>
<li><a href="https://www.server-world.info/en/note?os=Debian_12&p=nfs&f=1">Configuration de NFS sous Debian</a> (en anglais)</li>
<li><a href="https://access.redhat.com/documentation/fr-fr/red_hat_hyperconverged_infrastructure_for_virtualization/1.5/html/managing_red_hat_gluster_storage_using_cockpit/assembly-cockpit-mgmt-disk_drive#task-cockpit-formatting-disk-partition">Formattage de partitions sous Cockpit</a> (en anglais)</li>
<li><a href="https://access.redhat.com/documentation/fr-fr/red_hat_hyperconverged_infrastructure_for_virtualization/1.5/html/managing_red_hat_gluster_storage_using_cockpit/assembly-cockpit-managing_raid">Gérer le RAID avec Cockpit</a> (en anglais)</li>
</ul>Monter un PIKVM pour son infra2023-10-19T10:00:00+02:002023-10-19T10:00:00+02:00Vincent Financetag:blog.vinishor.xyz,2023-10-19:/posts/monter-un-pikvm-pour-son-infra.html<p>Un tutoriel assez complet pour mettre en place son propre KVM sur IP et pour pouvoir accéder à ses machines (hyperviseurs) comme si on était devant elles !</p><h2>Contexte de cet article</h2>
<p>Jusqu'à présent, je n'ai jamais eu affaire à de gros problèmes physiques sur mes serveurs, si ce n'est un problème de disque dur qui tombe en panne il y a longtemps. Néanmoins, il est toujours bon de mettre en place une solution de secours avant que tout ne tombe en panne et c'est toujours pratique d'avoir un visuel sur l'interface physique de ses serveurs.<br>
Sur des machines de gamme professionnelle, on utilise généralement iDRAC ou bien IPMI, une interface graphique qui permet d'avoir un visuel rapide sur le matériel et le BIOS de la machine, le tout sur un réseau dédié (en général, sur un réseau de management). Sur une machine grand public, ce genre d'interface n'existe pas et il est donc impossible d'avoir accès au BIOS depuis le réseau. Pour pallier ce problème, il existe heureusement une solution : un KVM sur IP.</p>
<p>Un KVM (ou switch KVM) est une interface déportée qui permet d'avoir un retour écran et un contrôle clavier souris sur une machine sans avoir besoin de se brancher directement sur ladite machine, le KVM étant lui-même branché dessus. Si vous êtes allé dans un datacenter ou <a href="https://blog.ataxya.net/bienvenue-chez-ataxyasr/">chez Cécile</a>, vous avez peut-être remarqué la présence d'une espèce de "PC portable" rangé dans un rack : ceci est un exemple de KVM.<br>
Un KVM sur IP, c'est donc la même chose qu'un KVM tout en rajoutant un module réseau : cela permet de se connecter dessus via un autre ordinateur pour effectuer de la maintenance (pratique quand on n'est pas sur place). Ce genre d'équipement est en général assez cher, mais il existe deux excellentes solutions : PIKVM et Tinypilot.</p>
<p><a href="https://pikvm.org/">PIKVM</a> et <a href="https://tinypilotkvm.com/">Tinypilot</a> sont des projets open-source qui consistent à transformer un Raspberry Pi en KVM sur IP et donner ainsi un accès physique à sa machine via le réseau. Ils offrent aussi la possibilité d'utiliser un VPN pour pouvoir y accéder depuis Internet, de manière sécurisée. Dans mon cas, je vais m'intéresser au projet PIKVM, car celui-ci offre une large gamme de cartes compatibles et il a l'avantage de ne pas avoir besoin de licence pour fonctionner. Pour la partie matérielle, je suis parti sur une base de Raspberry Pi Zero 2W pour avoir un truc discret et peu gourmand, sachant que la latence n'est pas un problème pour moi. Je vais aussi rajouter un switch KVM matériel pour pouvoir contrôler plus d'une machine directement depuis la carte.</p>
<p>Voici donc un schéma du résultat final :</p>
<p><a href="/images/articles/computers/kvm.png"><picture><source media="(min-width: 650px)" srcset="/images/miniatures/computers/kvm.png"><source media="(max-width: 350px)" srcset="/images/mobile/computers/kvm.png"><img alt="Schéma de fonctionnement de mon PIKVM" src="/images/medium/computers/kvm.png"/></picture></a></p>
<h2>Prérequis</h2>
<p>Voici donc les éléments nécessaires pour ce projet :</p>
<ul>
<li>Un Raspberry Pi Zero 2W (le Zero n'est plus supporté par le projet, depuis l'abandon de l'architecture ARMv6)</li>
<li>Un <a href="https://www.amazon.fr/dp/B09H2N99VL">module HDMI vers CSI</a> pour capturer le signal vidéo</li>
<li>Deux câbles USB vers micro-USB (un pour l'alimentation, un autre pour la partie USB OTG)</li>
<li>Une carte microSD (minimum 8 Go)</li>
<li>Un boitier de protection (ici, imprimé avec une imprimante 3D)</li>
<li>Un switch KVM HDMI pour utiliser le PIKVM avec plusieurs machines</li>
</ul>
<h2>Assemblage</h2>
<p>Le module HDMI est livré avec des vis, deux entretoises et deux nappes de connexion, une pour les Raspberry Pi classiques (versions 2, 3, 4) et une pour les versions Zero. Il suffit alors de connecter le grand embout de la nappe dans le module HDMI et le petit embout dans le port CSI du Raspberry Pi Zero 2W (celui se trouvant sur le côté opposé au port de carte microSD).<br>
On peut utiliser les deux entretoises pour visser les deux cartes ensemble, mais j'ai opté pour visser le tout directement dans un <a href="https://www.printables.com/fr/model/544939-pikvm-case-pi-zero-2-w-and-csi-2-board">boîtier imprimé</a> en 3D.</p>
<p><a href="/images/articles/computers/montage-pikvm.jpg"><picture><source media="(min-width: 650px)" srcset="/images/miniatures/computers/montage-pikvm.jpg"><source media="(max-width: 350px)" srcset="/images/mobile/computers/montage-pikvm.jpg"><img alt="Photo du montage physique de mon PIKVM" src="/images/medium/computers/montage-pikvm.jpg"/></picture></a></p>
<p>On branche enfin le câble HDMI du KVM sur le port HDMI du module et le câble USB OTG sur le port USB du KVM (de préférence, celui pour le clavier). Le câble d'alimentation peut se brancher soit sur une alimentation dédiée, soit sur un des ports USB d'une machine physique (de préférence, sur ceux qui sont toujours alimentés).</p>
<h2>Installation du logiciel</h2>
<p>Une fois le matériel assemblé, on peut passer à la partie installation. Sur le site de <a href="https://pikvm.org/">PIKVM</a>, on récupère la <a href="https://pikvm.org/download/">dernière version</a> de l'image pour les Raspberry Pi Zero 2W. Le fichier se nomme <code>v2-hdmi-zero2w-latest.img.xz</code>.<br>
On décompresse le fichier téléchargé et on recopie l'image sur une carte microSD à l'aide d'un logiciel dédié. Sous GNU/Linux, Gnome Disks fait largement l'affaire pour ce genre de tâches, mais on peut aussi utiliser BalenaEtcher.</p>
<p>Une fois les données copiées, il est important de monter la première partition (celle qui contient le terme <em>BOOT</em>) pour activer le Wi-Fi lors du premier démarrage. Par défaut, le Raspberry Pi Zero et ses dérivés n'activent pas le Wi-FI et il est donc impossible de se connecter dessus sans adaptateur physique.</p>
<p>Après montage de cette partition, on recherche le fichier nommé <code>pikvm.txt</code> et on ajoute les deux options suivantes pour permettre au Pi de se connecter au premier lancement :</p>
<div class="highlight"><pre><span></span><code><span class="nv">FIRST_BOOT</span><span class="o">=</span><span class="m">1</span>
<span class="nv">WIFI_ESSID</span><span class="o">=</span><span class="s2">"monssid"</span>
<span class="nv">WIFI_PASSWD</span><span class="o">=</span><span class="s2">"monmotdepasse"</span>
</code></pre></div>
<p>On peut ensuite retirer la carte microSD et l'insérer dans la fente du Zero 2W. On connecte ensuite les deux câbles USB aux ports du Raspberry (le câble dédié à l'alimentation dans le port indiqué comme <em>PWR IN</em>) et on attend quelques minutes le temps que le logiciel s'initialise et agrandisse la partition système. Une fois cela fait, la carte se connecte en Wi-fi et on peut scanner son réseau pour trouver la carte.<br>
Dans mon cas, <a href="https://blog.vinishor.xyz/posts/configurer-un-routeur-mikrotik-sur-une-fibre-ftth-milkywan.html">Winbox</a> permet d'afficher les baux DHCP actuellement utilisés.</p>
<p>Une fois l'adresse IP récupérée, on peut la taper dans son navigateur préféré pour obtenir l'interface web de PIKVM. Le logiciel utilise un certificat auto-signé donc vous aurez un avertissement de sécurité que vous pourrez ignorer ici. Le couple <code>admin / admin</code> sera votre ami pour le premier accès.</p>
<p><a href="/images/articles/computers/pikvm.png"><picture><source media="(min-width: 650px)" srcset="/images/miniatures/computers/pikvm.png"><source media="(max-width: 350px)" srcset="/images/mobile/computers/pikvm.png"><img alt="Capture d'écran de l'interface de PIKVM dans Firefox" src="/images/medium/computers/pikvm.png"/></picture></a></p>
<h2>Configuration</h2>
<p>Une fois que tout est OK et que l'interface s'affiche, on va passer par un peu de configuration pour assurer nos arrières et être tranquille.</p>
<h3>Mise en place du réseau</h3>
<p>Vu que la modification faite plus haut est temporaire, on va s'assurer que la carte se connecte toute seule au démarrage. On va donc vérifier les paramètres de la carte réseau et ajouter le nécessaire pour que le Wi-Fi soit actif automatiquement. On peut alors utiliser une connexion SSH ou bien le Terminal de l'interface web pour taper les commandes suivantes (le mot de passe par défaut est <code>root</code>) :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>su<span class="w"> </span>-
<span class="c1"># rw</span>
<span class="c1"># cat /etc/systemd/network/wlan0.network </span>
<span class="c1"># wpa_passphrase monssid 'maclewpa' > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf</span>
<span class="c1"># systemctl enable wpa_supplicant@wlan0.service</span>
<span class="c1"># ro</span>
<span class="c1"># reboot</span>
</code></pre></div>
<p>Pour l'anecdote, le système de fichiers est monté par défaut en lecteur seule, ce qui explique pourquoi on doit taper <code>rw</code> avant chaque modification ou mise à jour sur la machine.</p>
<p>Après redémarrage, la carte se reconnecte de nouveau automatiquement et il est maintenant possible de s'en servir sans problèmes.</p>
<h3>Un peu de sécurité</h3>
<p>La sécurité, c'est toujours important, surtout sur ce genre d'équipements critiques. On va donc changer quelques mots de passe et modifier l'authentification SSH pour l'utilisateur <code>root</code>, afin de n'utiliser que des clés SSH :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># rw</span>
<span class="c1"># passwd root</span>
<span class="c1"># kvmd-htpasswd set admin</span>
<span class="c1"># mkdir ~/.ssh</span>
<span class="c1"># vim > ~/.ssh/authorized_keys</span>
<span class="c1">##### [ici, mettez vos clés]</span>
<span class="c1"># vim /etc/ssh/sshd_config</span>
<span class="o">(</span>...<span class="o">)</span>
PermitRootLogin<span class="w"> </span>prohibit-password
<span class="o">(</span>...<span class="o">)</span>
PasswordAuthentication<span class="w"> </span>no
<span class="c1"># systemctl restart sshd kvmd kvmd-nginx</span>
<span class="c1"># ro</span>
</code></pre></div>
<p>Une déconnexion de l'interface Web peut survenir alors. Il suffit de se reconnecter avec le nouveau mot de passe pour retrouver un accès fonctionnel. On peut donc maintenant utiliser notre système sur un réseau plus ouvert, tout en sachant qu'il est fortement déconseillé de l'ouvrir directement sur Internet. Dans mon cas, il est derrière mon routeur et n'est accessible de l'extérieur qu'avec un <a href="https://blog.vinishor.xyz/posts/Configurer-vpn-wireguard.html">VPN Wireguard</a>.</p>
<h3>Mise à jour</h3>
<p>Une fois que tout est configuré, on peut lancer une mise à jour complète du système :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># rw</span>
<span class="c1"># pacman -Syu</span>
<span class="c1"># reboot</span>
</code></pre></div>
<p>Le projet étant basé sur ArchLinux ARM, il est normal de retrouver ici le gestionnaire de paquets Pacman. Cela n'entrave heureusement pas la stabilité du logiciel ou son efficacité. Sur un Raspberry Pi Zero, les mises à jour sont plus lentes du fait des limitations de la carte. C'est d'ailleurs un point mentionné dans la documentation en ligne.</p>
<h3>Du Wake-On-LAN ?</h3>
<p>En plus de ces options de base, il est possible de rajouter quelques options supplémentaires dans le menu de l'application via un fichier particulier, qui est notamment utilisé pour utiliser le port GPIO des Raspberry Pi. Parmi ces options, on peut effectuer du Wake-On-LAN : il s'agit d'une méthode permettant d'allumer un ordinateur à distance en utilisant la carte réseau (ce qui explique pourquoi les PC récents ont toujours leur carte réseau allumée même s'ils sont éteints). On envoie un paquet dédié (ou "magic packet") sur l'adresse MAC de l'interface filaire et celle-ci, à sa réception, envoie un signal sur la carte mère pour démarrer la machine.</p>
<p>Dans PIKVM, il est possible d'éditer le fichier <code>/etc/kvmd/override.yaml</code> et d'ajouter une section pour lancer des commandes de Wake-On-LAN depuis le menu de l'interface Web, comme ceci :</p>
<div class="highlight"><pre><span></span><code><span class="nt">kvmd</span><span class="p">:</span>
<span class="w"> </span><span class="nt">gpio</span><span class="p">:</span>
<span class="w"> </span><span class="nt">drivers</span><span class="p">:</span>
<span class="w"> </span><span class="nt">wol_server1</span><span class="p">:</span>
<span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">wol</span>
<span class="w"> </span><span class="nt">mac</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ff:ff:ff:ff:ff:f1</span>
<span class="w"> </span><span class="nt">wol_server2</span><span class="p">:</span>
<span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">wol</span>
<span class="w"> </span><span class="nt">mac</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ff:ff:ff:ff:ff:f2</span>
<span class="w"> </span><span class="nt">wol_server3</span><span class="p">:</span>
<span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">wol</span>
<span class="w"> </span><span class="nt">mac</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ff:ff:ff:ff:ff:f3</span>
<span class="w"> </span><span class="nt">scheme</span><span class="p">:</span>
<span class="w"> </span><span class="nt">wol_server1</span><span class="p">:</span>
<span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">wol_server1</span>
<span class="w"> </span><span class="nt">pin</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
<span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
<span class="w"> </span><span class="nt">switch</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class="w"> </span><span class="nt">wol_server2</span><span class="p">:</span>
<span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">wol_server2</span>
<span class="w"> </span><span class="nt">pin</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
<span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
<span class="w"> </span><span class="nt">switch</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class="w"> </span><span class="nt">wol_server3</span><span class="p">:</span>
<span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">wol_server3</span>
<span class="w"> </span><span class="nt">pin</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
<span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
<span class="w"> </span><span class="nt">switch</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class="w"> </span><span class="nt">view</span><span class="p">:</span>
<span class="w"> </span><span class="nt">header</span><span class="p">:</span>
<span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Wake-on-Lan</span><span class="w"> </span><span class="c1"># The menu title</span>
<span class="w"> </span><span class="nt">table</span><span class="p">:</span><span class="w"> </span><span class="c1"># The menu items are rendered in the form of a table of text labels and controls</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"#Narodnaia"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"wol_server1|Send</span><span class="nv"> </span><span class="s">Wake-on-LAN"</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"#Raoulblanchard"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"wol_server2|Send</span><span class="nv"> </span><span class="s">Wake-on-LAN"</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"#Windows"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"wol_server3|Send</span><span class="nv"> </span><span class="s">Wake-on-LAN"</span><span class="p p-Indicator">]</span>
</code></pre></div>
<p>Après redémarrage de l'interface de KVMD (soit <code>sudo systemctl restart kvmd kvmd-nginx</code>), un nouveau menu s'affiche et on peut maintenant envoyer nos commandes en un clic.</p>
<h2>Conclusion</h2>
<p>Avec ceci, je peux maintenant contrôler l'ensemble de mes machines depuis l'extérieur et faire des diagnostics matériels plus facilement. En cas de coupure de courant, les onduleurs peuvent revenir en ligne tout seuls et donc rallumer l'alimentation nécessaire pour le PIKVM. Ce dernier peut ensuite relancer les machines via le Wake-On-LAN configuré plus haut et je peux donc être complètement autonome, même sans être à la maison !</p>
<hr>
<p>Sources pour cet article : <a href="https://www.tumfatig.net/2022/pikvm-using-a-raspberry-pi-zero-2w/#the-software">PiKVM using a Raspberry Pi Zero 2W</a></p>Configurer un VPN Wireguard2023-07-29T21:00:00+02:002023-07-29T21:00:00+02:00Vincent Financetag:blog.vinishor.xyz,2023-07-29:/posts/Configurer-vpn-wireguard.html<p>Un tutoriel assez complet pour mettre en place un VPN sous Wireguard avec un routeur Mikrotik et plusieurs clients</p><h2>Contexte de cet article</h2>
<p>En plus de mes machines locales, je possède plusieurs serveurs virtuels (ou VPS), afin d'assurer une bonne redondance pour mes DNS et mes serveurs mails en cas de panne réseau. Pour autant, cela me demande d'effectuer de la surveillance sur ces machines et je n'avais pas envie d'exposer mes sondes directement sur Internet. J'ai donc choisi de mettre en place un VPN entre mes machines extérieures et mon routeur, afin que seul le trafic interne passe par une interface sécurisée. La technologie que j'ai retenue est Wireguard, par sa simplicité d'utilisation, sa compatibilité avec l'ensemble de mes systèmes et sa robustesse.<br>
Je vais également en profiter pour me créer un deuxième accès VPN qui sera utilisé par plusieurs machines lors de mes déplacements, en l'occurrence mon PC portable et mon iPhone.</p>
<h3>Réseaux à mettre en place</h3>
<p>Ici, je vais mettre en place deux interfaces de VPN :</p>
<ul>
<li>un VPN d'infrastructure pour mon monitoring (préfixe en 172.16.10.0/24)</li>
<li>un VPN de gestion, que j'utilise lorsque je suis en déplacement (préfixe en 172.16.0.0/24)</li>
</ul>
<p>Vu le nombre de machines à connecter, un serveur DHCP ne sera pas nécessaire et les IP des clients seront définies à la main.</p>
<h2>Prérequis</h2>
<p>Pour cette installation, voici les éléments nécessaires :</p>
<ul>
<li>Un serveur Wireguard, ici mon routeur Mikrotik</li>
<li>Plusieurs clients Wireguard : deux sous OpenBSD et un sous Debian GNU/Linux</li>
<li>Des préfixes dédiés pour le VPN : 172.16.0.0/24 et 172.16.10.0/24 dans mon cas</li>
</ul>
<h2>Mise en place du serveur</h2>
<p>Mikrotik fournit nativement un module pour utiliser Wireguard sous RouterOS. Il est activé par défaut et il peut se configurer via l'interface graphique ou via la console. Ici, nous allons nous concentrer sur l'usage de la console pour des raisons de simplicité.</p>
<p>On commence par créer deux interfaces réseaux dédiées à Wireguard et ajouter deux adresses IP pour définir les futurs préfixes de nos clients :</p>
<div class="highlight"><pre><span></span><code>/interface<span class="w"> </span>wireguard<span class="w"> </span>add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>wg0<span class="w"> </span>listen-port<span class="o">=</span><span class="m">60002</span>
/interface<span class="w"> </span>wireguard<span class="w"> </span>add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>wg1<span class="w"> </span>listen-port<span class="o">=</span><span class="m">60001</span>
/ip<span class="w"> </span>address<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">172</span>.16.0.1/24<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>wg0
/ip<span class="w"> </span>address<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">172</span>.16.10.1/24<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>wg1
</code></pre></div>
<p>On affiche ensuite les informations des interfaces avec la commande <code>print</code> pour récupérer la clé publique du serveur. Cela nous servira par la suite pour préparer la configuration de nos clients :</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span>vinishor@mikrotik<span class="o">]</span><span class="w"> </span>/interface/wireguard><span class="w"> </span>/interface/wireguard<span class="w"> </span>print
Flags:<span class="w"> </span>X<span class="w"> </span>-<span class="w"> </span>disabled<span class="p">;</span><span class="w"> </span>R<span class="w"> </span>-<span class="w"> </span>running
<span class="w"> </span><span class="m">0</span><span class="w"> </span>R<span class="w"> </span><span class="nv">name</span><span class="o">=</span><span class="s2">"wg0"</span><span class="w"> </span><span class="nv">mtu</span><span class="o">=</span><span class="m">1492</span><span class="w"> </span>listen-port<span class="o">=</span><span class="m">60002</span><span class="w"> </span>private-key<span class="o">=</span><span class="s2">"cleprivee="</span>
<span class="w"> </span>public-key<span class="o">=</span><span class="s2">"masuperclepublique="</span>
<span class="w"> </span><span class="m">1</span><span class="w"> </span>R<span class="w"> </span><span class="nv">name</span><span class="o">=</span><span class="s2">"wg1"</span><span class="w"> </span><span class="nv">mtu</span><span class="o">=</span><span class="m">1492</span><span class="w"> </span>listen-port<span class="o">=</span><span class="m">60001</span><span class="w"> </span>private-key<span class="o">=</span><span class="s2">"cleprivee2e="</span>
<span class="w"> </span>public-key<span class="o">=</span><span class="s2">"ma2esuperclepublique="</span>
</code></pre></div>
<p>On passe maintenant à la partie pare-feu. Le but est alors d'ouvrir les ports dédiés à Wireguard et autoriser le passage du trafic du VPN. Je vais aussi en profiter pour autoriser le <a href="https://blog.vinishor.xyz/posts/configurer-un-routeur-mikrotik-sur-une-fibre-ftth-milkywan.html" title="Lien vers mon article pour configurer un routeur Mikrotik">VLAN 10</a>, réservé à mes serveurs maison, à aller vers les machines du VPN d'infrastructure, pour que la machine de monitoring puisse aller interroger les sondes de surveillance.<br>
Les adresses IP des serveurs externes étant fixes, on peut aussi mettre en place une liste pour limiter l'accès au VPN d'infra à ces seules adresses.</p>
<p>Cela donne donc les commandes suivantes :</p>
<div class="highlight"><pre><span></span><code>/ip/firewall/address-list
add<span class="w"> </span><span class="nv">list</span><span class="o">=</span>wg-infra<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">172</span>.16.10.0/24
add<span class="w"> </span><span class="nv">list</span><span class="o">=</span>wireguard<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">172</span>.16.0.0/24
add<span class="w"> </span><span class="nv">list</span><span class="o">=</span>allowed-servers<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">45</span>.xx.xx.xx/32
add<span class="w"> </span><span class="nv">list</span><span class="o">=</span>allowed-servers<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">46</span>.xx.xx.xx/32
add<span class="w"> </span><span class="nv">list</span><span class="o">=</span>allowed-servers<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">89</span>.xx.xx.xx/32
add<span class="w"> </span><span class="nv">list</span><span class="o">=</span>allowed-servers<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">46</span>.yy.yy.yy/32
/ip/firewall/filter
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>udp<span class="w"> </span>dst-port<span class="o">=</span><span class="m">60001</span><span class="w"> </span>src-address-list<span class="o">=</span>allowed-servers
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>udp<span class="w"> </span>dst-port<span class="o">=</span><span class="m">60002</span>
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span>src-address-list<span class="o">=</span>wg-infra
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span>src-address-list<span class="o">=</span>vlan10<span class="w"> </span>dst-address-list<span class="o">=</span>wg-infra
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span>src-address-list<span class="o">=</span>wireguard
</code></pre></div>
<h3>Ajouter un client sur l'interface du serveur (peer)</h3>
<p>Le protocole de Wireguard impose d'ajouter des deux côtés les machines qui souhaitent communiquer entre elles. Cela évite ainsi d'échanger des mots de passe ou tout autre donnée en clair sur le réseau. Dans cette section, je vais donc vous donner les instructions pour ajouter un client sur l'interface voulue. Il est possible de jouer la commande plusieurs fois, en fonction du nombre de clients à rajouter.</p>
<p>Il est aussi nécessaire de connaître la clé publique du client pour l'ajouter correctement (je vous expliquerai par la suite comment faire pour la générer).</p>
<p>Pour ajouter un client sur l'interface wireguard, on entre la commande suivante :</p>
<div class="highlight"><pre><span></span><code>/interface/wireguard/peers
add<span class="w"> </span>allowed-address<span class="o">=</span><span class="m">172</span>.16.10.2/32<span class="w"> </span>endpoint-port<span class="o">=</span><span class="m">60001</span><span class="w"> </span><span class="nv">interface</span><span class="o">=</span>wg1<span class="w"> </span>public-key<span class="o">=</span><span class="s2">"zzzzzzzzzzzz"</span>
<span class="c1"># Si on l'ajoute sur la deuxième interface</span>
add<span class="w"> </span>allowed-address<span class="o">=</span><span class="m">172</span>.16.0.6/32<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>wg0<span class="w"> </span>public-key<span class="o">=</span><span class="s2">"uuuuuuuuuuuuuuuuuuuuuuuu"</span>
</code></pre></div>
<p>L'option <code>endpoint-port</code> permet de choisir le port dédié à wireguard sur le client. Cela peut être pratique sur un serveur, afin d'ouvrir le strict nécessaire au niveau du pare-feu. On peut aussi spécifier une adresse précise en rajoutant l'option <code>endpoint-address</code>.<br>
Dans le cas de mon VPN de gestion, je ne spécifie ni le port, ni l'adresse, car les smartphones utilisent souvent des adresses provenant d'un <a href="https://fr.wikipedia.org/wiki/Carrier-grade_NAT" title="Article Wikipedia sur le CGNAT">CG-NAT</a> et leur pare-feu n'est pas facilement contrôlable. C'est bien le couple de clés que l'on indique dans la configuration qui permet l'authentification de l'accès et qui assure la sécurité.</p>
<h2>Mise en place des clients</h2>
<p>Maintenant que le serveur est en place, nous allons connecter nos machines clientes, afin que celles-ci puissent communiquer entre elles et avec les autres machines situées sur mon réseau à la maison.</p>
<h3>Exemples pour un serveur à surveiller</h3>
<h4>Sous Debian GNU/Linux</h4>
<p>Installer Wireguard avec l'aide de apt :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>wireguard-tools
</code></pre></div>
<p>Générer les clés privée et publique du client pour pouvoir se connecter par la suite :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>-i
<span class="c1"># mkdir /etc/wireguard && cd /etc/wireguard</span>
<span class="c1"># wg genkey | tee privatekey | wg pubkey > publickey</span>
</code></pre></div>
<p>Créer un fichier de configuration pour l'interface dédiée à Wireguard en ajoutant les paramètres pour se connecter au serveur :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># cat << EOF > /etc/wireguard/wg0.conf</span>
<span class="o">[</span>Interface<span class="o">]</span>
<span class="nv">Address</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">172</span>.16.10.2/24
<span class="nv">SaveConfig</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
<span class="nv">ListenPort</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">60001</span>
<span class="nv">PrivateKey</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>xxxxxxxxxxxxxx<span class="w"> </span><span class="c1"># cat privatekey</span>
<span class="o">[</span>Peer<span class="o">]</span>
<span class="nv">PublicKey</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>yyyyyyyyyy<span class="w"> </span><span class="c1"># clé publique du serveur Wireguard (obtenue avec /interface/wireguard print)</span>
<span class="nv">AllowedIPs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">172</span>.16.10.0/24,10.10.10.0/24
<span class="nv">Endpoint</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>x.x.x.x:60001<span class="w"> </span><span class="c1"># Adresse publique du routeur</span>
EOF
</code></pre></div>
<p>Importer la configuration en utilisant l'utilitaire wg-quick, vu que l'option SaveConfig sauvegardera cette dernière pour les prochains redémarrages de la machine :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># wg-quick up wg0</span>
</code></pre></div>
<p>La commande rajoute alors une nouvelle interface réseau et initie la connexion avec le routeur Mikrotik pour monter le VPN. Pour vérifier que tout fonctionne, on peut lister les interfaces réseaux et essayer de faire un ping vers une machine située sur le réseau local :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>ip<span class="w"> </span>-c<span class="w"> </span>a<span class="w"> </span>show
...
<span class="m">8</span>:<span class="w"> </span>wg0:<span class="w"> </span><POINTOPOINT,NOARP,UP,LOWER_UP><span class="w"> </span>mtu<span class="w"> </span><span class="m">1420</span><span class="w"> </span>qdisc<span class="w"> </span>noqueue<span class="w"> </span>state<span class="w"> </span>UNKNOWN<span class="w"> </span>group<span class="w"> </span>default<span class="w"> </span>qlen<span class="w"> </span><span class="m">1000</span>
<span class="w"> </span>link/none<span class="w"> </span>
<span class="w"> </span>inet<span class="w"> </span><span class="m">172</span>.16.10.5/24<span class="w"> </span>scope<span class="w"> </span>global<span class="w"> </span>wg0
<span class="w"> </span>valid_lft<span class="w"> </span>forever<span class="w"> </span>preferred_lft<span class="w"> </span>forever
$<span class="w"> </span>ping<span class="w"> </span>-c<span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">10</span>.10.10.10
PING<span class="w"> </span><span class="m">10</span>.10.10.10<span class="w"> </span><span class="o">(</span><span class="m">10</span>.10.10.10<span class="o">)</span><span class="w"> </span><span class="m">56</span><span class="o">(</span><span class="m">84</span><span class="o">)</span><span class="w"> </span>bytes<span class="w"> </span>of<span class="w"> </span>data.
<span class="m">64</span><span class="w"> </span>bytes<span class="w"> </span>from<span class="w"> </span><span class="m">10</span>.10.10.10:<span class="w"> </span><span class="nv">icmp_seq</span><span class="o">=</span><span class="m">1</span><span class="w"> </span><span class="nv">ttl</span><span class="o">=</span><span class="m">63</span><span class="w"> </span><span class="nv">time</span><span class="o">=</span><span class="m">18</span>.6<span class="w"> </span>ms
---<span class="w"> </span><span class="m">10</span>.10.10.10<span class="w"> </span>ping<span class="w"> </span>statistics<span class="w"> </span>---
<span class="m">1</span><span class="w"> </span>packets<span class="w"> </span>transmitted,<span class="w"> </span><span class="m">1</span><span class="w"> </span>received,<span class="w"> </span><span class="m">0</span>%<span class="w"> </span>packet<span class="w"> </span>loss,<span class="w"> </span><span class="nb">time</span><span class="w"> </span>0ms
rtt<span class="w"> </span>min/avg/max/mdev<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">18</span>.629/18.629/18.629/0.000<span class="w"> </span>ms
</code></pre></div>
<h4>Sous OpenBSD</h4>
<p>Installer Wireguard avec l'aide de pkg_add :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>doas<span class="w"> </span>pkg_add<span class="w"> </span>wireguard-tools
</code></pre></div>
<p>Générer les clés privée et publique pour pouvoir se connecter par la suite :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>su
<span class="c1"># mkdir /etc/wireguard && cd /etc/wireguard</span>
<span class="c1"># wg genkey | tee privatekey | wg pubkey > publickey</span>
</code></pre></div>
<p>Créer un fichier de configuration dédié à Wireguard en ajoutant les paramètres pour se connecter au serveur :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># cat << EOF > /etc/wireguard/wg0.conf</span>
<span class="o">[</span>Interface<span class="o">]</span>
<span class="nv">ListenPort</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">60001</span>
<span class="nv">PrivateKey</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>xxxxxxxxxxxxxx<span class="w"> </span><span class="c1"># cat privatekey</span>
<span class="o">[</span>Peer<span class="o">]</span>
<span class="nv">PublicKey</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>yyyyyyyyyy<span class="w"> </span><span class="c1"># clé publique du serveur Wireguard (obtenue avec /interface/wireguard print)</span>
<span class="nv">AllowedIPs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">172</span>.16.10.0/24,10.10.10.0/24
<span class="nv">Endpoint</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>x.x.x.x:60001<span class="w"> </span><span class="c1"># Adresse publique du routeur</span>
EOF
</code></pre></div>
<p>Créer un fichier de configuration pour l'interface réseau en indiquant le chemin du fichier de configuration de Wireguard et en ajoutant la route réseau nécessaire pour le préfixe du VLAN 10 :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># vi /etc/hostname.wg0</span>
inet<span class="w"> </span><span class="m">172</span>.16.10.3<span class="w"> </span><span class="m">255</span>.255.255.0
up
!/usr/local/bin/wg<span class="w"> </span>setconf<span class="w"> </span>wg0<span class="w"> </span>/etc/wireguard/wg0.conf
!/sbin/route<span class="w"> </span>add<span class="w"> </span><span class="m">10</span>.10.10.0/24<span class="w"> </span><span class="m">172</span>.16.10.3
</code></pre></div>
<p>Initialiser l'interface réseau :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># sh /etc/netstart wg0</span>
</code></pre></div>
<p>La commande rajoute alors une nouvelle interface réseau et initie la connexion avec le routeur Mikrotik pour monter le VPN. Pour vérifier que tout fonctionne, on peut lister les interfaces réseaux et essayer de faire un ping vers une machine située sur le réseau local :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>ifconfig
...
wg0:<span class="w"> </span><span class="nv">flags</span><span class="o">=</span>80c3<UP,BROADCAST,RUNNING,NOARP,MULTICAST><span class="w"> </span>mtu<span class="w"> </span><span class="m">1420</span>
<span class="w"> </span>index<span class="w"> </span><span class="m">6</span><span class="w"> </span>priority<span class="w"> </span><span class="m">0</span><span class="w"> </span>llprio<span class="w"> </span><span class="m">3</span>
<span class="w"> </span>wgport<span class="w"> </span><span class="m">60001</span>
<span class="w"> </span>groups:<span class="w"> </span>wg
<span class="w"> </span>inet<span class="w"> </span><span class="m">172</span>.16.10.3<span class="w"> </span>netmask<span class="w"> </span>0xffffff00<span class="w"> </span>broadcast<span class="w"> </span><span class="m">172</span>.16.10.255
$<span class="w"> </span>ping<span class="w"> </span>-c<span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">10</span>.10.10.10
PING<span class="w"> </span><span class="m">10</span>.10.10.10<span class="w"> </span><span class="o">(</span><span class="m">10</span>.10.10.10<span class="o">)</span>:<span class="w"> </span><span class="m">56</span><span class="w"> </span>data<span class="w"> </span>bytes
<span class="m">64</span><span class="w"> </span>bytes<span class="w"> </span>from<span class="w"> </span><span class="m">10</span>.10.10.10:<span class="w"> </span><span class="nv">icmp_seq</span><span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">ttl</span><span class="o">=</span><span class="m">64</span><span class="w"> </span><span class="nv">time</span><span class="o">=</span><span class="m">21</span>.077<span class="w"> </span>ms
---<span class="w"> </span><span class="m">10</span>.10.10.10<span class="w"> </span>ping<span class="w"> </span>statistics<span class="w"> </span>---
<span class="m">1</span><span class="w"> </span>packets<span class="w"> </span>transmitted,<span class="w"> </span><span class="m">1</span><span class="w"> </span>packets<span class="w"> </span>received,<span class="w"> </span><span class="m">0</span>.0%<span class="w"> </span>packet<span class="w"> </span>loss
round-trip<span class="w"> </span>min/avg/max/std-dev<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">21</span>.077/21.077/21.077/0.000<span class="w"> </span>ms
</code></pre></div>
<h3>Exemple pour un client "classique"</h3>
<h4>iPhone</h4>
<p>Dans cet exemple, je vais relier mon smartphone à mon réseau local, afin d'avoir accès à mes machines internes et toute autre ressource non exposée sur Internet.
Pour mettre en place la configuration sur le smartphone, je vais générer un fichier de configuration sur un ordinateur et le convertir en code QR pour l'utiliser sur le téléphone.</p>
<p>Étant sous Fedora Linux, je peux utiliser les outils de Wireguard pour générer un fichier :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>mkdir<span class="w"> </span>wireguard<span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nb">cd</span><span class="w"> </span>wireguard<span class="w"> </span><span class="c1"># dans mon $HOME</span>
$<span class="w"> </span>wg<span class="w"> </span>genkey<span class="w"> </span><span class="p">|</span><span class="w"> </span>tee<span class="w"> </span>privatekey<span class="w"> </span><span class="p">|</span><span class="w"> </span>wg<span class="w"> </span>pubkey<span class="w"> </span>><span class="w"> </span>publickey
$<span class="w"> </span>cat<span class="w"> </span><span class="s"><< EOF > wg-iphone.conf</span>
<span class="s">[Interface]</span>
<span class="s">PrivateKey = xxxxxxxxxxxxxx # cat privatekey</span>
<span class="s">Address = 172.16.0.2/24</span>
<span class="s">[Peer]</span>
<span class="s">PublicKey = yyyyyyyyyy # clé publique du serveur Wireguard (obtenue avec /interface/wireguard print)</span>
<span class="s">AllowedIPs = 172.16.0.0/24,10.10.10.0/24</span>
<span class="s">Endpoint = x.x.x.x:60002 # Adresse publique du routeur</span>
<span class="s">EOF</span>
</code></pre></div>
<p>Une fois le fichier prêt, on peut utiliser le programme <code>qrencode</code> pour générer un code QR contenant la configuration du VPN pour notre iPhone :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>qrencode
$<span class="w"> </span>qrencode<span class="w"> </span>--type<span class="o">=</span>UTF8<span class="w"> </span>--read-from<span class="o">=</span>wg-iphone.conf
</code></pre></div>
<p>Installer ensuite l'<a href="https://apps.apple.com/fr/app/wireguard/id1441195209" title="Lien vers l'application Wireguard sur l'App Store">application officielle</a> via l'App Store d'Apple sur l'iPhone et ouvrir l'application. Appuyer sur le bouton <strong>Ajouter un tunnel</strong> et choisir l'option <strong>Créer à partir d'un QR code</strong>. Confirmer l'autorisation pour la caméra et scanner le code QR affiché dans le terminal. Nommer le tunnel et appuyer sur <strong>Sauvegarder</strong> en validant l'autorisation pour ajouter un VPN.</p>
<p>Le VPN est maintenant prêt à être utilisé. En tapant sur le bouton dans l'application, la connexion s'active et une petite icône VPN s'affiche tout en haut de l'écran de l'iPhone. On a désormais accès aux ressources locales !</p>
<h2>Conclusion</h2>
<p>Simplicité et rapidité de mise en place sont les deux grands avantages de Wireguard. J'ai pu ainsi mettre en place un système complet pour accéder à mon réseau local en déplacement et avoir un bon système de monitoring sans tout exposer directement sur Internet.</p>
<p>Le prochain article en lien avec celui-ci traitera justement de la mise en place de ma solution de monitoring à base de Netdata, de Prometheus et de Grafana.</p>
<hr>
<p>Sources pour la rédaction de cet article :</p>
<ul>
<li><a href="https://help.mikrotik.com/docs/display/ROS/WireGuard" title="Documentation en anglais sur le module Wireguard de RouterOS">Documentation officielle de Mikrotik</a></li>
<li><a href="https://wireguard.how/client/ios/" title="Tutoriel en anglais pour mettre en place Wireguard sur un iPhone">WireGuard Client: iOS</a></li>
</ul>Configurer un routeur Mikrotik sur une fibre FTTH Milkywan2023-06-20T09:00:00+02:002023-06-20T09:00:00+02:00Vincent Financetag:blog.vinishor.xyz,2023-06-20:/posts/configurer-un-routeur-mikrotik-sur-une-fibre-ftth-milkywan.html<p>Un tutoriel assez complet pour configurer un routeur Mikrotik en utilisant une connexion fibre FTTH fournie par le FAI Milkywan</p><p>À la suite de mon changement de FAI, voici donc un tutoriel assez complet pour configurer un routeur Mikrotik, afin de fournir un accès à Internet via une fibre FTTH, avoir une configuration IPv6 complète et un pare-feu pleinement opérationnel. Une partie des instructions seront affichées pour un usage via la console SSH et une autre partie pour la console graphique (via l'interface Web ou Winbox).</p>
<p>Winbox est un utilitaire graphique pour administrer des routeurs et switchs Mikrotik. Il remplace efficacement l'interface de ces derniers si elle n'est pas activée. Mikrotik fournit Winbox en tant que binaire Windows, mais il est entièrement compatible avec Wine (Linux, MacOS).<br>
J'utilise notamment une version toute prête pour MacOS qui est disponible ici : <a href="https://github.com/nrlquaker/winbox-mac/releases">https://github.com/nrlquaker/winbox-mac/releases</a></p>
<h2>Avertissement</h2>
<p><strong>Ce tutoriel n'est pas un tutoriel officiel pour configurer une fibre FTTH chez Milkywan</strong>. Il s'agit d'une configuration <strong>compatible</strong> avec ce que l'équipe préconise. Vous seul êtes responsable de la bonne configuration de votre équipement. Je vous invite à contacter le support en cas de problème.</p>
<p>Dans le cadre de ce tutoriel, l'adresse du routeur et la plage IP par défaut ont été changées avant d'effectuer les opérations qui vont suivre : la plage utilisée est donc <code>10.10.1.0/24</code> au lieu de <code>192.168.88.0/24</code> . Cette modification est assez simple à réaliser dans le logiciel Winbox, mais ne sera pas abordée ici. Les commandes seront donc à adapter en fonction de la plage utilisée sur votre machine.</p>
<h2>Une base minimale</h2>
<p>Avant de commencer, nous allons déjà configurer le système de base pour avoir la dernière version de RouterOS et activer quelques paramètres utiles. La première chose à faire est d'avoir la version 7.x de RouterOS. Vous pouvez suivre le <a href="https://help.mikrotik.com/docs/display/ROS/Upgrading+and+installation">guide officiel</a> pour installer la dernière version de la 6.x et ensuite passer sur la 7.x si votre routeur est encore sur une version précédente. Dans mon cas, j'ai utilisé l'interface Web pour le faire.</p>
<p>Le mot de passe du compte admin sera aussi à changer lors de la première connexion à la machine.</p>
<p>Une fois cela fait, on se connecte en SSH sur la console du Mikrotik (l'adresse IP à indiquer est celle de votre routeur) :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>ssh<span class="w"> </span>admin@10.10.1.1
admin@10.10.1.1<span class="err">'</span>s<span class="w"> </span>password:<span class="w"> </span>
<span class="w"> </span>MMM<span class="w"> </span>MMM<span class="w"> </span>KKK<span class="w"> </span>TTTTTTTTTTT<span class="w"> </span>KKK
<span class="w"> </span>MMMM<span class="w"> </span>MMMM<span class="w"> </span>KKK<span class="w"> </span>TTTTTTTTTTT<span class="w"> </span>KKK
<span class="w"> </span>MMM<span class="w"> </span>MMMM<span class="w"> </span>MMM<span class="w"> </span>III<span class="w"> </span>KKK<span class="w"> </span>KKK<span class="w"> </span>RRRRRR<span class="w"> </span>OOOOOO<span class="w"> </span>TTT<span class="w"> </span>III<span class="w"> </span>KKK<span class="w"> </span>KKK
<span class="w"> </span>MMM<span class="w"> </span>MM<span class="w"> </span>MMM<span class="w"> </span>III<span class="w"> </span>KKKKK<span class="w"> </span>RRR<span class="w"> </span>RRR<span class="w"> </span>OOO<span class="w"> </span>OOO<span class="w"> </span>TTT<span class="w"> </span>III<span class="w"> </span>KKKKK
<span class="w"> </span>MMM<span class="w"> </span>MMM<span class="w"> </span>III<span class="w"> </span>KKK<span class="w"> </span>KKK<span class="w"> </span>RRRRRR<span class="w"> </span>OOO<span class="w"> </span>OOO<span class="w"> </span>TTT<span class="w"> </span>III<span class="w"> </span>KKK<span class="w"> </span>KKK
<span class="w"> </span>MMM<span class="w"> </span>MMM<span class="w"> </span>III<span class="w"> </span>KKK<span class="w"> </span>KKK<span class="w"> </span>RRR<span class="w"> </span>RRR<span class="w"> </span>OOOOOO<span class="w"> </span>TTT<span class="w"> </span>III<span class="w"> </span>KKK<span class="w"> </span>KKK
<span class="w"> </span>MikroTik<span class="w"> </span>RouterOS<span class="w"> </span><span class="m">7</span>.10.2<span class="w"> </span><span class="o">(</span>c<span class="o">)</span><span class="w"> </span><span class="m">1999</span>-2023<span class="w"> </span>https://www.mikrotik.com/
Press<span class="w"> </span>F1<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nb">help</span>
<span class="o">[</span>admin@mikrotik<span class="o">]</span><span class="w"> </span>><span class="w"> </span>
</code></pre></div>
<p>On commence par les quelques commandes suivantes :</p>
<div class="highlight"><pre><span></span><code><span class="c1">## Options de base</span>
/system<span class="w"> </span>package<span class="w"> </span>update<span class="w"> </span><span class="nb">set</span><span class="w"> </span><span class="nv">channel</span><span class="o">=</span>stable<span class="w"> </span><span class="c1"># sur ROS v7</span>
/system<span class="w"> </span>clock<span class="w"> </span><span class="nb">set</span><span class="w"> </span>time-zone-name<span class="o">=</span>Europe/Paris
/system<span class="w"> </span>identity<span class="w"> </span><span class="nb">set</span><span class="w"> </span><span class="nv">name</span><span class="o">=</span>mikrotik
/system<span class="w"> </span>ntp<span class="w"> </span>client<span class="w"> </span>
<span class="nb">set</span><span class="w"> </span><span class="nv">enabled</span><span class="o">=</span>yes
servers<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">0</span>.fr.pool.ntp.org
</code></pre></div>
<p>Cela va activer le canal de mises à jour en mode "stable", mettre à jour l'horloge du Mikrotik et changer son nom pour <code>mikrotik</code>. Vous pouvez mettre autre chose si vous le souhaitez.</p>
<h2>Mettre en place le PPPoE</h2>
<p>Nous passons maintenant à la partie PPPoE qui nous permettra de nous connecter sur le réseau de Milkywan et donc échanger avec Internet.</p>
<p>Dans l'ordre, voici ce qui va être mis en place :</p>
<ul>
<li>Modification de la MTU de nos interfaces réseau pour nous assurer une bonne stabilité réseau</li>
<li>Création d'une interface PPPoE avec le VLAN et les informations de connexion fournies par Milkywan pour nous connecter</li>
<li>Changement du DNS utilisé pour utiliser celui de Milkywan (<strong>non ouvert au public</strong>)</li>
<li>Activation du masquerade sur l'interface du PPPoE</li>
<li>Mise en place de quelques règles de pare-feu pour garder l'accès au routeur et bloquer ce qui est inutile</li>
<li>Mise en place d'un pool DHCP avec les adresses que nous souhaitons pour le réseau principal (à modifier pour correspondre à la plage utilisée par l'adresse IP de votre routeur)</li>
<li>Activation du serveur DHCP sur ce nouveau pool</li>
</ul>
<p>Les commandes à taper sont les suivantes :</p>
<div class="highlight"><pre><span></span><code>/interface<span class="w"> </span>ethernet
<span class="nb">set</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>find<span class="w"> </span>default-name<span class="o">=</span>ether1<span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="nv">comment</span><span class="o">=</span>WAN
<span class="nb">set</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>find<span class="w"> </span>default-name<span class="o">=</span>ether2<span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="nv">l2mtu</span><span class="o">=</span><span class="m">2000</span><span class="w"> </span><span class="nv">mtu</span><span class="o">=</span><span class="m">1500</span>
<span class="nb">set</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>find<span class="w"> </span>default-name<span class="o">=</span>ether3<span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="nv">l2mtu</span><span class="o">=</span><span class="m">2000</span><span class="w"> </span><span class="nv">mtu</span><span class="o">=</span><span class="m">1500</span>
<span class="nb">set</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>find<span class="w"> </span>default-name<span class="o">=</span>ether4<span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="nv">l2mtu</span><span class="o">=</span><span class="m">2000</span><span class="w"> </span><span class="nv">mtu</span><span class="o">=</span><span class="m">1500</span>
<span class="nb">set</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>find<span class="w"> </span>default-name<span class="o">=</span>ether5<span class="w"> </span><span class="o">]</span><span class="w"> </span><span class="nv">l2mtu</span><span class="o">=</span><span class="m">2000</span><span class="w"> </span><span class="nv">mtu</span><span class="o">=</span><span class="m">1500</span>
/interface<span class="w"> </span>vlan<span class="w"> </span>add<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>ether1<span class="w"> </span><span class="nv">name</span><span class="o">=</span>vlan4001<span class="w"> </span>vlan-id<span class="o">=</span><span class="m">4001</span>
/interface<span class="w"> </span>pppoe-client
add<span class="w"> </span>add-default-route<span class="o">=</span>yes<span class="w"> </span><span class="nv">allow</span><span class="o">=</span>pap,chap<span class="w"> </span><span class="nv">comment</span><span class="o">=</span>WAN<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>no<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan4001<span class="w"> </span>max-mru<span class="o">=</span><span class="m">1500</span><span class="w"> </span>max-mtu<span class="o">=</span><span class="m">1500</span><span class="w"> </span><span class="nv">name</span><span class="o">=</span>pppoe0<span class="w"> </span>use-peer-dns<span class="o">=</span>yes<span class="w"> </span><span class="nv">user</span><span class="o">=</span>UTILISATEUR<span class="w"> </span><span class="nv">password</span><span class="o">=</span>MOTDEPASSE
/ip<span class="w"> </span>dns<span class="w"> </span><span class="nb">set</span><span class="w"> </span><span class="nv">servers</span><span class="o">=</span><span class="m">130</span>.117.11.11
/ip<span class="w"> </span>firewall<span class="w"> </span>nat<span class="w"> </span>add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>masquerade<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>srcnat<span class="w"> </span>out-interface<span class="o">=</span>pppoe0
/ip<span class="w"> </span>firewall<span class="w"> </span>filter
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span>dst-port<span class="o">=</span><span class="m">8291</span><span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span>dst-port<span class="o">=</span><span class="m">22</span><span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>pppoe0
/ip<span class="w"> </span>firewall<span class="w"> </span>service-port
<span class="nb">set</span><span class="w"> </span>ftp<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>yes
<span class="nb">set</span><span class="w"> </span>tftp<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>yes
<span class="nb">set</span><span class="w"> </span>sip<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>yes
<span class="nb">set</span><span class="w"> </span>pptp<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>yes
/ip<span class="w"> </span>address<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.1.1/24<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge<span class="w"> </span><span class="nv">network</span><span class="o">=</span><span class="m">10</span>.10.1.0
/ip<span class="w"> </span>pool<span class="w"> </span>add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>pool-dhcp<span class="w"> </span><span class="nv">ranges</span><span class="o">=</span><span class="m">10</span>.10.1.50-10.10.1.200
/ip<span class="w"> </span>dhcp-server<span class="w"> </span>add<span class="w"> </span>address-pool<span class="o">=</span>pool-dhcp<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge<span class="w"> </span>lease-time<span class="o">=</span>1d<span class="w"> </span><span class="nv">name</span><span class="o">=</span>server1
/ip<span class="w"> </span>dhcp-server<span class="w"> </span>network<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.1.0/24<span class="w"> </span>dns-server<span class="o">=</span><span class="m">130</span>.117.11.11<span class="w"> </span><span class="nv">gateway</span><span class="o">=</span><span class="m">10</span>.10.1.1<span class="w"> </span><span class="nv">netmask</span><span class="o">=</span><span class="m">24</span>
</code></pre></div>
<p>Une déconnexion peut survenir après avoir tapé ces commandes, mais normalement, l'accès est toujours possible et on peut se reconnecter directement en SSH via la commande du début.</p>
<p>On peut lancer alors un <code>ping 8.8.8.8</code> ou <code>ping 9.9.9.9</code> pour voir si la connexion Internet fonctionne et si le routeur arrive à communiquer avec l'infra de Milkywan.</p>
<h2>IPv6 ? Oui bien sûr !</h2>
<p>Une fois IPv4 fonctionnel, on peut passer à la partie drôle : configurer IPv6. Ayant gardé le nom du bridge par défaut, j'ai donc simplement repris les instructions de Milkywan pour mettre en place ma configuration. Nous allons donc :</p>
<ul>
<li>Activer le client DHCPv6 pour récupérer le bloc /48 fourni par Milkywan</li>
<li>Activer le serveur DHCPv6 pour distribuer les IPv6 sur notre réseau local</li>
<li>Mettre en place la découverte des adresses sur toutes les interfaces via le bridge par défaut</li>
<li>Ajouter quelques règles de pare-feu pour avoir une configuration fonctionnelle</li>
</ul>
<p>Les commandes à envoyer sont les suivantes :</p>
<div class="highlight"><pre><span></span><code><span class="c1">## Config en IPv6</span>
/ipv6<span class="w"> </span>dhcp-server
add<span class="w"> </span>address-pool<span class="o">=</span>mw<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge<span class="w"> </span><span class="nv">name</span><span class="o">=</span>mw
/ipv6<span class="w"> </span>address
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span>::1<span class="w"> </span>from-pool<span class="o">=</span>mw<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge
/ipv6<span class="w"> </span>dhcp-client
add<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>pppoe0<span class="w"> </span>pool-name<span class="o">=</span>mw<span class="w"> </span><span class="nv">request</span><span class="o">=</span>prefix
/ipv6<span class="w"> </span>nd
<span class="nb">set</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>find<span class="w"> </span><span class="nv">default</span><span class="o">=</span>yes<span class="w"> </span><span class="o">]</span><span class="w"> </span>advertise-dns<span class="o">=</span>no<span class="w"> </span>hop-limit<span class="o">=</span><span class="m">64</span><span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge
/ipv6<span class="w"> </span>firewall<span class="w"> </span>filter
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"defconf: accept ICMPv6"</span><span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>icmpv6
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"defconf: accept UDP traceroute"</span><span class="w"> </span><span class="nv">port</span><span class="o">=</span><span class="m">33434</span>-33534<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>udp
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"defconf: accept DHCPv6-Client prefix delegation."</span><span class="w"> </span>dst-port<span class="o">=</span><span class="m">546</span><span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>udp<span class="w"> </span>src-address<span class="o">=</span>fe80::/10
</code></pre></div>
<p>Au bout de quelques minutes, notre machine cliente recevra une adresse IPv6 et on pourra se connecter sur <a href="https://ip.lafibre.info/">https://ip.lafibre.info/</a> pour vérifier que tout est en vert et que IPv6 est notre protocole par défaut pour aller sur Internet.<br>
Pour information, la configuration par défaut de Mikrotik avait ajoutée automatiquement la liste des adresses utilisées par le pare-feu IPv6, mais j'ai laissé les instructions pour les cas où cela ne serait pas présent. Vous noterez aussi que cela n'a pris que quelques minutes pour activer et faire fonctionner IPv6 !<br>
L'Internet du Futur est maintenant à notre portée !</p>
<p><strong>Note</strong> : si jamais vous utilisez ces instructions pour ajouter IPv6 et que vous n'utilisez pas une interface PPPoE, il est nécessaire de rajouter l'option <code>add-default-route=yes</code> dans la commande <code>/ipv6 dhcp-client</code> pour pouvoir obtenir les routes nécessaires à son bon fonctionnement.</p>
<h2>Un peu de personnalisation</h2>
<h3>Modifier l'identifiant de connexion</h3>
<p>Via Winbox ou l'interface web, il est possible de créer un nouvel utilisateur avec des droits administrateur et désactiver le compte par défaut. Cela peut servir à ralentir la surface d'attaque sur votre routeur. Cela se fait dans la section <strong>System > Users</strong> et il suffit d'attribuer le groupe <strong>Full</strong> au nouvel utilisateur pour lui donner les droits complets.</p>
<p>En mode console, cela se fait comme ceci :</p>
<div class="highlight"><pre><span></span><code>/user<span class="w"> </span>add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>votreuser<span class="w"> </span><span class="nv">group</span><span class="o">=</span>full<span class="w"> </span><span class="nv">password</span><span class="o">=</span>monsupermotdepasse
<span class="c1"># Après déconnexion et reconnexion avec votre nouvel utilisateur</span>
/user<span class="w"> </span>disable<span class="w"> </span>admin
</code></pre></div>
<h3>Utiliser une clé SSH</h3>
<p>RouterOS est compatible avec des clés SSH générées au format RSA et permet ainsi de s'authentifier sans mot de passe depuis la console.</p>
<p>Sous Linux et MacOS, il vous suffit de générer une nouvelle clé si vous n'en utilisez pas encore. Dans mon cas, je suis parti sur une clé RSA 4096 bits et je laisse le nom par défaut de l'assistant, soit <em>/home/$USER/.ssh/id_rsa</em> :</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>ssh-keygen<span class="w"> </span>-t<span class="w"> </span>rsa<span class="w"> </span>-b<span class="w"> </span><span class="m">4096</span><span class="w"> </span>-C<span class="w"> </span>Mikrotik-vinson
</code></pre></div>
<p>On se connecte ensuite via Winbox ou l'interface Web. Aller dans <strong>Files</strong> puis cliquer sur <em>Browse</em> pour choisir le fichier généré et le téléverser sur le routeur. Il apparaît au bout de quelques secondes.<br>
Pour l'importer, vous pouvez utiliser la console depuis Winbox (en cliquant sur <strong>New Terminal</strong>) ou bien vous connecter directement depuis la console en SSH pour lancer la commande suivante :</p>
<div class="highlight"><pre><span></span><code>/user<span class="w"> </span>ssh-keys<span class="w"> </span>import<span class="w"> </span>public-key-file<span class="o">=</span>id_rsa.pub
</code></pre></div>
<p>Le nom <em>id_rsa.pub</em> est à remplacer par le nom du fichier que vous avez téléversé sur le routeur.</p>
<p>Vous pouvez maintenant tester la connexion en utilisant la commande ssh avec votre clé favorite !</p>
<h3>Des VLANs</h3>
<p>Vu que j'ai besoin de séparer mon réseau en sections distinctes pour des questions de sécurité, j'ai mis en place 4 VLANs sur mon routeur : un réservé aux serveurs que j'ai dans mon infra, un pour les clients en tout genre (PC personnels notamment), un pour les applications demandant une isolation particulière et un VLAN dédié à la gestion des routeurs. Ce VLAN de gestion aura aussi le droit de chercher les autres routeurs présents sur le réseau :</p>
<div class="highlight"><pre><span></span><code>/interface<span class="w"> </span>bridge<span class="w"> </span>add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>bridge1<span class="w"> </span>protocol-mode<span class="o">=</span>none<span class="w"> </span>vlan-filtering<span class="o">=</span>no
/interface<span class="w"> </span>vlan
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>vlan-10<span class="w"> </span>vlan-id<span class="o">=</span><span class="m">10</span><span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>no
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>vlan-20<span class="w"> </span>vlan-id<span class="o">=</span><span class="m">20</span><span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>no
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>vlan-30<span class="w"> </span>vlan-id<span class="o">=</span><span class="m">30</span><span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>no
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>base-vlan<span class="w"> </span>vlan-id<span class="o">=</span><span class="m">99</span><span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">disabled</span><span class="o">=</span>no
/interface<span class="w"> </span>bridge<span class="w"> </span>port
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>ether2
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>ether3
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>ether4
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-10
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-20
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-30
/interface<span class="w"> </span>bridge<span class="w"> </span>vlan
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">tagged</span><span class="o">=</span>bridge1,ether2,ether3,ether4<span class="w"> </span>vlan-ids<span class="o">=</span><span class="m">10</span>
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">tagged</span><span class="o">=</span>bridge1,ether2,ether3,ether4<span class="w"> </span>vlan-ids<span class="o">=</span><span class="m">20</span>
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">tagged</span><span class="o">=</span>bridge1,ether2,ether3,ether4<span class="w"> </span>vlan-ids<span class="o">=</span><span class="m">30</span>
add<span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">tagged</span><span class="o">=</span>bridge1,ether2,ether3,ether4<span class="w"> </span>vlan-ids<span class="o">=</span><span class="m">99</span>
/interface<span class="w"> </span>list<span class="w"> </span>add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>BASE
/interface<span class="w"> </span>list<span class="w"> </span>member
add<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-20<span class="w"> </span><span class="nv">list</span><span class="o">=</span>LAN
add<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-30<span class="w"> </span><span class="nv">list</span><span class="o">=</span>LAN
add<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-10<span class="w"> </span><span class="nv">list</span><span class="o">=</span>LAN
add<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>bridge1<span class="w"> </span><span class="nv">list</span><span class="o">=</span>LAN
add<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>base-vlan<span class="w"> </span><span class="nv">list</span><span class="o">=</span>BASE
/ip<span class="w"> </span>address
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.10.1/24<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-10<span class="w"> </span><span class="nv">network</span><span class="o">=</span><span class="m">10</span>.10.10.0
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.20.1/24<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-20<span class="w"> </span><span class="nv">network</span><span class="o">=</span><span class="m">10</span>.10.20.0
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.30.1/24<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-30<span class="w"> </span><span class="nv">network</span><span class="o">=</span><span class="m">10</span>.10.30.0
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.99.1/24<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>base-vlan<span class="w"> </span><span class="nv">network</span><span class="o">=</span><span class="m">10</span>.10.99.0
/ip<span class="w"> </span>pool
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>pool-v10<span class="w"> </span><span class="nv">ranges</span><span class="o">=</span><span class="m">10</span>.10.10.2-10.10.10.150
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>pool-v20<span class="w"> </span><span class="nv">ranges</span><span class="o">=</span><span class="m">10</span>.10.20.50-10.10.20.200
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>pool-v30<span class="w"> </span><span class="nv">ranges</span><span class="o">=</span><span class="m">10</span>.10.30.10-10.10.30.100
add<span class="w"> </span><span class="nv">name</span><span class="o">=</span>base-pool<span class="w"> </span><span class="nv">ranges</span><span class="o">=</span><span class="m">10</span>.10.99.2-10.10.99.20
/ip<span class="w"> </span>dhcp-server
add<span class="w"> </span>address-pool<span class="o">=</span>pool-v10<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-10<span class="w"> </span>lease-time<span class="o">=</span>1d<span class="w"> </span><span class="nv">name</span><span class="o">=</span>server-v10
add<span class="w"> </span>address-pool<span class="o">=</span>pool-v20<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-20<span class="w"> </span>lease-time<span class="o">=</span>1d<span class="w"> </span><span class="nv">name</span><span class="o">=</span>server-v20
add<span class="w"> </span>address-pool<span class="o">=</span>pool-v30<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-30<span class="w"> </span>lease-time<span class="o">=</span>1d<span class="w"> </span><span class="nv">name</span><span class="o">=</span>server-v30
add<span class="w"> </span>address-pool<span class="o">=</span>base-pool<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>base-vlan<span class="w"> </span><span class="nv">name</span><span class="o">=</span>server-base
network<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.10.0/24<span class="w"> </span>dns-server<span class="o">=</span><span class="m">10</span>.10.10.10<span class="w"> </span><span class="nv">gateway</span><span class="o">=</span><span class="m">10</span>.10.10.1<span class="w"> </span><span class="nv">netmask</span><span class="o">=</span><span class="m">24</span>
network<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.20.0/24<span class="w"> </span>dns-server<span class="o">=</span><span class="m">10</span>.10.10.10<span class="w"> </span><span class="nv">gateway</span><span class="o">=</span><span class="m">10</span>.10.20.1<span class="w"> </span><span class="nv">netmask</span><span class="o">=</span><span class="m">24</span>
network<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.30.0/24<span class="w"> </span>dns-server<span class="o">=</span><span class="m">130</span>.117.11.11<span class="w"> </span><span class="nv">gateway</span><span class="o">=</span><span class="m">10</span>.10.30.1<span class="w"> </span><span class="nv">netmask</span><span class="o">=</span><span class="m">24</span>
network<span class="w"> </span>add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">10</span>.10.99.0/24<span class="w"> </span>dns-server<span class="o">=</span><span class="m">10</span>.10.10.10<span class="w"> </span><span class="nv">gateway</span><span class="o">=</span><span class="m">10</span>.10.99.1
/ip<span class="w"> </span>neighbor<span class="w"> </span>discovery-settings<span class="w"> </span><span class="nb">set</span><span class="w"> </span>discover-interface-list<span class="o">=</span>BASE
</code></pre></div>
<p>Une fois la configuration en place, j'en profite pour configurer le pare-feu afin de limiter les accès de chaque VLAN : le VLAN 30 est le plus restreint, puisqu'il ne peut pas communiquer avec les autres VLAN. Le VLAN 20 est le plus permissif, car il peut aller sur les deux autres sans souci (ce qui est pratique pour gérer mes serveurs). J'active aussi le filtrage au niveau des ports réseau pour ne laisser passer que le trafic dédié à chaque port :</p>
<div class="highlight"><pre><span></span><code>/ip<span class="w"> </span>firewall<span class="w"> </span>filter<span class="w"> </span>
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>vlan-30<span class="w"> </span>out-interface<span class="o">=</span>vlan-10
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>vlan-30<span class="w"> </span>out-interface<span class="o">=</span>vlan-20
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>vlan-30<span class="w"> </span>out-interface<span class="o">=</span>bridge
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>vlan-30<span class="w"> </span>out-interface<span class="o">=</span>base-vlan
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>vlan-10<span class="w"> </span>out-interface<span class="o">=</span>vlan-20
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>vlan-10<span class="w"> </span>out-interface<span class="o">=</span>bridge
add<span class="w"> </span><span class="nv">action</span><span class="o">=</span>drop<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>forward<span class="w"> </span><span class="k">in</span>-interface<span class="o">=</span>vlan-10<span class="w"> </span>out-interface<span class="o">=</span>base-vlan
/interface<span class="w"> </span>bridge<span class="w"> </span>port
<span class="nb">set</span><span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span>ingress-filtering<span class="o">=</span>yes<span class="w"> </span>frame-types<span class="o">=</span>admit-only-vlan-tagged<span class="w"> </span><span class="o">[</span>find<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>ether2<span class="o">]</span>
<span class="nb">set</span><span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span>ingress-filtering<span class="o">=</span>yes<span class="w"> </span>frame-types<span class="o">=</span>admit-only-vlan-tagged<span class="w"> </span><span class="o">[</span>find<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>ether3<span class="o">]</span>
<span class="nb">set</span><span class="w"> </span><span class="nv">bridge</span><span class="o">=</span>bridge1<span class="w"> </span>ingress-filtering<span class="o">=</span>yes<span class="w"> </span>frame-types<span class="o">=</span>admit-only-vlan-tagged<span class="w"> </span><span class="o">[</span>find<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>ether4<span class="o">]</span>
/interface<span class="w"> </span>bridge<span class="w"> </span><span class="nb">set</span><span class="w"> </span>bridge1<span class="w"> </span>vlan-filtering<span class="o">=</span>yes
</code></pre></div>
<p>Ayant une machine virtuelle avec un serveur DNS interne pour avoir des noms plus sympas, j'utilise directement son adresse IP dans la configuration DNS de mon serveur DHCP. Seul le VLAN dédié aux applications isolées ne l'utilise pas pour éviter de divulguer trop d'informations.<br>
Ces VLANs sont ensuite gérés par un switch manageable qui se charge de répartir le tout sur les bons ports. Un switch "classique" du commerce ne fonctionnera pas, il faut donc bien faire attention à ce qu'on utilise.<br>
Voici une liste de switchs compatibles (lien non sponsorisé) : <a href="https://www.ldlc.com/informatique/reseau/switch/c4315/+fc781-1.html?sort=1">https://www.ldlc.com/informatique/reseau/switch/c4315/+fc781-1.html?sort=1</a></p>
<h3>Sécuriser les accès à la console d'administration</h3>
<p>Une fois que les VLAN sont en place et sont fonctionnels, on peut modifier le pare-feu pour limiter l'accès à la console d'administration du routeur. Vu que tous les routeurs Mikrotik ne sont pas équipés d'un port série, il est important de s'assurer que tout fonctionne avant de faire le changement.</p>
<p>On va alors modifier les règles concernant le port 22 (SSH) et 8291 (Winbox) pour n'autoriser que les VLANS 20 et 99, au cas où on a besoin de faire une modification plus tard. La méthode est donc d'afficher les règles de pare-feu pour obtenir leur numéro et éditer les deux règles pour ajouter l'option <code>src-address-list</code> avec les deux VLAN souhaités :</p>
<div class="highlight"><pre><span></span><code>/ip/firewall/filter
print
...
<span class="m">22</span><span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>dst-port<span class="o">=</span><span class="m">8291</span>
<span class="m">23</span><span class="w"> </span><span class="nv">chain</span><span class="o">=</span>input<span class="w"> </span><span class="nv">action</span><span class="o">=</span>accept<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>dst-port<span class="o">=</span><span class="m">22</span><span class="w"> </span>
...
edit<span class="w"> </span><span class="m">22</span><span class="w"> </span>src-address-list<span class="w"> </span><span class="c1"># sauvegarder en faisant Ctrl+O</span>
vlan20,vlan-base
edit<span class="w"> </span><span class="m">23</span><span class="w"> </span>src-address-list<span class="w"> </span><span class="c1"># sauvegarder en faisant Ctrl+O</span>
vlan20,vlan-base
</code></pre></div>
<p>On peut alors tester la connexion en <strong>ouvrant un nouveau terminal</strong> et en essayant de se connecter au routeur. Vu que l'on a autorisé les connexions déjà établies auparavant, il est possible de faire un retour arrière en cas d'erreur par ce biais. Normalement, vous devriez pouvoir vous connecter sans problème.</p>
<h3>IPv6 sur mes VLANs</h3>
<p>Vu que l'Internet du Futur est activé sur le réseau local par défaut, il est temps de faire de même pour les différents VLANs. Milkywan fournit par défaut un préfixe en /48 : on peut donc le découper en plusieurs préfixes /64 pour donner IPv6 à toutes nos machines. Il est possible de laisser le routeur attribuer automatique un préfixe /64 par VLAN, mais j'ai préféré faire le découpage moi-même, comme ceci :</p>
<div class="highlight"><pre><span></span><code>/ipv6<span class="w"> </span>address
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">2001</span>:db8:cafe::1/64<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-10<span class="w"> </span><span class="nv">advertise</span><span class="o">=</span>yes
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">2001</span>:db8:1020::1/64<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-20<span class="w"> </span><span class="nv">advertise</span><span class="o">=</span>yes
add<span class="w"> </span><span class="nv">address</span><span class="o">=</span><span class="m">2001</span>:db8:1030::11/64<span class="w"> </span><span class="nv">interface</span><span class="o">=</span>vlan-30<span class="w"> </span><span class="nv">advertise</span><span class="o">=</span>yes
</code></pre></div>
<p>Je précise ici que le préfixe affiché est réservé à la documentation et doit être remplacé par votre préfixe alloué. Dans le cas d'un découpage automatique, il suffit de remplacer l'argument <em>address=</em> de la première série de commandes par <em>from-pool=mw</em>. Le VLAN de gestion (VLAN 99) n'est pas non plus configuré en IPv6, car il ne sert qu'à la communication entre les deux routeurs et il n'y a donc pas d'intérêt de l'exposer sur Internet.</p>
<p>Si besoin, vous pouvez utiliser les deux outils suivants pour vous aider à déterminer vos préfixes en /64 :</p>
<ul>
<li><a href="http://sqa.fyicenter.com/1000334_IPv6_Address_Validator.html">Valideur d'adresse IPv6 (en anglais)</a></li>
<li><a href="https://subnettingpractice.com/ipv6-subnet-calculator.html">Calculateur de préfixes IPv6 (en anglais)</a> pour obtenir une liste non-exhaustive de préfixes valides</li>
</ul>
<p>On pourra alors faire un nouveau test de connectivité IPv6 avec une de nos machines pour vérifier que tout est bon.</p>
<h3>Ouvrir quelques ports depuis l'extérieur (IPv4 uniquement)</h3>
<p>Pour ouvrir des ports depuis l'extérieur en IPv4, vous devez mettre en place des règles DNAT pour rediriger le trafic au bon endroit. Je vous donne quelques exemples ci-dessous, sachant que tous les ports redirigent sur plusieurs machines de mon infra maison. L'adresse en <code>145.x.x.x</code> est à remplacer par votre adresse IPv4 publique, fournie par le FAI.</p>
<div class="highlight"><pre><span></span><code><span class="c1">## Ouverture des ports</span>
/ip<span class="w"> </span>firewall<span class="w"> </span>nat
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>dstnat<span class="w"> </span>dst-address<span class="o">=</span><span class="m">145</span>.x.x.x<span class="w"> </span>dst-port<span class="o">=</span><span class="m">1965</span><span class="w"> </span><span class="nv">action</span><span class="o">=</span>dst-nat<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>to-address<span class="o">=</span><span class="m">10</span>.10.10.16<span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"Allow Gemini"</span>
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>dstnat<span class="w"> </span>dst-address<span class="o">=</span><span class="m">145</span>.x.x.x<span class="w"> </span>dst-port<span class="o">=</span><span class="m">23</span><span class="w"> </span><span class="nv">action</span><span class="o">=</span>dst-nat<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>to-address<span class="o">=</span><span class="m">10</span>.10.10.16<span class="w"> </span>to-port<span class="o">=</span><span class="m">22</span><span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"Allow SFTP for Gemini"</span>
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>dstnat<span class="w"> </span>dst-address<span class="o">=</span><span class="m">145</span>.x.x.x<span class="w"> </span>dst-port<span class="o">=</span><span class="m">24</span><span class="w"> </span><span class="nv">action</span><span class="o">=</span>dst-nat<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>to-address<span class="o">=</span><span class="m">10</span>.10.30.60<span class="w"> </span>to-port<span class="o">=</span><span class="m">22</span><span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"Allow SSH for a friend"</span>
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>dstnat<span class="w"> </span>dst-address<span class="o">=</span><span class="m">145</span>.x.x.x<span class="w"> </span>dst-port<span class="o">=</span><span class="m">80</span><span class="w"> </span><span class="nv">action</span><span class="o">=</span>dst-nat<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>to-address<span class="o">=</span><span class="m">10</span>.10.10.17<span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"Allow HTTP"</span>
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>dstnat<span class="w"> </span>dst-address<span class="o">=</span><span class="m">145</span>.x.x.x<span class="w"> </span>dst-port<span class="o">=</span><span class="m">443</span><span class="w"> </span><span class="nv">action</span><span class="o">=</span>dst-nat<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>to-address<span class="o">=</span><span class="m">10</span>.10.10.17<span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"Allow HTTPS"</span>
add<span class="w"> </span><span class="nv">chain</span><span class="o">=</span>dstnat<span class="w"> </span>dst-address<span class="o">=</span><span class="m">145</span>.x.x.x<span class="w"> </span>dst-port<span class="o">=</span><span class="m">22</span><span class="w"> </span><span class="nv">action</span><span class="o">=</span>dst-nat<span class="w"> </span><span class="nv">protocol</span><span class="o">=</span>tcp<span class="w"> </span>to-address<span class="o">=</span><span class="m">10</span>.10.10.13<span class="w"> </span><span class="nv">comment</span><span class="o">=</span><span class="s2">"Allow SSH for Gitea"</span>
</code></pre></div>
<p>En IPv6, vous n'avez pas besoin de toucher au routeur. Il suffit d'ouvrir les bons ports sur le pare-feu de la machine à accéder depuis Internet.</p>
<h2>Pour conclure</h2>
<p>Avec cette configuration, je peux enfin pleinement utiliser ma connexion Internet pour m'auto-héberger et toucher un peu au réseau, bien que je sois encore débutant dans le domaine.</p>
<p>Un axe d'amélioration possible serait de mettre en place de la redondance avec l'aide d'une connexion 4G, mais ce sujet sera pour un prochain article.</p>Nouvelle organisation de mon réseau local (2023)2023-04-20T15:00:00+02:002023-04-20T15:00:00+02:00Vincent Financetag:blog.vinishor.xyz,2023-04-20:/posts/Miseajour-presentation-reseau-local-2023.html<p>Comme indiqué dans un de mes articles d'avril 2023, j'ai profité de mon changement de fournisseur d'accès pour refaire l'organisation de mon réseau local et recâbler un peu le tout avec des câbles de couleurs spécifiques. Voici donc une mise à jour de l'organisation de mon réseau local.</p><p>Comme indiqué dans <a href="https://blog.vinishor.xyz/posts/Mouvements-mars-2023.html">un de mes articles</a> d'avril 2023, j'ai profité de mon changement de fournisseur d'accès pour refaire l'organisation de mon réseau local et recâbler un peu le tout avec des câbles de couleurs spécifiques. Voici donc une mise à jour de l'<a href="https://blog.vinishor.xyz/posts/organisation-de-mon-reseau-local.html">organisation de mon réseau local</a>.</p>
<h2>Le matériel</h2>
<h3>La partie opérateur</h3>
<p>Le 12 avril 2023, j'ai changé d'opérateur pour passer chez <a href="https://milkywan.fr">Milkywan</a>. Ceci est un assez gros changement, car ce FAI associatif ne fournit pas de routeur particulier, contrairement à Free par exemple. Je n'ai alors pas de box opérateur, mais une configuration à appliquer sur la machine de mon choix et un module ONT. Cet ONT est directement branché sur mon routeur et j'obtiens donc une adresse IPv4 dédiée et un bloc IPv6 en /48.</p>
<p>Pour mieux comprendre cette nouvelle installation, laissez-moi vous expliquer comment ça fonctionne dans les grandes lignes : chez moi, j'ai une prise fibre et un ONT qui permet de récupérer le signal pour me connecter. Cette prise fibre, l'installation des fibres dans mon immeuble et l'armoire extérieure qui permet de tout relier physiquement sont gérées par un <strong>opérateur d'infrastructure</strong>. C'est lui qui se charge de faire la plomberie en quelque sorte : dans mon cas, il s'agit d'Orange.<br>
Le signal optique, lui, est géré par un <strong>opérateur de collecte</strong> et c'est ce dernier qui fournit le module ONT pour pouvoir me connecter à son réseau : ici, il s'agit de Bouygues Télécom. Le but de l'opérateur de collecte est alors de récupérer les signaux de la zone environnante via les connexions physiques de l'opérateur d'infrastructure pour les envoyer sur une porte de collecte. Cette porte de collecte est ensuite connectée à un <strong>agrégateur</strong> (ici, <em>ielo</em>) qui va se charger d'agréger toutes les collectes en seul endroit, dans une autre porte de collecte. Cette porte de collecte est alors utilisée par le <strong>FAI</strong> pour communiquer la configuration et envoyer mes paquets sur Internet.</p>
<p>Pour récapituler, cela donne le schéma suivant :</p>
<p><a href="/images/articles/computers/fai.svg"><img alt="Schéma d'explication du raccordement d'un abonné à un FAI" style="max-width: 100%; background-color: whitesmoke; padding: 5px;" src="/images/articles/computers/fai.svg"/></a></p>
<p>Dans le cas des opérateurs commerciaux grand public, toutes ces étapes sont habilement cachées et on ne se rend pas vraiment compte du découpage, mais c'est bien ce principe qui s'applique.<br>
Notez aussi qu'un opérateur d'infrastructure doit ouvrir son "réseau physique" à tous les opérateurs de collecte, ce qui explique pourquoi une armoire installée par Orange contient forcément des collectes d'autres opérateurs comme SFR, Free ou bien Bouygues Télécom.</p>
<h3>La partie routeur</h3>
<p>En guise de routeur, j'ai aussi changé d'équipement pour passer sur une machine de chez Mikrotik sous RouterOS. C'est un équipement dédié au réseau, configurable en SSH et bien mieux optimisé que OPNSense (que j'utilisais sur mon autre routeur avec ma Freebox). C'est pour cette raison que j'ai fait ce choix, sachant que c'est ce qui est recommandé chez Milkywan, à la suite de plusieurs retours utilisateurs.<br>
J'utilise donc un Mikrotik HAP AC3, acheté d'occasion sur Leboncoin : c'est un routeur avec 5 ports Ethernet en Gigabit et deux antennes Wi-Fi compatibles Wi-Fi 5 (ou norme AC). C'est largement suffisant pour mes besoins.</p>
<p>Le switch de marque D-Link est toujours présent dans mon infrastructure et il gère la répartition des différents VLANs que j'utilise.</p>
<p>Les VLANs sont découpés de cette façon : le VLAN 10 sert aux serveurs et aux machines virtuelles, le VLAN 20 sert aux clients et le VLAN 30 sert aux applications indépendantes. L'isolation réseau est cette fois en place et est fonctionnelle, via des règles de pare-feu dédiées. La sécurité globale est assurée.</p>
<h3>La partie infra</h3>
<p>Concernant les serveurs, ils sont tous reliés directement sur le switch D-Link via des câbles oranges. Ils obtiennent directement le VLAN 10 et cette partie n'a pas vraiment changé au niveau de la configuration.</p>
<p>Concernant les clients, plusieurs changements sont à noter :</p>
<ul>
<li>le Wi-Fi n'est plus géré via un routeur Wi-Fi Xiaomi, mais directement par le Mikrotik</li>
<li>le CPL que j'utilise pour connecter mon bureau/laboratoire a été déplacé pour être directement connecté au switch D-Link</li>
<li>la box TV n'est plus utilisée, car fournie par mon ancien fournisseur d'accès</li>
<li>les clients sont maintenant dotés de câbles de couleur spécifique, à savoir du violet</li>
</ul>
<p>Pour mes équipements de "maison intelligente", ils sont tous connectés derrière un APU 4 relié en Wi-Fi. Ainsi, ils sont isolés du reste et n'ont pas un accès direct à Internet.</p>
<h2>Le logiciel</h2>
<p>Au niveau de mon routeur, j'ai abandonné OPNSense pour passer sur du <a href="https://mikrotik.com/software">RouterOS</a>. Ce système a l'avantage d'être assez bien optimisé pour gérer un réseau complet : accès à son interface via SSH (avec clé !) ou via un logiciel dédié utilisant l'adresse MAC du routeur, support de IPv6, support des VLAN, pare-feu avancé, utilisation de Wireguard pour les VPN. C'est un bon système pour de la gestion quotidienne et c'est souvent mis à jour : rien à redire pour moi. Au niveau du code-source, il semble que le logiciel soit basé sur un noyau Linux et plusieurs logiciels libres.</p>
<p>Au niveau de l'APU 4, j'ai tout simplement mis la dernière version stable de Debian GNU/Linux.</p>
<p>Concernant la zone DNS interne, elle est maintenant gérée par une machine virtuelle sous Alpine Linux, à l'aide des logiciels NSD et Unbound.</p>
<h2>Schéma de l'installation</h2>
<p>Et pour les personnes curieuses, voici donc une version actualisée du schéma de mon réseau local :</p>
<p><a href="/images/articles/computers/reseau2.png"><picture><source media="(min-width: 650px)" srcset="/images/miniatures/computers/reseau2.png"><source media="(max-width: 350px)" srcset="/images/mobile/computers/reseau2.png"><img alt="Schéma mis à jour de mon réseau local" src="/images/medium/computers/reseau2.png"/></picture></a></p>Organisation de mon réseau local2022-07-23T20:00:00+02:002022-07-23T20:00:00+02:00Vincent Financetag:blog.vinishor.xyz,2022-07-23:/posts/organisation-de-mon-reseau-local.html<p>Vu que j'aime bien expérimenter des choses et que je m'entraîne pour être un bon administrateur système, je me suis amusé à monter un réseau local complet avec plusieurs options qu'on ne retrouve pas forcément chez tous les particuliers. Voici donc une petite présentation rapide de mon réseau.</p><p>Vu que j'aime bien expérimenter des choses et que je m'entraîne pour être un bon administrateur système, je me suis amusé à monter un réseau local complet avec plusieurs options qu'on ne retrouve pas forcément chez tous les particuliers. Voici donc une petite présentation rapide de mon réseau.</p>
<h2>Le matériel</h2>
<h3>La partie opérateur</h3>
<p>La partie opérateur correspond à ce que mon FAI peut contrôler : je n’ai donc que peu de marge de manœuvre. Vu que je suis passé chez Free en février 2022, j’ai une Freebox Mini.
Cette Freebox est en mode bridge, c’est-à-dire qu’elle ne fonctionne pas en mode routeur, mais qu’elle transmet directement les paquets au premier équipement connecté derrière. Mon routeur est alors le seul équipement branché derrière.</p>
<h3>La partie routeur</h3>
<p>Le premier équipement de mon réseau est un routeur sous OPNSense. Il s’agit d’une machine Qotom achetée sur Aliexpress avec 4 ports Gigabit.
Son objectif est de faire tout le routage nécessaire et de gérer le pare-feu et les réseaux locaux branchés derrière.
Le premier port est directement branché sur la Freebox (Interface WAN), le deuxième est relié sur le switch central (Interface LAN), le troisième sera dédié à CARP et le quatrième ne sert pas (il est réservé au débogage).</p>
<p>Le deuxième équipement est un switch administrable de marque D-Link et équipé de 24 ports. La raison principale d’avoir 24 ports est que j’ai eu un manque de place sur mon ancien switch administrable (8 ports) et que le prix de cet équipement était raisonnable (switch d’occasion).
Il est capable de supporter ce qu’on appelle des VLAN. Un VLAN (Virtual Local Area Network) fonctionne de la même façon qu’un LAN physique, à la différence près qu’il n’a besoin que d’un seul réseau physique de câbles : on peut avoir un seul switch matériel et une seule série de câbles, mais avoir autant de réseaux virtuels que l’on souhaite (dans la limite supportée par le constructeur).
Dans mon cas, j’utilise trois VLAN : les VLAN 10, 20 et 30. Les numéros ont été choisis pour éviter de rentrer en conflit avec le VLAN 1, qui sert par défaut à gérer le switch et pour indiquer le numéro de la troisième section de l’adresse IPv4 de chacun. Ainsi, le VLAN 10, par exemple, utilise des adresses en 10.10.10.x.</p>
<p>Le VLAN 10 sert aux serveurs et aux VM. Dans ce réseau, les machines peuvent aller sur Internet et communiquer entre elles seulement.
Le VLAN 20 sert aux clients et au Wi-Fi. Ils peuvent aller partout sur le réseau et communiquer avec toutes les machines, quel que soit le VLAN d'appartenance.
Le VLAN 30 est dédié à l’IOT. On peut aller dessus, mais les machines n’auront pas le droit de sortir ailleurs que sur les adresses autorisées. Il n’y a pour le moment qu’une passerelle IKEA, mais ce réseau sera bientôt prêt pour accueillir d’autres machines si besoin. Les requêtes DNS de Google sont d’ailleurs renvoyées sur le résolveur DNS interne de OPNSense, via une règle de NAT.</p>
<p>L’intérêt de séparer son réseau est de pouvoir mieux contrôler qui fait quoi et mettre en place des limitations d’accès, ce qui peut aider à améliorer la sécurité globale.</p>
<h3>La partie infrastructure</h3>
<p>Pour le reste du réseau, j’utilise plusieurs équipements afin de m’assurer de la connectivité dans mon appartement :</p>
<ul>
<li>Un routeur Wi-Fi Gigabit de chez Xiaomi : il est en mode répéteur et ne sert qu’à relier les périphériques sans fil au réseau, via le VLAN 20. Il délègue le DHCP au routeur OPNSense.</li>
<li>Un switch classique Gigabit à 8 ports : il sert à relier le routeur Wi-fi, la box TV et le CPL au caisson Ikea qui contient tout le matériel, comme une sorte de multiprise.</li>
<li>Un CPL 1200 Mbit/s pour relier le PC de télétravail de ma petite copine, installé dans la pièce qui sert de bureau/laboratoire.</li>
</ul>
<h2>Le logiciel</h2>
<p>Concernant le switch administrable, j’utilise directement le firmware de D-Link, qui est un peu ancien. Je ne pense pas que ce modèle soit flashable, donc j’ai simplement limité l’accès au VLAN 1 aux machines du VLAN 20.</p>
<p>Concernant le routeur, j’ai fait le choix de <a href="https://opnsense.org/">OPNSense</a>. Ce système d’exploitation est un dérivé de m0n0wall, comme son homologue pfsense, sans pour autant avoir tous les soucis de licence de ce dernier. Par exemple, OPNSense est librement distribuable si vous souhaitez l’embarquer dans vos équipements, ce qui n’est pas le cas pour pfsense qui a des conditions spécifiques.</p>
<p>Concernant la box Wi-fi, j'utilise directement le firmware de chez Xiaomi en mode répéteur. Il ne fait donc que gérer les paramètres du Wi-fi, mais délègue la partie DNS et DHCP au routeur OPNSense. Bien qu'on puisse utiliser une appli dédiée, j'ai pu le configurer directement depuis le minisite du firmware, sans rien installer.</p>
<h2>Quelques options sympas</h2>
<p>En complément, voici quelques options que j’ai mises en place sur mon réseau local pour me faciliter la vie :</p>
<ul>
<li>Adressage DHCP statique : certaines adresses sont attribuées automatiquement en fonction de l’adresse MAC d’une machine. Par exemple, tous mes serveurs ont une IP fixe directement donnée par le routeur. Plus besoin de configurer manuellement l’IP !</li>
<li>Zone DNS interne : les serveurs et VM ont un nom interne en <em>x.home.arpa</em>, défini au niveau de mon résolveur DNS local. Ainsi, on peut utiliser une adresse texte au lieu de l’IP pour se connecter dessus. Le choix de <em>home.arpa</em> est motivé par <a href="https://www.shaftinc.fr/unbound-domaine-local.html">cet article</a> et par le fait que ce domaine est réservé pour les <a href="https://www.bortzmeyer.org/8375.html">usages internes uniquement</a>.</li>
</ul>
<h2>Schéma de l’installation</h2>
<p>Pour terminer, je vous présente un petit schéma de mon installation. Il a été un peu simplifié, mais il résume bien la situation générale :</p>
<table>
<thead>
<tr>
<th align="center"><a href="/images/articles/computers/lan.png"><picture><source media="(min-width: 650px)" srcset="/images/miniatures/computers/lan.png"><source media="(max-width: 350px)" srcset="/images/mobile/computers/lan.png"><img alt="Schéma simplifié de mon réseau local : on y voit une box opérateur reliée à un routeur, puis à un switch administrable. Depuis ce switch, plusieurs sous-réseaux partent vers les différents équipements connectés" src="/images/medium/computers/lan.png"/></picture></a></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"></td>
</tr>
</tbody>
</table>Gérer ses noms de domaine avec Knot et NSD2022-06-12T15:21:00+02:002022-06-12T15:21:00+02:00Vincent Financetag:blog.vinishor.xyz,2022-06-12:/posts/gestion-dns-avec-knot-et-nsd.html<p>Un article pour expliquer comment Knot et NSD gèrent mes noms de domaine</p><p>Dans la vie d'un adminsys, chaque service / brique logicielle a son niveau de criticité et son importance. Parmi eux, l'un des plus cruciaux n'est autre que le DNS. Ici, je vais donc vous décrire comment je gère mes différentes zones DNS et quelle configuration est actuellement en place, notamment pour Automario.</p>
<p>Les configurations présentes dans cet article ont été testées avec succès sur OpenBSD 6.8/6.9/7.0/7.1 et sur CentOS 8.</p>
<h2>Principes de base</h2>
<h3>DNS</h3>
<p>Le DNS (Domain Name System ou système de nom de domaine) est un service distribué qui sert à traduire les noms de domaine en adresses IP, afin de faciliter les connexions entre machines avec une série de caractères facilement mémorisables. Concrètement, il s'agit d'un système combinant plusieurs "annuaires" et les distribuant partout sur Internet, ce qui permet à n'importe qui d'aller sur une des machines hébergeant le site de Wikipedia en tapant <code>www.wikipedia.org</code>.</p>
<h3>DNSSEC</h3>
<p>DNSSEC est un protocole standardisé qui est utilisé pour protéger une zone DNS et régler certains problèmes de sécurité au niveau du DNS. Le principe est de signer la zone DNS et de publier cette signature dans la zone, afin de récupérer celle-ci et donc de valider son origine.<br>
Ce protocole permet notamment de lutter contre le <em>DNS cache poisoning</em>, un type d'attaque qui consiste à faire passer comme légitime une requête DNS contenant une autre adresse IP que celle qui est réellement utilisée, pour renvoyer le visiteur sur une autre machine, notamment pour faire de l'hameçonnage et récupérer des mots de passe ou des informations personnelles.</p>
<h3>Serveur d'autorité principal</h3>
<p>Un serveur d'autorité principal est un serveur DNS qui sert de référence pour une zone précise : c'est lui qui fournit toutes les informations concernant un nom de domaine et ses sous-domaines. Le serveur principal est également en charge des modifications : c'est sur lui qu'on effectue les modifications qui affecteront toute la zone (ajout, suppression ou modification d'entrées).</p>
<h3>Serveur d'autorité secondaire</h3>
<p>Un serveur d'autorité secondaire remplit la même mission qu'un serveur d'autorité principal, à un détail près : il ne gère pas les modifications, mais sert de serveur de secours. Si le serveur principal n'est pas joignable, c'est lui qui prend la suite des requêtes DNS. Cela permet ainsi de garder la zone synchronisée avec le reste d'Internet.<br>
Une zone peut avoir plusieurs serveurs secondaires, multipliant ainsi les solutions de repli en cas de panne. Par exemple, Automario en a deux dans deux AS (<em>Autonomous System</em>) différents.</p>
<h2>Description de ma configuration</h2>
<p>Mes noms de domaines sont gérés selon le principe suivant :</p>
<ul>
<li>Un de mes deux serveurs principaux est hébergé chez moi, dans une machine virtuelle dédiée et équipée d'un VPN pour avoir une IP propre (vu qu'il y a aussi mon serveur mail dessus)</li>
<li>Le deuxième serveur principal est situé sur une machine OpenBSD chez <a href="https://obsda.ms/" title="Lien vers le site de l'hébergeur OpenBSD Amsterdam">obsda.ms</a>. Il sert aussi de serveur secondaire pour certains de mes domaines.</li>
<li>Mon serveur DNS secondaire est hébergé chez <a href="https://arn-fai.net" title="Lien vers le site de l'association Alsace Réseau Neutre">ARN</a>, sur un VPS sous OpenBSD</li>
<li>Deux amis hébergent gentiment plusieurs de mes zones DNS sur leur machine, ils font aussi office de serveurs secondaires</li>
</ul>
<p>Si on compile ça dans un schéma, on obtient ceci :</p>
<div class="highlight"><pre><span></span><code><span class="w"> </span><span class="o">+--------------+</span><span class="w"> </span><span class="o">+--------------+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">+----------->+</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">VPN</span><span class="w"> </span><span class="err">@</span><span class="w"> </span><span class="n">home</span><span class="w"> </span><span class="o">+<--------+</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">obsda</span><span class="p">.</span><span class="n">ms</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="n">xxxx</span><span class="w"> </span><span class="n">xxxxxx</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">+--------------+</span><span class="w"> </span><span class="n">xxx</span><span class="w"> </span><span class="n">xxxx</span><span class="w"> </span><span class="n">xx</span><span class="w"> </span><span class="o">+--------------+</span>
<span class="w"> </span><span class="n">xxx</span><span class="w"> </span><span class="n">xxx</span>
<span class="w"> </span><span class="n">xx</span><span class="w"> </span><span class="n">xxx</span>
<span class="w"> </span><span class="n">xx</span><span class="w"> </span><span class="n">Internet</span><span class="w"> </span><span class="n">xx</span>
<span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xx</span>
<span class="w"> </span><span class="n">xxx</span><span class="w"> </span><span class="n">xxxx</span>
<span class="w"> </span><span class="o">+--------------+</span><span class="w"> </span><span class="n">xxxx</span><span class="w"> </span><span class="n">xx</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="o">+--------------+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="n">xxxxx</span><span class="w"> </span><span class="n">xxx</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ARN</span><span class="w"> </span><span class="n">FAI</span><span class="w"> </span><span class="o">+<---------+</span><span class="w"> </span><span class="n">xxxxxxxx</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ledzep</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">NS1</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">+------>+</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">+--------------+</span><span class="w"> </span><span class="o">+--------------+</span>
</code></pre></div>
<h2>Mise en place d'un serveur DNS principal</h2>
<h3>Avec NSD</h3>
<p>NSD est un serveur DNS plus jeune que BIND et qui a l'avantage d'être léger et plus simple à utiliser que ce dernier. Il est très bien pour faire office de serveur d'autorité et pour gérer des noms de domaine, mais il ne peut pas servir de résolveur comme BIND ou Unbound.<br>
Dans cet exemple, je vais mettre en place un serveur principal (ou <em>master</em>) pour deux zones DNS distinctes. Il communiquera avec deux autres serveurs DNS qui seront utilisés comme serveur secondaire (ou <em>slave</em>), à l'aide d'une clé TSIG pour l'authentification. Cela permet d'identifier les serveurs et surtout de bloquer les autres machines qui chercheraient à contrôler la zone DNS. Le serveur écoutera en IPv4 et en IPv6.</p>
<div class="highlight"><pre><span></span><code><span class="c1">## Config file for NSD</span>
<span class="c1"># Master DNS</span>
<span class="nt">server</span><span class="p">:</span>
<span class="w"> </span><span class="nt">server-count</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2</span>
<span class="w"> </span><span class="nt">hide-version</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yes</span>
<span class="w"> </span><span class="nt">ip-address</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">x.x.x.x</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ip-address</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2a00:xxxx:yyyy:zzz::10</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">debug-mode</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">no</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">verbosity</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2</span>
<span class="w"> </span><span class="nt">zonesdir</span><span class="p">:</span><span class="w"> </span><span class="s">"/etc/nsd/zones/"</span>
<span class="nt">remote-control</span><span class="p">:</span>
<span class="w"> </span><span class="nt">control-enable</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yes</span>
<span class="w w-Error"> </span><span class="nt">control-interface</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/var/run/nsd.sock</span>
<span class="nt">key</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">"clesecrete"</span>
<span class="w"> </span><span class="nt">algorithm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">hmac-sha256</span>
<span class="w"> </span><span class="nt">secret</span><span class="p">:</span><span class="w"> </span><span class="s">"masuperchainedecarac="</span>
<span class="nt">zone</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">"vinishor.xyz"</span>
<span class="w"> </span><span class="nt">zonefile</span><span class="p">:</span><span class="w"> </span><span class="s">"vinishor.xyz"</span>
<span class="w"> </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">y.y.y.y clesecrete</span>
<span class="w"> </span><span class="nt">provide-xfr</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">y.y.y.y clesecrete</span>
<span class="w"> </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">z.z.z.z clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">provide-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">z.z.z.z clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">notify</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::20 clesecrete</span>
<span class="w"> </span><span class="nt">provide-xfr</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::20 clesecrete</span>
<span class="w"> </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::30 clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">provide-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::30 clesecrete</span>
<span class="nt">zone</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">"automario.eu"</span>
<span class="w"> </span><span class="nt">zonefile</span><span class="p">:</span><span class="w"> </span><span class="s">"automario.eu"</span>
<span class="w"> </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">y.y.y.y clesecrete</span>
<span class="w"> </span><span class="nt">provide-xfr</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">y.y.y.y clesecrete</span>
<span class="w"> </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">z.z.z.z clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">provide-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">z.z.z.z clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">notify</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::20 clesecrete</span>
<span class="w"> </span><span class="nt">provide-xfr</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::20 clesecrete</span>
<span class="w"> </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::30 clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">provide-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::30 clesecrete</span>
</code></pre></div>
<p>La variable <code>server-count</code> sert ici à lancer plusieurs instances de NSD, notamment pour assurer son bon fonctionnement. <code>hide-version</code> est quant à lui un moyen de masquer la version de NSD, ce qui permet de ne pas divulguer cette information sur Internet et de ralentir les petits malins qui voudraient exploiter une potentielle faille (technique de la sécurité par l'obscurité). Les adresses IPv4 et IPv6 sont spécifiés séparément.<br>
Les options <code>notify</code> et <code>provide-xfr</code> servent enfin à envoyer les informations de la zone aux serveurs secondaires et à initier la connexion entre les machines.</p>
<h3>Avec Knot</h3>
<p>Knot fonctionne de la même manière que NSD, mais il a l'avantage d'utiliser YAML pour sa syntaxe et de gérer tout seul DNSSEC, ce qui est un gros plus par rapport à NSD et BIND. Dans le cas de la zone pour openbsd.fr.eu.org, vu que DNSSEC avait été mis en place auparavant, cela me semblait être un gros plus. Comme avec NSD, l'exemple montre la configuration d'un serveur principal qui utilise une clé TSIG pour l'authentification avec les serveurs secondaires et des listes d'accès (ACL) :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># This is the main configuration for Knot DNS</span>
<span class="c1"># See knot.conf(5) or refer to the server documentation.</span>
<span class="nt">server</span><span class="p">:</span>
<span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s">""</span>
<span class="w"> </span><span class="nt">rundir</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/run/knot"</span>
<span class="w"> </span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">_knot:_knot</span>
<span class="w"> </span><span class="nt">listen</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="w"> </span><span class="nv">x.x.x.x@53</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">2a00</span><span class="p p-Indicator">:</span><span class="nv">xxxx</span><span class="p p-Indicator">:</span><span class="nv">yyyy</span><span class="p p-Indicator">:</span><span class="nv">zzz</span><span class="p p-Indicator">::</span><span class="nv">10@53</span><span class="w"> </span><span class="p p-Indicator">]</span>
<span class="nt">log</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">syslog</span>
<span class="w"> </span><span class="nt">any</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">info</span>
<span class="nt">database</span><span class="p">:</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot"</span>
<span class="nt">key</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clesecrete</span>
<span class="w"> </span><span class="nt">algorithm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">hmac-sha256</span>
<span class="w"> </span><span class="nt">secret</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">masupercledecarac=</span>
<span class="nt">remote</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">arn</span>
<span class="w"> </span><span class="nt">address</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">y.y.y.y@53</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">2100</span><span class="p p-Indicator">:</span><span class="nv">xxxx</span><span class="p p-Indicator">:</span><span class="nv">yyyy</span><span class="p p-Indicator">:</span><span class="nv">zzz</span><span class="p p-Indicator">::</span><span class="nv">20@53</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clesecrete</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ledzep</span>
<span class="w"> </span><span class="nt">address</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">z.z.z.z@53</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">2100</span><span class="p p-Indicator">:</span><span class="nv">xxxx</span><span class="p p-Indicator">:</span><span class="nv">yyyy</span><span class="p p-Indicator">:</span><span class="nv">zzz</span><span class="p p-Indicator">::</span><span class="nv">30@53</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clesecrete</span>
<span class="nt">acl</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">key_rule</span>
<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clesecrete</span>
<span class="w"> </span><span class="nt">action</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">transfer</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">notify</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">update</span><span class="p p-Indicator">]</span>
<span class="nt">template</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">classic</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot/main"</span>
<span class="w"> </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="s">"%s.zone"</span>
<span class="w"> </span><span class="nt">semantic-checks</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="nt">zonefile-load</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">difference</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">secondary</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot/secondary"</span>
<span class="w"> </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="s">"%s.zone"</span>
<span class="w"> </span><span class="nt">semantic-checks</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="nt">zonefile-load</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">difference</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">secure</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot/secure"</span>
<span class="w"> </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="s">"%s.zone"</span>
<span class="w"> </span><span class="nt">semantic-checks</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="nt">dnssec-signing</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="nt">dnssec-policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">default</span>
<span class="w"> </span><span class="nt">zonefile-load</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">difference</span>
<span class="nt">zone</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># Zone with DNSSEC</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">openbsd.fr.eu.org</span>
<span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">secure</span>
<span class="w"> </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">ledzep</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">arn</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="nt">acl</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">key_rule</span>
</code></pre></div>
<p>Voici quelques précisions concernant cette configuration :</p>
<ul>
<li>Knot utilise un système de templates pour définir les différents types de zones DNS (ici, un template est dédié aux zones avec DNSSEC, aux zones sans DNSSEC et aux zones en mode serveur secondaire)</li>
<li>La section ACL permet de définir les permissions sur la clé TSIG, mais il est possible de le faire sur une liste d'adresses IP à la place</li>
<li>L'option <code>version</code> avec le paramètre vide permet de cacher la version de Knot, comme sur NSD. Par défaut, celle-ci est affiché.</li>
</ul>
<h2>Mise en place d'un serveur DNS secondaire</h2>
<h3>Avec NSD</h3>
<p>Sur le serveur secondaire, la configuration de NSD ressemble beaucoup à celle présente au-dessus, tout en étant plus courte :</p>
<div class="highlight"><pre><span></span><code><span class="c1">## Config file for NSD</span>
<span class="c1"># Secondary DNS</span>
<span class="nt">server</span><span class="p">:</span>
<span class="w"> </span><span class="nt">server-count</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2</span>
<span class="w w-Error"> </span><span class="nt">ip-address</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">y.y.y.y</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ip-address</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2100:xxxx:yyyy:zzz::20</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">debug-mode</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">no</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">verbosity</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2</span>
<span class="w"> </span><span class="nt">zonesdir</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/nsd/zones/"</span>
<span class="nt">remote-control</span><span class="p">:</span>
<span class="w"> </span><span class="nt">control-enable</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yes</span>
<span class="w w-Error"> </span><span class="nt">control-interface</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/var/run/nsd.sock</span>
<span class="nt">key</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">"clesecrete"</span>
<span class="w"> </span><span class="nt">algorithm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">hmac-sha256</span>
<span class="w"> </span><span class="nt">secret</span><span class="p">:</span><span class="w"> </span><span class="s">"masuperchainedecarac="</span>
<span class="c1"># Secondaires</span>
<span class="nt">zone</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">"vinishor.xyz"</span>
<span class="w"> </span><span class="nt">zonefile</span><span class="p">:</span><span class="w"> </span><span class="s">"slave/vinishor.xyz"</span>
<span class="w w-Error"> </span><span class="nt">allow-notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">x.x.x.x clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">request-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">x.x.x.x clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">allow-notify</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2a00:xxxx:yyyy:zzz::10 clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">request-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2a00:xxxx:yyyy:zzz::10 clesecrete</span>
<span class="nt">zone</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">"automario.eu"</span>
<span class="w"> </span><span class="nt">zonefile</span><span class="p">:</span><span class="w"> </span><span class="s">"slave/automario.eu"</span>
<span class="w w-Error"> </span><span class="nt">allow-notify</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">x.x.x.x clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">request-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">x.x.x.x clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">allow-notify</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2a00:xxxx:yyyy:zzz::10 clesecrete</span>
<span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">request-xfr</span><span class="p p-Indicator">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2a00:xxxx:yyyy:zzz::10 clesecrete</span>
</code></pre></div>
<p>On notera ainsi que la section zone utilise l'adresse IP du serveur principal avec les instructions <code>allow-notify</code> et <code>request-xfr</code>. Ces deux instructions servent à envoyer les requêtes pour récupérer les zones DNS et leurs mises à jour et autoriser les flux entre les deux serveurs. La clé secrète est également identique, vu qu'elle sert d'équivalent mot de passe.<br>
Cette configuration fonctionne aussi bien pour une zone classique que pour une zone utilisant DNSSEC. C'est pour cette raison que je n'utilise que NSD dans le cas d'un serveur secondaire.</p>
<h3>Avec Knot</h3>
<p>Même si mon serveur principal sous Knot sert aussi de serveur secondaire pour certaines de mes zones, voici la configuration correspondante pour obtenir un serveur secondaire :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># This is a sample of a minimal configuration file for Knot DNS.</span>
<span class="c1"># See knot.conf(5) or refer to the server documentation.</span>
<span class="nt">server</span><span class="p">:</span>
<span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s">""</span>
<span class="w"> </span><span class="nt">rundir</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/run/knot"</span>
<span class="w"> </span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">_knot:_knot</span>
<span class="w"> </span><span class="nt">listen</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="w"> </span><span class="nv">y.y.y.y@53</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">2100</span><span class="p p-Indicator">:</span><span class="nv">xxxx</span><span class="p p-Indicator">:</span><span class="nv">yyyy</span><span class="p p-Indicator">:</span><span class="nv">zzz</span><span class="p p-Indicator">::</span><span class="nv">20@53</span><span class="w"> </span><span class="p p-Indicator">]</span>
<span class="nt">log</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">syslog</span>
<span class="w"> </span><span class="nt">any</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">info</span>
<span class="nt">database</span><span class="p">:</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot"</span>
<span class="nt">key</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clesecrete</span>
<span class="w"> </span><span class="nt">algorithm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">hmac-sha256</span>
<span class="w"> </span><span class="nt">secret</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">masupercledecarac=</span>
<span class="nt">remote</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">main</span>
<span class="w"> </span><span class="nt">address</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">x.x.x.x@53</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">2a00</span><span class="p p-Indicator">:</span><span class="nv">xxxx</span><span class="p p-Indicator">:</span><span class="nv">yyyy</span><span class="p p-Indicator">:</span><span class="nv">zzz</span><span class="p p-Indicator">::</span><span class="nv">10@53</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clesecrete</span>
<span class="nt">acl</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">key_rule</span>
<span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clesecrete</span>
<span class="w"> </span><span class="nt">action</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">transfer</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">notify</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">update</span><span class="p p-Indicator">]</span>
<span class="nt">template</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">classic</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot/main"</span>
<span class="w"> </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="s">"%s.zone"</span>
<span class="w"> </span><span class="nt">semantic-checks</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">secondary</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot/secondary"</span>
<span class="w"> </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="s">"%s.zone"</span>
<span class="w"> </span><span class="nt">semantic-checks</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">secure</span>
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="s">"/var/db/knot/secure"</span>
<span class="w"> </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="s">"%s.zone"</span>
<span class="w"> </span><span class="nt">semantic-checks</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="nt">dnssec-signing</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">on</span>
<span class="w"> </span><span class="nt">dnssec-policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">default</span>
<span class="w"> </span><span class="nt">zonefile-load</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">difference</span>
<span class="nt">zone</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># Secondary zone</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vinishor.xyz</span>
<span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">secondary</span>
<span class="w"> </span><span class="nt">master</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">main</span>
<span class="w"> </span><span class="nt">acl</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">key_rule</span>
</code></pre></div>
<h2>Quelques commandes pour utiliser Knot au quotidien</h2>
<h3>Afficher les clés DS pour DNSSEC</h3>
<p>Pour terminer la configuration de DNSSEC sur une zone DNS, il convient de publier chez votre registraire ce qu'on appelle les clés DS. Ces clés sont calculées à partir des clés ZSK et KSK et permettent d'identifier et de confirmer l'origine des requêtes DNS. Pour une utilisation quotidienne, on utilise les clés DS générées sur la clé KSK.<br>
Par défaut, au premier lancement, Knot génère tout seul le nécessaire, mais n'affiche pas les clés DS. Pour les afficher, on peut alors utiliser deux méthodes :</p>
<ul>
<li>utiliser deux commandes de la console de Knot :</li>
</ul>
<div class="highlight"><pre><span></span><code><span class="c1"># keymgr openbsd.fr.eu.org list</span>
xxxxxxxxxxxxxxxxxxxxxxxxxx<span class="w"> </span><span class="nv">ksk</span><span class="o">=</span>no<span class="w"> </span><span class="nv">zsk</span><span class="o">=</span>yes<span class="w"> </span><span class="nv">tag</span><span class="o">=</span><span class="m">58970</span><span class="w"> </span><span class="nv">algorithm</span><span class="o">=</span><span class="m">13</span><span class="w"> </span><span class="nv">size</span><span class="o">=</span><span class="m">256</span><span class="w"> </span>public-only<span class="o">=</span>no<span class="w"> </span>pre-active<span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">publish</span><span class="o">=</span><span class="m">1653669698</span><span class="w"> </span><span class="nv">ready</span><span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">active</span><span class="o">=</span><span class="m">1653669698</span><span class="w"> </span>retire-active<span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">retire</span><span class="o">=</span><span class="m">0</span><span class="w"> </span>post-active<span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">revoke</span><span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">remove</span><span class="o">=</span><span class="m">0</span>
yyyyyyyyyyyyyyyyyyyyyyyyyy<span class="w"> </span><span class="nv">ksk</span><span class="o">=</span>yes<span class="w"> </span><span class="nv">zsk</span><span class="o">=</span>no<span class="w"> </span><span class="nv">tag</span><span class="o">=</span><span class="m">45098</span><span class="w"> </span><span class="nv">algorithm</span><span class="o">=</span><span class="m">13</span><span class="w"> </span><span class="nv">size</span><span class="o">=</span><span class="m">256</span><span class="w"> </span>public-only<span class="o">=</span>no<span class="w"> </span>pre-active<span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">publish</span><span class="o">=</span><span class="m">1653669698</span><span class="w"> </span><span class="nv">ready</span><span class="o">=</span><span class="m">1653669698</span><span class="w"> </span><span class="nv">active</span><span class="o">=</span><span class="m">0</span><span class="w"> </span>retire-active<span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">retire</span><span class="o">=</span><span class="m">0</span><span class="w"> </span>post-active<span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">revoke</span><span class="o">=</span><span class="m">0</span><span class="w"> </span><span class="nv">remove</span><span class="o">=</span><span class="m">0</span>
<span class="c1"># keymgr openbsd.fr.eu.org ds 45098 # 45098 = id de la clé KSK</span>
openbsd.fr.eu.org.<span class="w"> </span>DS<span class="w"> </span><span class="m">45098</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">2</span><span class="w"> </span>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
openbsd.fr.eu.org.<span class="w"> </span>DS<span class="w"> </span><span class="m">45098</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">4</span><span class="w"> </span>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
</code></pre></div>
<ul>
<li>utiliser <code>drill</code> pour afficher les clés :</li>
</ul>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>drill<span class="w"> </span>@dns.openbsd.fr.eu.org<span class="w"> </span>-s<span class="w"> </span>openbsd.fr.eu.org<span class="w"> </span>DNSKEY
<span class="p">;;</span><span class="w"> </span>->>HEADER<span class="s"><<- opcode: QUERY, rcode: NOERROR, id: 44910</span>
<span class="s">;; flags: qr aa rd ; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 </span>
<span class="s">;; QUESTION SECTION:</span>
<span class="s">;; op</span>enbsd.fr.eu.org.<span class="w"> </span>IN<span class="w"> </span>DNSKEY
<span class="p">;;</span><span class="w"> </span>ANSWER<span class="w"> </span>SECTION:
openbsd.fr.eu.org.<span class="w"> </span><span class="m">86400</span><span class="w"> </span>IN<span class="w"> </span>DNSKEY<span class="w"> </span><span class="m">256</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="nv">xxxxxxxxxxxxxxxxxxx</span><span class="o">==</span><span class="w"> </span><span class="p">;</span><span class="o">{</span><span class="nv">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">58970</span><span class="w"> </span><span class="o">(</span>zsk<span class="o">)</span>,<span class="w"> </span><span class="nv">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>256b<span class="o">}</span>
openbsd.fr.eu.org.<span class="w"> </span><span class="m">86400</span><span class="w"> </span>IN<span class="w"> </span>DNSKEY<span class="w"> </span><span class="m">257</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="nv">yyyyyyyyyyyyyyyyyyy</span><span class="o">==</span><span class="w"> </span><span class="p">;</span><span class="o">{</span><span class="nv">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">45098</span><span class="w"> </span><span class="o">(</span>ksk<span class="o">)</span>,<span class="w"> </span><span class="nv">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>256b<span class="o">}</span>
<span class="p">;;</span><span class="w"> </span>AUTHORITY<span class="w"> </span>SECTION:
<span class="p">;;</span><span class="w"> </span>ADDITIONAL<span class="w"> </span>SECTION:
<span class="p">;;</span><span class="w"> </span>Query<span class="w"> </span>time:<span class="w"> </span><span class="m">22</span><span class="w"> </span>msec
<span class="p">;;</span><span class="w"> </span>SERVER:<span class="w"> </span><span class="m">46</span>.23.94.78
<span class="p">;;</span><span class="w"> </span>WHEN:<span class="w"> </span>Sun<span class="w"> </span>Jun<span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">18</span>:18:07<span class="w"> </span><span class="m">2022</span>
<span class="p">;;</span><span class="w"> </span>MSG<span class="w"> </span>SIZE<span class="w"> </span>rcvd:<span class="w"> </span><span class="m">195</span>
<span class="p">;</span>
<span class="p">;</span><span class="w"> </span>equivalent<span class="w"> </span>DS<span class="w"> </span>records<span class="w"> </span><span class="k">for</span><span class="w"> </span>key<span class="w"> </span><span class="m">58970</span>:
<span class="p">;</span><span class="w"> </span>sha1:<span class="w"> </span>openbsd.fr.eu.org.<span class="w"> </span><span class="m">86400</span><span class="w"> </span>IN<span class="w"> </span>DS<span class="w"> </span><span class="m">58970</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>fffffffffffffffff
<span class="p">;</span><span class="w"> </span>sha256:<span class="w"> </span>openbsd.fr.eu.org.<span class="w"> </span><span class="m">86400</span><span class="w"> </span>IN<span class="w"> </span>DS<span class="w"> </span><span class="m">58970</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">2</span><span class="w"> </span>ffffffffffffffffffffffffffffffffff
<span class="p">;</span>
<span class="p">;</span><span class="w"> </span>equivalent<span class="w"> </span>DS<span class="w"> </span>records<span class="w"> </span><span class="k">for</span><span class="w"> </span>key<span class="w"> </span><span class="m">45098</span>:
<span class="p">;</span><span class="w"> </span>sha1:<span class="w"> </span>openbsd.fr.eu.org.<span class="w"> </span><span class="m">86400</span><span class="w"> </span>IN<span class="w"> </span>DS<span class="w"> </span><span class="m">45098</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>eeeeeeeeeeeeeeeee
<span class="p">;</span><span class="w"> </span>sha256:<span class="w"> </span>openbsd.fr.eu.org.<span class="w"> </span><span class="m">86400</span><span class="w"> </span>IN<span class="w"> </span>DS<span class="w"> </span><span class="m">45098</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">2</span><span class="w"> </span>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
</code></pre></div>
<p>Il suffit alors de copier-coller les enregistrements DS fournis par la console dans l'interface de votre registraire et d'attendre un peu le temps que le tout se synchronise. DNSSEC sera ensuite opérationnel sur votre domaine.</p>
<h3>Gérer sa zone DNS avec Knot</h3>
<p>Au premier lancement, Knot lit le fichier contenant votre zone DNS et le remplace par un format modifié, ce qui complique les modifications manuelles. Pour gérer les zones DNS, on peut utiliser le mode interactif de Knot : cela consiste à activer l'édition, entrer les modifications et valider le tout en <em>commitant</em>.<br>
Un exemple valant mille mots, voici comment ajouter une entrée dans la zone DNS de <code>openbsd.fr.eu.org</code> :</p>
<div class="highlight"><pre><span></span><code><span class="c1"># knotc zone-begin openbsd.fr.eu.org</span>
<span class="c1"># knotc zone-set openbsd.fr.eu.org @ 86400 SOA dns.openbsd.fr.eu.org. linuxmario.linuxmario.net. 2022052708 10800 3600 1209600 3600</span>
<span class="c1"># knotc zone-set openbsd.fr.eu.org www 86400 CNAME openbsd.fr.eu.org.</span>
<span class="c1"># knotc zone-diff openbsd.fr.eu.org</span>
<span class="c1"># knotc zone-commit openbsd.fr.eu.org</span>
</code></pre></div>
<p>On a donc l'ordre :</p>
<ul>
<li>l'activation des modifications sur la zone DNS de <code>openbsd.fr.eu.org</code></li>
<li>la modification du serial du SOA (<em>Start Of Autority</em>) avec la date de la dernière modification et du nombre de modifications (1 si un seul changement, 2 si deux changements, etc) : il s'agit de la partie commençant par 2022xxx</li>
<li>l'ajout d'une entrée quelconque (ici, un champ CNAME)</li>
<li>la visualisation des différences pour vérifier les modifications</li>
<li>la validation du tout avec publication automatique</li>
</ul>
<p>Si vous faites beaucoup de modifications et que vous voulez éviter de tout casser sur votre zone, <a href="https://www.knot-dns.cz/docs/3.0/singlehtml/#reading-and-editing-the-zone-file-safely" title="Lien pour activer la protection de la zone DNS avant modifications">cette section de la documentation Knot</a> vous permet de geler les mises à jour de zone par sécurité.</p>
<h2>Conclusion</h2>
<p>Avec cet article, vous avez maintenant toutes les cartes en main pour gérer proprement et simplement vos zones DNS. Après tout, pourquoi laisser son registraire s'occuper de vos DNS quand vous pouvez le faire vous-même !</p>
<hr>
<p>Sources de l'article :</p>
<ul>
<li><a href="https://lord.re/posts/63-dns-mega-guide/">Guide ultime du serveur DNS</a></li>
<li><a href="https://dustri.org/b/ditching-bind9-for-unbound-and-knot.html">Ditching Bind9 for Unbound and Knot </a></li>
<li><a href="https://www.knot-dns.cz/docs/3.0/singlehtml/index.html#access-control-list-acl">Access control list (ACL) - Knot DNS Documentation</a></li>
<li><a href="https://www.swordarmor.fr/gestion-automatique-de-dnssec-avec-knot.html">Gestion automatique de DNSSEC avec knot</a></li>
</ul>Mettre en place IPv6 avec une freebox et OPNSense2022-05-08T21:00:00+02:002022-05-08T21:00:00+02:00Vincent Financetag:blog.vinishor.xyz,2022-05-08:/posts/mettre-en-place-ipv6-avec-une-freebox-et-opnsense.html<p>Voici un tutoriel pour utiliser et configurer IPv6 sur OPNSense via une Freebox (tous modèles confondus).</p><p>Après mon déménagement, j'ai choisi de changer mon FAI pour Free, notamment pour profiter du mode bridge de la Freebox et surtout pour obtenir une connexion IPv6 stable et fiable (même si Hurricane Electric me fait la tronche).<br>
Dans cet article, je vais donc vous montrer comment mettre en place IPv6 sur un routeur sous OPNSense, situé derrière une Freebox en mode bridge. Je vous recommande d'avoir quelques notions en réseau, même si je ne suis pas un expert en la matière, afin de pouvoir mieux comprendre ce que je vais décrire par la suite.</p>
<h2>Description de mon réseau</h2>
<p>Mon installation se compose de la manière suivante :</p>
<ul>
<li>Une Freebox mini 4K en mode bridge (c'est-à-dire en mode délégation de son IP publique)</li>
<li>Un routeur sous OPNSense</li>
<li>Un switch administrable D-Link (Managed switch)</li>
<li>Plusieurs VLAN dédiés (un pour mes machines virtuelles et serveurs, un pour mes clients et un pour l'IoT)</li>
</ul>
<p>Ici, le but est de fournir IPv6 sur deux VLAN : celui dédié à mes serveurs et celui dédiés aux clients (PC portables, téléphones, etc). La configuration finale ressemblera au schéma suivant :</p>
<div class="highlight"><pre><span></span><code><span class="w"> </span><span class="o">+---------+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Freebox</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">+----+----+</span>
<span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Préfixe</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="n">v</span>
<span class="w"> </span><span class="o">+---------+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Routeur</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">+--+---+--+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="n">v</span>
<span class="w"> </span><span class="o">+--------+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Switch</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">+--+--+--+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span>
<span class="o">+----------+</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">+----------+</span>
<span class="o">|</span><span class="w"> </span><span class="n">VLAN</span><span class="w"> </span><span class="n">VM</span><span class="w"> </span><span class="o">|<-----+</span><span class="w"> </span><span class="o">+----->|</span><span class="w"> </span><span class="n">VLAN</span><span class="w"> </span><span class="n">CLI</span><span class="w"> </span><span class="o">|</span>
<span class="o">+----------+</span><span class="w"> </span><span class="o">+----------+</span>
<span class="w"> </span><span class="n">Préfixe</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">Préfixe</span><span class="w"> </span><span class="mi">3</span>
</code></pre></div>
<h2>Récupération des informations de base</h2>
<p>Je vais partir du principe que votre OPNSense est configuré et fonctionnel et que vos VLAN / LAN sont configurés correctement en IPv4. Nous avons donc dans notre cas la configuration suivante :</p>
<ul>
<li>Une interface WAN qui récupère l'IP publique depuis la Freebox</li>
<li>Une interface LAN qui sert de support aux VLAN</li>
<li>Deux VLAN à configurer en IPv6 : VM et CLI</li>
</ul>
<p>Avant d'aller sur la Freebox, nous avons besoin de récupérer l'adresse <code>Lien local IPv6</code> de notre interface WAN. Cela nous permettra de relier le routeur à la Freebox et de récupérer les plages IPv6 à distribuer via délégation.<br>
Se rendre alors dans <strong>Interfaces > Overview</strong> depuis l'interface d'OPNSense et cliquer sur la section <strong>WAN Interface</strong> pour afficher les informations de l'interface réseau. Recopier ensuite la valeur de <strong>IPv6 link-local</strong> sans le <strong>/64</strong> de la fin.</p>
<h2>Délégation des plages sur la Freebox</h2>
<p>Se connecter ensuite sur l'interface de la Freebox via <code>https://mafreebox.freebox.fr/</code> (depuis votre réseau local), s'authentifier et aller dans <strong>Paramètres de la Freebox > Mode avancé > Configuration IPv6</strong>. Une fois la fenêtre ouverte, on peut regarder la partie <em>Délégation de préfixe</em> : c'est ici que se trouve les préfixes IPv6 fournis par Free pour notre réseau local. Coller alors la valeur <strong>IPv6 link-local</strong> récupérée précédemment dans la case <strong>Next Hop</strong>. Cette opération est à faire dans les trois premières cases affichées, afin de déléguer trois préfixes pour notre routeur. Cliquer ensuite sur <strong>Sauvegarder</strong>.<br>
Une fois cela fait, noter de côté les préfixes affichés, puisque cela va nous servir pour plus tard. Valider enfin avec <strong>OK</strong> pour quitter le menu.</p>
<p>Dans mon cas, j'obtiens donc ceci :</p>
<ul>
<li><code>2a01:w0w:c00l:8xx0::/64</code></li>
<li><code>2a01:w0w:c00l:8xx1::/64</code> </li>
<li><code>2a01:w0w:c00l:8xx2::/64</code></li>
</ul>
<h2>Activer IPv6 sur OPNSense</h2>
<h3>Configuration de l'interface WAN</h3>
<h4>Définir une IP fixe</h4>
<p>Dans l'interface d'OPNSense, se rendre dans la section <strong>Interfaces > WAN</strong> pour configurer la première IPv6 sur l'interface extérieure. Dans le menu à côté de <strong>IPv6 Configuration Type</strong>, sélectionner l'option <strong>Static IPv6</strong>. Descendre ensuite jusqu'à atteindre la zone <strong>Static IPv6 configuration</strong>. Ici, indiquer alors une IPv6 formée avec le premier préfixe que l'on a récupéré plus haut. J'ai choisi de mettre un 2 tout à la fin de l'adresse, ce qui donne quelque comme : <code>2a01:w0w:c00l:8xx0::2</code>. Choisir 64 dans le menu déroulant à côté.<br>
Dans la partie <strong>IPv6 Upstream Gateway</strong>, cliquer sur le bouton <strong>+</strong> pour créer une nouvelle passerelle. Laissez coché la case <strong>Default gateway</strong> et mettre le même préfixe que celui dans la partie <em>IPv6 address</em> et ajouter un 1 à la fin. Cliquer sur <strong>Save</strong> en bas, puis une deuxième fois tout en bas.</p>
<p>Le système vous propose alors d'appliquer les modifications en cliquant sur <strong>Apply changes</strong>. Cliquer sur ce bouton pour valider. L'interface se voit attibuer une nouvelle IPv6 qui permettra de communiquer avec la Freebox, cette dernière ayant l'IP finissant en 1.</p>
<h4>Activer l'annonce de routeur (Router Advertisement)</h4>
<p>Une fois l'IP définie, il est nécessaire de configurer la partie <em>Router Advertisement</em> pour pouvoir signaler la présence du routeur et établir les connexions vers l'extérieur.</p>
<p>Se rendre donc dans la section <strong>Services > Router Advertisement > WAN</strong> et indiquer les options suivantes :</p>
<ul>
<li><code>Router Only</code> dans le menu <em>Router Advertisements</em></li>
<li><code>Normal</code> dans le menu <em>Router Priority</em></li>
</ul>
<p>Laisser le reste avec les options par défaut et cliquer sur <strong>Save</strong> tout en bas pour valider.</p>
<h3>Configuration de l'interface VLAN VM</h3>
<h4>Définir une IP fixe</h4>
<p>Dans l'interface d'OPNSense, se rendre dans la section <strong>Interfaces > VLAN > VM</strong> pour configurer l'adresse IPv6 du premier VLAN. Dans le menu à côté de <strong>IPv6 Configuration Type</strong>, sélectionner l'option <strong>Static IPv6</strong>. Descendre ensuite jusqu'à atteindre la zone <strong>Static IPv6 configuration</strong>. Ici, indiquer alors une IPv6 formée avec le deuxième préfixe que l'on a récupéré plus haut. J'ai choisi de mettre un 2 tout à la fin de l'adresse, ce qui donne quelque comme : <code>2a01:w0w:c00l:8xx1::2</code>. Choisir 64 dans le menu déroulant à côté.<br>
Dans la partie <strong>IPv6 Upstream Gateway</strong>, laisser l'option <code>Auto-detect</code> et cliquer sur <strong>Save</strong> en bas, puis une deuxième fois tout en bas.</p>
<p>Le système vous propose alors d'appliquer les modifications en cliquant sur <strong>Apply changes</strong>. Cliquer sur ce bouton pour valider. L'interface se voit attibuer une nouvelle IPv6 de la plage dédiée aux machines virtuelles.</p>
<h4>Activer l'annonce de routeur (Router Advertisement)</h4>
<p>Une fois l'IP définie, il est nécessaire de configurer la partie <em>Router Advertisement</em> pour pouvoir signaler la présence du routeur et permettre aux machines clientes d'obtenir une nouvelle IP automatiquement.</p>
<p>Se rendre donc dans la section <strong>Services > Router Advertisement > VM</strong> et indiquer les options suivantes :</p>
<ul>
<li><code>Assisted</code> dans le menu <em>Router Advertisements</em></li>
<li><code>Normal</code> dans le menu <em>Router Priority</em></li>
<li>Dans la section <strong>Advertise Routes</strong>, indiquer le préfixe utilisé précédemment, ici <code>2a01:w0w:c00l:8xx1::</code>, dans la partie <em>Prefix</em> et <code>64</code> dans la partie <em>Length</em></li>
</ul>
<p>Laisser le reste avec les options par défaut et cliquer sur <strong>Save</strong> tout en bas pour valider.</p>
<h3>Configuration de l'interface VLAN CLI</h3>
<p>Pour la configuration du deuxième VLAN, il suffit de reprendre le même processus que celui du VLAN dédié aux VMs, en remplaçant le préfixe utilisé par le troisième préfixe que l'on peut trouver dans le menu de la Freebox. Ce processus est aussi valable pour une interface réseau de type LAN et pour tout autre VLAN disponible, sachant que la Freebox propose en tout 6 préfixes IPv6 à attribuer par abonné.</p>
<h2>Configurer le pare-feu</h2>
<h3>Activer IPv6</h3>
<p>Avant de configurer notre pare-feu, il convient de vérifier qu'IPv6 est bien actif et que le filtrage fonctionne. Se rendre alors dans la section <strong>Firewall > Settings > Advanced</strong> et cocher la case <strong>Allow IPv6</strong> si elle ne l'est pas. Appliquer ensuite les modifications en cliquant sur le bouton <strong>Apply changes</strong> tout en haut.</p>
<h3>Ajouter les règles pour le trafic sortant</h3>
<p>Par défaut, le pare-feu ne laisse pas passer le trafic sortant, y compris le ping. Il est donc normal que vos machines n'aient pas accès à Internet via le protocole IPv6. Nous allons donc autoriser le trafic sortant sur nos réseaux locaux.<br>
Aller dans la section <strong>Firewall > Rules > VM</strong> pour afficher les règles en place sur l'interface <em>VM</em>.</p>
<p>Cliquer sur le bouton <strong>+</strong> et ajouter une règle selon le modèle suivant :</p>
<ul>
<li>Choisir <code>Pass</code> dans la section <strong>Action</strong></li>
<li>Choisir <code>In</code> dans la section <strong>Direction</strong></li>
<li>Choisir <code>IPv4 + IPv6</code> dans la section <strong>TCP/IP Version</strong></li>
<li>Choisir <code>VM Net</code> dans la section <strong>Source</strong></li>
<li>Cocher la case <strong>Log packets that are handled by this rule</strong></li>
<li>Ajouter un commentaire de votre choix dans le champ <strong>Description</strong></li>
</ul>
<p>Laisser le reste avec les options par défaut et cliquer sur <strong>Save</strong> tout en bas pour valider. La nouvelle règle s'affiche alors et on peut recharger le pare-feu en cliquant sur le bouton <strong>Apply changes</strong> tout en haut.</p>
<p>Répéter la même opération pour l'interface CLI en allant dans la section <strong>Firewall > Rules > VM</strong> et en remplaçant <code>VM Net</code> par <code>CLI Net</code> pour associer le trafic au bon réseau local.</p>
<h3>Ajouter les règles pour le trafic entrant</h3>
<p>Par défaut, le pare-feu ne laisse pas passer le trafic entrant, y compris le ping. Il est donc normal que vos machines ne soient pas accessibles depuis l'extérieur et cela est une bonne chose pour la sécurité. Pour autant, si on veut que les machines virtuelles puissent être accessibles de l'extérieur, il est nécessaire de rajouter quelques règles pour autoriser le trafic entrant.<br>
Aller dans la section <strong>Firewall > Rules > WAN</strong> pour afficher les règles en place sur l'interface <em>VM</em>.</p>
<p>Cliquer sur le bouton <strong>+</strong> et ajouter une règle selon le modèle suivant :</p>
<ul>
<li>Choisir <code>Pass</code> dans la section <strong>Action</strong></li>
<li>Choisir <code>In</code> dans la section <strong>Direction</strong></li>
<li>Choisir <code>IPv6</code> dans la section <strong>TCP/IP Version</strong></li>
<li>Choisir <code>Single host or Network</code> dans la section <strong>Destination</strong> et renseigner l'adresse IPv6 de la machine à autoriser dans le champ juste en dessous. Choisir <code>/64</code> dans le menu déroulant à droite.</li>
<li>Cocher la case <strong>Log packets that are handled by this rule</strong></li>
<li>Ajouter un commentaire de votre choix dans le champ <strong>Description</strong></li>
</ul>
<p>Laisser le reste avec les options par défaut et cliquer sur <strong>Save</strong> tout en bas pour valider. La nouvelle règle s'affiche alors et on peut recharger le pare-feu en cliquant sur le bouton <strong>Apply changes</strong> tout en haut.<br>
Il vous suffit enfin de répéter l'opération autant de fois que nécessaire pour autoriser tous vos serveurs. Veuillez cependant noter que cela autorise, en l'état, tout le trafic entrant et qu'il faut avoir un pare-feu actif sur la machine qui sera ouverte sur Internet. Il est possible alors de filtrer les ports accessibles directement dans la règle sur OPNSense, en choisissant un port ou un rang de ports dans le champ <strong>Destination port range</strong>.</p>
<h2>Tester</h2>
<p>Pour vérifier que votre machine obtient bien une adresse IPv6, il vous suffit de vous déconnecter et de vous reconnecter (sauf si vous avez désactivé IPv6). Une nouvelle adresse commençant par le préfixe correspondant s'affichera dans vos paramètres réseaux.</p>
<p>Pour vérifier la connectivité IPv6 et son bon fonctionnement, il est possible de visiter les sites suivants :</p>
<ul>
<li><a href="https://ip.lafibre.info/">https://ip.lafibre.info/</a> : cette page vous donne les infos de votre connexion (IPv4 et IPv6)</li>
<li><a href="https://www.kame.net/">The KAME project</a> : le logo de la tortue danse si vous êtes en IPv6</li>
<li><a href="https://ipv6-test.com/">ipv6 test</a> : cette page affiche vos deux adresses et indique si IPv6 fonctionne ou non</li>
</ul>
<hr>
<p>Source de l'article : <a href="https://www.osnet.eu/fr/content/tutoriels/ipv6-sur-une-freebox-en-bridge-avec-opnsense-ou-pfsense">https://www.osnet.eu/fr/content/tutoriels/ipv6-sur-une-freebox-en-bridge-avec-opnsense-ou-pfsense</a></p>