Set-OPS-Public/roles/serveur_relais/README.md

64 lines
3.2 KiB
Markdown
Raw Normal View History

2026-10-13 21:20:04 -04:00
# 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.