Set-OPS-Public/roles/serveur_relais/tasks/main.yml
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

96 lines
3 KiB
YAML

---
# Voir defaults/main.yml pour ce qu'est le relais, et d'ou viennent ses valeurs.
- name: Le relais a tout ce qu'il faut pour exister
ansible.builtin.assert:
that:
- serveur_relais_tunnel_adresse | length > 0
- serveur_relais_tunnel_port | int > 0
- serveur_relais_pair_adresse | length > 0
- serveur_relais_pair_cle_publique | length > 0
- serveur_relais_adresses_relayees | length > 0
- serveur_relais_cle_privee | length > 0
- serveur_relais_console not in serveur_relais_adresses_relayees
fail_msg: >-
Relais incomplet. Les valeurs viennent de la carte du site (reseau `relais`, hotes
`role: relais` et `role: frontiere` avec `cle_publique`), de `opnsense.yml` (adresse du
site et pool) et de la voute du site (`vault_relais_wg_cle_privee`). La console ne doit
pas etre une adresse relayee : elle menerait au SSH par le tunnel.
no_log: true
- name: Installer WireGuard et nftables
ansible.builtin.apt:
name: "{{ serveur_relais_paquets }}"
state: present
update_cache: true
cache_valid_time: 3600
# Faire suivre : sans lui, les paquets arrives pour une adresse relayee meurent ici.
- name: Autoriser le transit IPv4
ansible.builtin.copy:
dest: /etc/sysctl.d/90-relais.conf
content: "net.ipv4.ip_forward = 1\n"
owner: root
group: root
mode: "0644"
notify: Appliquer les reglages noyau du relais
# LLMNR et mDNS ecoutaient sur l'adresse publique (5355) : aucun service ici ne s'annonce.
- name: Couper LLMNR et mDNS
ansible.builtin.copy:
dest: /etc/systemd/resolved.conf.d/90-relais.conf
content: "[Resolve]\nLLMNR=no\nMulticastDNS=no\n"
owner: root
group: root
mode: "0644"
notify: Redemarrer systemd-resolved
- name: Dossier de WireGuard
ansible.builtin.file:
path: /etc/wireguard
state: directory
owner: root
group: root
mode: "0700"
- name: Cle privee du relais (depuis la voute du site)
ansible.builtin.copy:
dest: /etc/wireguard/relais.key
content: "{{ serveur_relais_cle_privee }}\n"
owner: root
group: root
mode: "0600"
no_log: true
notify: Redemarrer le tunnel du relais
- name: Configuration du tunnel
ansible.builtin.template:
src: wg0.conf.j2
dest: "/etc/wireguard/{{ serveur_relais_interface_tunnel }}.conf"
owner: root
group: root
mode: "0600"
notify: Redemarrer le tunnel du relais
# VALIDE AVANT D'ETRE POSE : un jeu de regles refuse par nft, recharge sur un VPS dont la
# seule porte est le SSH, serait la fin de l'acces.
- name: Pare-feu du relais
ansible.builtin.template:
src: nftables.conf.j2
dest: /etc/nftables.conf
owner: root
group: root
mode: "0755"
validate: "nft -c -f %s"
notify: Recharger le pare-feu du relais
- name: Tunnel actif au demarrage
ansible.builtin.systemd:
name: "wg-quick@{{ serveur_relais_interface_tunnel }}"
enabled: true
state: started
- name: Pare-feu actif au demarrage
ansible.builtin.systemd:
name: nftables
enabled: true