feat(wireguard): tower rejoint le wg1 du VPS en pair 10.100.0.3

Le forward de box 77.207.176.170:42070 est mort : tower devient pair
client du hub wg1 avec persistentKeepalive. L'alias ssh tower pointe
sur 10.100.0.3 et la cle root du VPS est autorisee sur tower. Cle
privee dans secrets/wireguard.yml (recipient tower).
This commit is contained in:
Hermes Agent
2026-10-19 02:07:32 -04:00
parent 8e604e3f8f
commit de94c3e4bf
4 changed files with 50 additions and 33 deletions
+2 -5
View File
@@ -28,12 +28,9 @@
User = "hermes";
Port = 22;
};
# tower par le VPN wg1 du VPS (10.100.0.1) : l'ancien forward de la box
# (77.207.176.170:42070) est mort, l'IP publique change.
"tower" = {
HostName = "77.207.176.170";
User = "marc";
Port = 42070;
};
"tower-rack" = {
HostName = "10.100.0.3";
User = "marc";
Port = 22;
+24 -28
View File
@@ -6,7 +6,7 @@
...
}: let
# Client WireGuard vers le VPS (voir la section WIREGUARD CLIENT en bas).
wgClientEnable = false;
wgClientEnable = true;
in {
imports = [
@@ -52,6 +52,13 @@ in {
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMdX5m7b8xWL/9ZUeFRxahB4YY0v2rAV5CCFv8xTOlUh marc@Air-de-Marc"
];
# Clé root du VPS anywhere (/root/.ssh/id_ed25519) : donne au VPS l'accès SSH
# à tower par le tunnel wg1 (10.100.0.3), donc depuis n'importe où sans
# dépendre de l'IP publique de la box. Remplace l'ancien forward 42070.
users.users.marc.openssh.authorizedKeys.keys = lib.mkAfter [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAc2f6U09CWD2yQNcyGz6Pz9EN3aJzvdCvr7FrSSgpwx root@anywhere"
];
networking.hostName = "tower";
sops.defaultSopsFile = lib.mkForce ../../secrets/tower.yml;
@@ -409,32 +416,20 @@ in {
users.users.hermes.extraGroups = [ "systemd-journal" ];
# ========================================================================
# WIREGUARD CLIENT - Connexion au réseau VPN du VPS RackNerd (anywhere)
# WIREGUARD CLIENT - tower pair du VPS anywhere (hub-and-spoke wg1)
# ========================================================================
# Objectif : tower rejoint le réseau wireguard (10.100.0.0/24) du VPS
# pour que macOS (et d'autres pairs) puisse s'y connecter directement
# via SSH dans le VPN (alias tower-rack), sans rediriger le trafic
# internet de tower via le serveur VPN.
#
# MANQUE AVANT ACTIVATION :
# 1. Générer la paire de clés de tower : `wg genkey | tee privatekey | wg pubkey > publickey`
# 2. Insérer le secret dans secrets/tower.yml (sops) :
# wireguard:
# tower_private_key: ENC[AES256_GCM,...]
# 3. Déclarer le secret dans la conf (déjà fait ci-dessous, conditionnel)
#
# Le peer (serveur anywhere) : publicKey = la clé publique du VPS
# (extraite du service wireguard de anywhere, ou via `wg showconf wg1` sur le VPS).
# Endpoint : le VPS RackNerd expose wireguard sur le port 443 UDP.
# IP attribuée au client tower : 10.100.0.3/32 (cohérente avec le réseau existant).
#
# ATTENTION : `allowedIPs = [ "10.100.0.0/24" ];` limite le tunnel au réseau
# privé du VPN ; le trafic internet de tower ne passe PAS par le VPS.
# tower n'a aucune exposition entrante utile (NAT residentiel + IP publique
# dynamique) : il rejoint donc en CLIENT le wg1 du VPS (10.100.0.1/24) et y
# prend 10.100.0.3. Depuis le VPS : `ssh marc@10.100.0.3` (alias `tower` dans
# modules/home/ssh). Le Mac est l'autre pair (10.100.0.2) et passe par le meme
# hub. Aucun port a ouvrir sur tower : wg-quick garde une socket source
# ephemere et conntrack suit la reponse. persistentKeepalive entretient la
# traduction NAT, donc le VPS joint tower a tout moment.
# - allowedIPs = 10.100.0.0/24 : seul le reseau du VPN passe par le tunnel,
# le trafic Internet de tower reste sur la connexion locale.
# - Cle privee dans secrets/wireguard.yml (sops, recipient tower), cle
# publique declaree en peer cote VPS (services/wireguard/default.nix).
# ========================================================================
# DESACTIVE tant que le secret n'existe pas : sops-nix refuse de construire le
# manifeste si la cle est absente de tower.yml (« the key 'wireguard' cannot be
# found »), ce qui casse tout le build. Passer a true apres les etapes 1 et 2
# ci-dessus (et l'ajout de la cle publique de tower comme peer sur le VPS).
networking.wg-quick.interfaces = lib.mkIf wgClientEnable {
wg1 = {
address = [ "10.100.0.3/32" ];
@@ -455,15 +450,16 @@ in {
};
};
# Secret sops nécessaire pour le client wireguard (à créer dans secrets/tower.yml)
# Clé privée du pair tower. Fichier sops dédié (recipient tower) pour ne pas
# toucher à tower.yml : `sops secrets/wireguard.yml` pour la rotation.
sops.secrets."wireguard/tower_private_key" = lib.mkIf wgClientEnable {
sopsFile = ../../secrets/tower.yml;
sopsFile = ../../secrets/wireguard.yml;
owner = "root";
group = "root";
mode = "0400";
};
# Aucun port UDP à ouvrir : wg-quick en mode client n'écoute pas de port fixe.
networking.firewall.allowedUDPPorts = lib.mkIf wgClientEnable [ 443 ];
# ========================================================================
}
+17
View File
@@ -0,0 +1,17 @@
wireguard:
tower_private_key: ENC[AES256_GCM,data:18G4AHm2luRoQlp8JojzXuqd/bmHbHz0/m9z9t4NmUg/Px02C+rxHi3XskA=,iv:ciJqkABAhMX7tAAk7mxqXJHOZooOaQgxmUNgZj0lNUc=,tag:u64nDOj+qiOcvVvhUDGUFw==,type:str]
sops:
age:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKdVRzTlhEeG9UaVVyM2ox
ZzNmWFFudi9IalhqbkdXSklWTjk0SGcrMlZNCmlMWXk2QnlVeVM5NUt4ZW9DNVVj
UUJEN1VUTTZLYzR5dHB1SHV0SDFiL3MKLS0tIDUxdHlNSU9rQytqTlBMbXZFdklQ
TDhPNUw5TTFNU0V1Ri9VcFdxQlJuYjAKdK7L6YfMPvzyu2vjJejsgJ+m7LSxhSz5
1to756t5BzS42B+maqDMN/xa8hCLf9RksyinvrkrkHBJa1RjiYma5w==
-----END AGE ENCRYPTED FILE-----
recipient: age1usm3v0ugducrzcwud60dda7xfnj49fdhecj7kcsfm7dzwzrzeyqq2jc2hm
lastmodified: "2026-10-19T05:47:44Z"
mac: ENC[AES256_GCM,data:RYzNwpTDd24BWC5BPeJmpDCqh2iGhuknWMv411dMTSaLJYnPKxxG2c2YjpnN7MRU6YcBN1GV5hOXaGaEvoZX5/xSF1cWR0hwZ8WmqGLjqx4MZKW6ZuaZH9OE97VgKlm7wC7Mp4KJfX6lmHVs1QWPnLBhb2bfrkJw4Qmn0YE/5SA=,iv:99db6aRfdux7wrTv5DQgX71HHY3QBQ4/du4wjLja4TM=,tag:w/CQvy7BeyKpnlm2M2fbjQ==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3
+7
View File
@@ -17,6 +17,13 @@
publicKey = "WB7Wx7GmjpC1XRDFC74ekC7ROlkPmFzrPgIpn4KEOlM=";
allowedIPs = [ "10.100.0.2/32" ];
}
{
# tower (NixOS, NAT residentiel) : pair client, sert au SSH/ET entrant
# depuis ce VPS et depuis le Mac. Cle publique issue de
# secrets/wireguard.yml (recipient tower) sur tower.
publicKey = "Qd0IGtduY3Jq5jxAqx4s2B4QlWEvGG4ACeGmrM9V2W0=";
allowedIPs = [ "10.100.0.3/32" ];
}
];
postSetup = ''
${pkgs.iptables}/bin/iptables -A FORWARD -i wg1 -j ACCEPT