<p>Mon infrastructure est entièrement hébergée chez moi, à l’exception d’<codeclass="language-plaintext highlighter-rouge">Amber</code>, un VPS en location chez <ahref="https://contabo.com/">Contabo</a>, en Allemagne. Elle ne contient pas de données et me sert uniquement de gateway externe (et d’IP).</p>
<p><codeclass="language-plaintext highlighter-rouge">Cirdan</code> est un EdgeRouter X, acheté 35€ sur Leboncoin en août 2024. Il sert à la fois de routeur principal de l’infrastructure, de terminaison Wireguard pour le tunnel avec <codeclass="language-plaintext highlighter-rouge">Amber</code>, et de DHCP pour les clients du réseau (tous les serveurs sont en ip statique).</p>
<p><codeclass="language-plaintext highlighter-rouge">Gandalf</code> est mon hyperviseur principal, sous Proxmox VE 8. C’est un serveur monté moi-même avec des composants PC.</p>
<p>Le SSD sert de disque OS pour Proxmox, et n’est pas en RAID. Les 3 disques durs sont en RAIDZ1 et servent à héberger les disques des machines hébergées dessus. La très grande majorité, voire la totalité de mes machines sont des LXC, pour des raisons de simplicité et de performance.</p>
<p>J’utilise ma Freebox comme routeur et borne Wi-Fi, bien que la majorité du routage soit fait par <codeclass="language-plaintext highlighter-rouge">Cirdan</code>.</p>
<p>Enfin, j’utilise deux switchs Netgear GS608 comme switchs stupides.</p>
<h2id="plan-dadressage">Plan d’adressage</h2>
<p>Mon réseau est séparé de manière thématique, et chaque sous-réseau est associé à un nom de domaine. Ces réseaux ne sont pas isolés par VLAN (car mes bornes Wi-Fi et mes switchs ne le supportent pas).</p>
<ul>
<li><codeclass="language-plaintext highlighter-rouge">client.chapo.li</code> (<codeclass="language-plaintext highlighter-rouge">10.255.1.0/24</code>) : contient les appareils branchés en Wi-Fi ou filaire à mon réseau (ordinateurs, téléphones, télévision, consoles…). C’est le seul réseau avec DHCP.</li>
<li><codeclass="language-plaintext highlighter-rouge">vm.chapo.li</code> (<codeclass="language-plaintext highlighter-rouge">10.255.3.0/24</code>) : contient les machines virtuelles.</li>
<li><codeclass="language-plaintext highlighter-rouge">gw.chapo.li</code> (<codeclass="language-plaintext highlighter-rouge">192.168.1.0/24</code>) : contient uniquement le lien entre <codeclass="language-plaintext highlighter-rouge">Cirdan</code> et la Freebox.</li>
<li><codeclass="language-plaintext highlighter-rouge">wg.chapo.li</code> (<codeclass="language-plaintext highlighter-rouge">172.31.0.0/24</code>) : contient les terminaisons Wireguard (<codeclass="language-plaintext highlighter-rouge">Cirdan</code>, <codeclass="language-plaintext highlighter-rouge">Amber</code>, et autres).</li>
</ul>
<p>Je n’utilise actuellement que de l’ipv4.</p>
<h2id="routage">Routage</h2>
<p>Les clients utilisent la Freebox comme passerelle vers Internet, à travers <codeclass="language-plaintext highlighter-rouge">Cirdan</code>. À cause de l’impossibilité de configurer des routes statiques sur la Freebox, <codeclass="language-plaintext highlighter-rouge">Cirdan</code> doit NATer les paquets à destination de la Freebox, qui doivent donc traverser 2 NAT.</p>
<p>Les serveurs ont accès à internet à travers le tunnel Wireguard et ressortent donc en Allemagne, sauf exception (par exemple le runner Forgejo, qui fonctionne mal depuis l’Allemagne, allez savoir pourquoi). L’implémentation du routage est faite grace à du <ahref="https://help.ui.com/hc/en-us/articles/204952274-EdgeRouter-Policy-Based-Routing">Policy-Based Routing</a>.</p>
<h2id="dns">DNS</h2>
<p>J’implémente un système de double DNS pour gérer mon infrastructure avec des noms de domaine publics, sans publier les enregistrements DNS sur internet, comme décrit dans <ahref="https://faercol.me/fr/posts/dns-challenge/">ce blogpost</a>. J’ai donc un serveur DNS interne, <codeclass="language-plaintext highlighter-rouge">dns.vm.chapo.li</code>, qui contient tous les enregistrements que j’utilise en interne, et qui n’est pas accessible de l’extérieur, et un serveur DNS externe, <codeclass="language-plaintext highlighter-rouge">dns-ext.vm.chapo.li</code>, sans aucun enregistrement, qui ne sert qu’à l’exécution de challenges DNS Let’s Encrypt pour la génération de mes certificats TLS internes.</p>
<p>Toutes (ou presque) mes machines virtuelles sont des LXC. La majorité sont sous Debian 12, à quelques exceptions près, qui sont sous NixOS. Celles sous Debian sont managées par Ansible, et celles sous NixOS sont déployées avec <ahref="https://github.com/serokell/deploy-rs">deploy-rs</a>. J’héberge de nombreux services dont la liste est dynamique, et donc non-exhaustive : Forgejo, Cryptpad, Nextcloud, Sharkey, Vikunja, Prosody… Ils sont utilisés par moi et par mon entourage. La création de ces LXC est également gérée par Ansible.</p>
<p>J’ai un système de backup basé sur Restic et MinIO, afin de sauvegarder les données de tous mes services importants. J’ai également plusieurs monitorings en place :</p>
<ul>
<li>Grafana + Prometheus pour monitorer les métriques de mes serveurs, grace à <ahref="https://github.com/prometheus-pve/prometheus-pve-exporter">Prometheus Proxmox VE Exporter</a></li>
<li>Uptime Kuma pour visualiser et alerter sur la disponibilité de mes services</li>
<li>Healthchecks pour le monitoring de mes backups</li>
</ul>
<p>Ayant une seule adresse ipv4 publique, tous mes services web externes sont derrière un reverse-proxy Nginx hébergé sur un LXC NixOS, <codeclass="language-plaintext highlighter-rouge">dillon.vm.chapo.li</code>.</p>
<p>Ce blog a ses sources hébergées sur <ahref="https://git.chapoline.me">git.chapoline.me</a>, est construit sur le runner Forgejo <codeclass="language-plaintext highlighter-rouge">action.vm.chapo.li</code>, et est hébergé sur le serveur Nginx de <codeclass="language-plaintext highlighter-rouge">dillon.vm.chapo.li</code>, rendu accessible sur Internet via le tunnel avec <codeclass="language-plaintext highlighter-rouge">amber.wg.chapo.li</code>.</p>
Theme forked from <ahref="https://github.com/abhinavs/moonwalk"target="_blank"rel="noreferrer">Moonwalk</a>, mixed with <ahref="https://github.com/catppuccin/catppuccin"target="_blank"rel="noreferrer">Catppuccin</a>