Set-OPS-Public/roles/serveur_relais/README.md
Daniel Allaire f9e45b1676 relais : la face publique d'un site sans adresse fixe, et le site de reprise de TechnoLibre
Le site de TechnoLibre n'a qu'une adresse DHCP. Trois adresses fixes sont louees sur un VPS
(le relais), qui repond a l'ARP pour elles et les route en /32 dans un tunnel WireGuard que la
frontiere initie. Aucune traduction : l'adresse du client arrive intacte.

- underlay.py : `tunnel: wireguard` dispense de VLAN ; role d'hote `relais`.
- devis_opnsense.py : `opnsense_face_publique`. Les entrees publiques s'y posent avec
  reply-to ; les sorties des locataires du pool passent par le relais ; une redirection n'y
  vise plus `wanip`. Le devis de Chezlepro est identique au caractere pres.
- appliquer_opnsense.py : replyto et gateway transmis et dans l'identite (seulement s'ils
  existent) ; le NAT sortant en mode automatic arrete l'application au lieu de dupliquer.
- role serveur_relais, inventorie depuis la carte comme un hyperviseur ; cle privee dans la
  voute du site. Deploye, idempotent.
- site_inventaire.py : les hyperviseurs ne sont plus filtres sur 192.168.11. ; site-appliquer
  charge la voute designee par SETOPS_UNDERLAY ; voute.py n'exige plus d'un locataire un
  secret du site.
- prouver.py : P67 lit le plan par underlay.plan_site() ; P53 couvre la face publique.
- Tests : test_underlay_tunnel, test_face_publique_relais, test_mode_nat_sortant.

95 preuves (make verifier), make test passe. CHANGELOG 144 et 145.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:20:04 -04:00

3.2 KiB

serveur_relais

La face publique d'un site qui n'a qu'une adresse DHCP. Un VPS loue des adresses fixes, répond à l'ARP de son hébergeur pour elles (proxy ARP) et les route en /32 dans un tunnel WireGuard que la frontière du site initie. Aucune traduction d'adresse : les adresses arrivent intactes sur la frontière, qui les porte et qui filtre. L'adresse du client reste visible de bout en bout (courriel, journaux, blocage des abus).

Internet ──► hébergeur (ARP « qui a 51.79.x ? ») ──► relais : « c'est moi » (proxy ARP)
         ──► route /32 vers wg0 ──► tunnel ──► frontière (porte les adresses, filtre)

Né le 2026-10-13 au site de TechnoLibre (VPS OVH, Debian 13, frontière requin).

Ce que le rôle pose

Fichier Rôle
/etc/wireguard/wg0.conf le tunnel ; routes /32 et proxy ARP en PostUp, sans Table
/etc/wireguard/relais.key la clé privée, depuis la voûte du site
/etc/nftables.conf entrée : SSH et tunnel sur la console seulement ; transit : les adresses relayées, dans chaque sens, rien d'autre
/etc/sysctl.d/90-relais.conf ip_forward
/etc/systemd/resolved.conf.d/90-relais.conf LLMNR et mDNS coupés (ils écoutaient sur l'adresse publique)

Le relais ne décide d'aucun service : il ne connaît que des adresses. Ce qui est publié, et à qui, se décide sur la frontière (devis_opnsense.py, opnsense_face_publique).

D'où viennent les valeurs

Toutes dérivées par scripts/site_inventaire.py ; aucune n'est à recopier.

Variable Source
serveur_relais_tunnel_adresse, serveur_relais_tunnel_mtu hôte role: relais et réseau tunnel: wireguard de underlay.yml
serveur_relais_tunnel_port 51800 + index du site
serveur_relais_pair_* hôte role: frontiere du même réseau, avec sa cle_publique
serveur_relais_adresses_relayees opnsense_wan_ip + opnsense_ips_publiques de opnsense.yml
serveur_relais_cle_privee vault_relais_wg_cle_privee, voûte du site
ansible_host console: de l'hôte relais — jamais une adresse relayée

Le relais n'est pas dans plan/serveurs.yml : tout ce qu'une machine du plan reçoit descend des zones du site, que le VPS n'atteint pas. Comme un hyperviseur, c'est un équipement de la carte.

Ce qui reste hors du rôle

  • Côté frontière (OPNsense) : l'instance WireGuard, l'interface, la passerelle et les adresses virtuelles se posent par l'API, une fois. Le devis y pose ensuite les règles avec reply-to (voir test_face_publique_relais.py).
  • La supervision : le relais est hors du site et ne joint pas sa supervision. Ce qui le dit vivant aujourd'hui, c'est la passerelle RELAIS_GW de la frontière (surveillée par ping à travers le tunnel). Une sonde propre au rôle reste à écrire.
  • Le durcissement commun (serveur_durci) : il dérive son pare-feu des zones du site et écraserait celui du relais. Non appliqué ici.

Déployer

SETOPS_UNDERLAY=../SITE-<site>/underlay.yml make site-appliquer GROUPE=serveur_relais ARGS="--check --diff"

Le pare-feu est validé (nft -c) avant d'être posé : la seule porte du VPS est son SSH.