Reseau¶
Etat actuel du reseau homelab : topologie, adressage, DNS, VPN mesh et certificats TLS.
Topologie actuelle¶
Reseau plat 192.168.1.0/24 derriere une Freebox (gateway 192.168.1.254). Pas de VLANs pour l'instant — la segmentation est prevue dans l'architecture cible. L'acces distant est assure par un mesh VPN Tailscale (WireGuard) superpose au LAN. Il n'y a aucun port forwarde sur la Freebox — tout le trafic inter-devices distant passe par le tunnel WireGuard.
graph TB
subgraph "Internet"
Freebox[Freebox
192.168.1.254]
end
subgraph "LAN 192.168.1.0/24"
Freebox --- penny[penny — RPi 4
192.168.1.28]
Freebox --- galahad[galahad — ZimaBoard
192.168.1.18]
Freebox --- lancelot[lancelot — ZimaBoard
192.168.1.19]
galahad --- lxc100[LXC 100 — dns-failover
192.168.1.30]
galahad --- lxc102[LXC 102 — vault
192.168.1.32]
lancelot --- lxc101[LXC 101 — logs
192.168.1.31]
end
subgraph "Tailscale mesh overlay"
penny -.->|100.97.239.90| TS((Tailscale))
galahad -.->|100.98.58.121| TS
lancelot -.->|100.69.6.13| TS
lxc100 -.->|100.74.145.26| TS
end
Machines et adresses¶
| Hostname | Type | Role | IP LAN | IP Tailscale |
|---|---|---|---|---|
penny (homelab) |
RPi 4 (DietPi) | Serveur principal (Docker, Traefik, AdGuard) | 192.168.1.28 |
100.97.239.90 |
galahad |
ZimaBoard (Proxmox) | Hyperviseur (LXC vault + dns-failover) | 192.168.1.18 |
100.98.58.121 |
lancelot |
ZimaBoard (Proxmox) | Hyperviseur (LXC logs) | 192.168.1.19 |
100.69.6.13 |
dns-failover |
LXC 100 (sur galahad) | AdGuard secondaire + healthcheck | 192.168.1.30 |
100.74.145.26 |
vault |
LXC 102 (sur galahad) | Vaultwarden | 192.168.1.32 |
— |
logs |
LXC 101 (sur lancelot) | Loki + Grafana | 192.168.1.31 |
— |
iphone175 |
iOS | Mobile | — | 100.84.188.65 |
macbook-pro-de-gabin |
macOS | Laptop | — | 100.68.165.36 |
a00783 |
Windows | Desktop | — | 100.64.114.40 |
Les LXC logs (101, sur lancelot) et vault (102, sur galahad) ne sont pas sur Tailscale — accessibles via l'IP LAN de leur host uniquement.
DNS (AdGuard Home)¶
Architecture DNS¶
graph TB
subgraph "Reseau local"
Client[Client LAN
192.168.1.x] -->|requete DNS| AG[AdGuard Home
192.168.1.28:53]
AG -->|rewrite local| Client
end
subgraph "Tailscale"
TSClient[Client VPN
100.x.x.x] -->|requete DNS| AG
AG -->|rewrite Tailscale IP| TSClient
end
subgraph "Internet"
AG -->|upstream DoH| Quad9[Quad9
dns10.quad9.net]
end
subgraph "RPi 4"
AG
Traefik -->|forward| Service[Container]
end
Client -->|HTTPS| Traefik
TSClient -->|HTTPS via Tailscale| Traefik
Les DNS rewrites (la piece cle)¶
AdGuard Home utilise des regles de reecritures conditionnelles dans user_rules pour rediriger les domaines internes vers le RPi sans passer par Internet :
||home.gabin-simond.fr^$dnsrewrite=192.168.1.28,client=192.168.1.0/24
||home.gabin-simond.fr^$dnsrewrite=100.97.239.90,client=100.64.0.0/10
Que font ces regles ?¶
| Regle | Client vu par AdGuard | Reponse DNS | Pourquoi |
|---|---|---|---|
| 1ere | LAN (192.168.1.0/24) |
192.168.1.28 (IP locale) |
Clients du reseau local |
| 2eme | Tailscale (100.64.0.0/10) |
100.97.239.90 (IP Tailscale) |
Clients VPN distants |
Ne pas utiliser les DNS Rewrites statiques
La section DNS Rewrites d'AdGuard (Filters > DNS Rewrites) ne doit pas contenir d'entrees pour *.home.gabin-simond.fr.
Les rewrites statiques sont appliquees avant les user_rules et ne supportent pas le filtrage par client.
Elles ecraseraient les regles conditionnelles ci-dessus, renvoyant toujours l'IP LAN, meme aux clients Tailscale — rendant les services inaccessibles via VPN.
Seule exception : switch.lan → 192.168.1.2 (equipement HTTP-only, hors du domaine home.* pour eviter le HSTS).
AdGuard en network_mode: host
AdGuard tourne avec network_mode: host — il voit les vraies IPs clients (LAN et Tailscale), pas l'IP du bridge Docker.
Avantages :
- 2 regles DNS au lieu de 4 — plus de bricolage avec le bridge Docker
- Stats par client dans AdGuard — on voit quel device fait quelles requetes
- Reverse proxy toujours actif via Traefik file provider (
dynamic/dns.yml)
Wildcard home.gabin-simond.fr¶
La regle utilise ||home.gabin-simond.fr^ — c'est un wildcard. Ca matche :
home.gabin-simond.frtraefik.home.gabin-simond.fradguard.home.gabin-simond.frmonservice.home.gabin-simond.fr- ... tout sous-domaine de
home.gabin-simond.fr
Resultat : pas besoin d'ajouter une regle DNS par service. Tout nouveau service avec un sous-domaine *.home.gabin-simond.fr est automatiquement redirige.
Flow complet d'une requete¶
DNS upstream¶
Pour les domaines non locaux (tout sauf *.home.gabin-simond.fr), AdGuard forward vers :
| Upstream | Protocole | Adresse |
|---|---|---|
| Quad9 | DNS-over-HTTPS | https://dns10.quad9.net/dns-query |
Bootstrap DNS (pour resoudre dns10.quad9.net lui-meme) :
9.9.9.10149.112.112.10
Mode : load balance entre les upstreams.
Tailscale¶
Tailnet¶
| Tailnet | tail8850a4.ts.net |
| Magic DNS | Actif |
| HTTPS certs | Actif (cert .ts.net automatique) |
Le VPN mesh Tailscale est gere depuis login.tailscale.com.
Tailscale SSH¶
Mode check (MFA navigateur a chaque connexion) active sur homelab (penny), galahad, lancelot. Aucun port 22 expose sur aucun host.
ssh gabins@homelab # penny via MagicDNS Tailscale
ssh gabins@galahad # ZimaBoard #1
ssh gabins@lancelot # ZimaBoard #2
Fallback OpenSSH dispo sur les 3 hosts (ports 2806/2807/2808), cle Ed25519 uniquement.
Politique ACL¶
La configuration ACL exacte vit dans la console Tailscale et est versionnee par Tailscale (pas dans ce repo). Resume de la politique :
Groupes¶
| Groupe | Membres |
|---|---|
group:admin |
[email protected] (proprietaire tailnet) |
Pas de compte multi-utilisateur pour l'instant (homelab personnel).
Tags¶
| Tag | Usage |
|---|---|
tag:homelab |
penny |
tag:proxmox |
galahad + lancelot |
tag:lxc |
dns-failover (et futurs LXCs sur Tailscale) |
tag:client |
iphone, macbook, desktop |
Regles d'acces (principe)¶
group:admin: acces complet a tous les tags.tag:client: acces aux services homelab (ports 80, 443, 53, 3000, 8006) mais pas SSH (sauf via Tailscale SSH).tag:homelab/tag:proxmox/tag:lxc: pas d'init d'appels sortants hors du tailnet (serveurs passifs).
SSH ACL¶
{
"sshRules": [
{
"action": "check", // MFA navigateur
"src": ["group:admin"],
"dst": ["tag:homelab", "tag:proxmox"],
"users": ["gabins", "root"]
}
]
}
Revocation¶
Procedure en cas de vol / perte / compromission d'un device :
- login.tailscale.com > Machines
- Selectionner le device > Disable (acces coupe immediatement)
- Si perdu definitivement : Remove
- Rotation globale cles : Settings > Keys > Auth keys > Revoke
- Les autres devices doivent re-authentifier (sauf ceux avec key expiry disabled)
Voir aussi la politique de securite dans politique.md et les mesures de hardening dans hardening.md.
Key expiry¶
Desactive sur les serveurs (homelab, dns-failover, galahad, lancelot) pour eviter qu'un serveur headless perde l'acces mesh sans intervention humaine. Les clients (iphone, macbook, desktop) gardent l'expiry par defaut (180 jours) + re-auth interactive.
Commandes utiles¶
tailscale status # liste machines et connectivite
tailscale whois <IP> # qui est connecte sur cette IP
tailscale ping <host> # ping direct ou relay via DERP
tailscale up --ssh # reactiver Tailscale SSH si coupe
tailscale netcheck # diagnostics NAT / DERP
TLS / Certificats¶
Traefik gere automatiquement les certificats TLS via Let's Encrypt avec le DNS challenge Cloudflare.
sequenceDiagram
participant TF as Traefik
participant LE as Let's Encrypt
participant CF as Cloudflare
Note over TF: Nouveau domaine detecte
(label Docker)
TF->>LE: Demande certificat pour
monservice.home.gabin-simond.fr
LE->>CF: Cree record TXT
_acme-challenge.monservice.home...
CF-->>LE: OK, record present
LE-->>TF: Certificat delivre
Note over TF: Certificat stocke dans
/certs/acme.json
Note over TF: Renouvellement auto
avant expiration
Pourquoi le DNS challenge ?
- Pas besoin d'exposer le port 80 sur Internet
- Fonctionne pour des domaines internes (pas accessibles depuis Internet)
- Cloudflare gere la zone DNS
gabin-simond.fr - Traefik utilise le token API Cloudflare (
CF_DNS_API_TOKEN) pour creer/supprimer les records TXT automatiquement