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>
96 lines
3 KiB
YAML
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
|