diff --git a/infra.md b/infra.md new file mode 100644 index 0000000..b433845 --- /dev/null +++ b/infra.md @@ -0,0 +1,102 @@ +--- +title: Infrastructure +layout: page +--- + +> Mis à jour le 09/09/2024 + +Mon infrastructure est entièrement hébergée chez moi, à l'exception d'`Amber`, un VPS en location chez [Contabo](https://contabo.com/), en Allemagne. Elle ne contient pas de données et me sert uniquement de gateway externe (et d'IP). + + +``` + +-----------+ + | | + | Freebox | + | | + +-----+-----+ + | + | + | + | + | 192.168.1.0/24 + | gw.chapo.li + | + | + | ++---------+ +-----+-----+ +| | VPN | | +| Amber +------------------+ Cirdan | +| | 172.31.0.0/24 | | ++---------+ wg.chapo.li +--+--+--+--+ + | | | + | | | + | | | + | | | + | | | + +---------------+ | +---------------+ + | | | + | | | + +-----+-----+ +-----+-----+ +-----+-----+ + | | | | | | + | Clients | | Hardware | | Servers | + | | | | | | + +-----------+ +-----------+ +-----------+ + 10.255.1.0/24 10.255.2.0/24 10.255.3.0/24 + client.chapo.li hw.chapo.li vm.chapo.li +``` + +## Machines physiques + +`Cirdan` 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 `Amber`, et de DHCP pour les clients du réseau (tous les serveurs sont en ip statique). + +`Gandalf` est mon hyperviseur principal, sous Proxmox VE 8. C'est un serveur monté moi-même avec des composants PC. +- Boitier Fractal Design Node 804 (130€) +- Processeur AMD Ryzen 5 7600 (240€) +- Carte mère Gigabyte B650M D3HP AX (145€) +- RAM Kingston Fury Beast 32Go 5200MHz (122€) +- Alimentation Corsair RM650 (100€) +- SSD Samsung 980 250Go (60€) +- 3 disques durs 2To de récup (0€) + +Soit un total de 800€. + +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. + +J'utilise ma Freebox comme routeur et borne Wi-Fi, bien que la majorité du routage soit fait par `Cirdan`. + +Enfin, j'utilise deux switchs Netgear GS608 comme switchs stupides. + +## Plan d'adressage + +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). + +- `client.chapo.li` (`10.255.1.0/24`) : 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. +- `hw.chapo.li` (`10.255.2.0/24`) : contient les machines physiques (actuellement, uniquement `Gandalf`). +- `vm.chapo.li` (`10.255.3.0/24`) : contient les machines virtuelles. +- `gw.chapo.li` (`192.168.1.0/24`) : contient uniquement le lien entre `Cirdan` et la Freebox. +- `wg.chapo.li` (`172.31.0.0/24`) : contient les terminaisons Wireguard (`Cirdan`, `Amber`, et autres). + +Je n'utilise actuellement que de l'ipv4. + +## Routage + +Les clients utilisent la Freebox comme passerelle vers Internet, à travers `Cirdan`. À cause de l'impossibilité de configurer des routes statiques sur la Freebox, `Cirdan` doit NATer les paquets à destination de la Freebox, qui doivent donc traverser 2 NAT. + +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 [Policy-Based Routing](https://help.ui.com/hc/en-us/articles/204952274-EdgeRouter-Policy-Based-Routing). + +## DNS + +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 [ce blogpost](https://faercol.me/fr/posts/dns-challenge/). J'ai donc un serveur DNS interne, `dns.vm.chapo.li`, 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, `dns-ext.vm.chapo.li`, 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. + +## Machines virtuelles + +Toutes (ou presque) mes machines virtuelles sont des LXC. La majorité sont sous Debian 12, à quelques exceptions près, qui sont sout NixOS. Celles sous Debian sont managées par Ansible, et celles sous NixOS sont déployées avec [deploy-rs](https://github.com/serokell/deploy-rs). 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. + +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 : +- Grafana + Prometheus pour monitorer les métriques de mes serveurs, grace à [Prometheus Proxmox VE Exporter](https://github.com/prometheus-pve/prometheus-pve-exporter) +- Uptime Kuma pour visualiser et alerter sur la disponibilité de mes services +- Healthchecks pour le monitoring de mes backups + +Ayant une seule adresse ipv4 publique, tous mes services web externes sont derrière un reverse-proxy Nginx hébergé sur un LXC NixOS, `dillon.vm.chapo.li`. + +Ce blog a ses sources hébergées sur [git.chapoline.me](https://git.chapoline.me), est construit sur le runner Forgejo `action.vm.chapo.li`, et est hébergé sur le serveur Nginx de `dillon.vm.chapo.li`, rendu accessible sur Internet via le tunnel avec `amber.wg.chapo.li`. \ No newline at end of file