====== VPN WireGuard : état de la configuration ======
Cette page décrit la configuration relevée le 27/09/2026.
===== Topologie =====
Le routeur principal ''aiguilleur'' tourne sous OpenWrt et héberge deux interfaces WireGuard en mode serveur. wg0 relie le site distant de Montriond et quatre clients. wg1 sert à quatre autres clients qui accèdent au LAN principal. Le site distant dispose de son propre routeur OpenWrt, ''routeur-montriond'', dont la seule connexion vers l'extérieur est une liaison cellulaire (interface ''Sim''). Son LAN héberge un Raspberry Pi 4 sous Home Assistant.
vpn.beafrancois.fr
|
[Freebox]
|
+--------+---------+
| aiguilleur |
| wg0 10.1.99.1 |<====== tunnel ======> routeur-montriond (Sim)
| wg1 10.1.100.1 | wg0 10.1.99.20
+--+-----------+---+ LAN 192.168.8.0/24
| |
LAN 192.168.1.0/24 Invite 192.168.115.0/24
aiguilleur est placé derrière une Freebox en mode routeur, ce qui crée un double NAT. La Freebox désigne aiguilleur comme hôte DMZ : elle lui transmet tout le trafic entrant qu'elle ne traite pas elle-même, y compris les ports 51820/udp et 51821/udp. La DMZ a été choisie parce que c'était la seule configuration qui conservait la connexion wifi de l'interface télévision.
===== Adressage =====
^ Réseau ^ Sous-réseau ^ Adresse d'aiguilleur ^ Zone pare-feu ^
| LAN | 192.168.1.0/24 | 192.168.1.90 | lan |
| Invité | 192.168.115.0/24 | 192.168.115.90 | invite |
| Tunnel wg0 | 10.1.99.0/24 | 10.1.99.1 | VPN |
| Tunnel wg1 | 10.1.100.0/24 | 10.1.100.1 | vpn1 |
| LAN distant | 192.168.8.0/24 | via 10.1.99.20 | - |
wg0 écoute sur le port 51820/udp et wg1 sur le port 51821/udp. Les ports doivent être différents, car un port UDP ne peut être lié qu'à une seule interface. Aucun sous-réseau ne chevauche un autre. Le routeur peut ainsi déterminer sans ambiguïté par quelle interface envoyer chaque paquet.
===== aiguilleur : interface wg0 =====
wg0 a l'adresse 10.1.99.1/24. L'option ''route_allowed_ips'' est activée : pour chaque préfixe des AllowedIPs d'un peer, netifd ajoute une route vers wg0.
^ Peer ^ Description ^ AllowedIPs ^ Keepalive ^
| 0 | Montriond | 192.168.8.0/24, 10.1.99.20/32 | 25 s |
| 1 | Mobile Foué | 10.1.99.21/32 | 25 s |
| 2 | Tuxedo | 10.1.99.22/32 | 25 s |
| 3 | noudell2 | 10.1.99.23/32 | 25 s |
L'endpoint de chaque peer est ''vpn.beafrancois.fr:51820'', c'est-à-dire l'adresse d'aiguilleur lui-même. aiguilleur ne connaît donc l'adresse réelle d'un peer qu'après avoir reçu de lui un handshake valide. WireGuard remplace alors l'endpoint configuré par l'adresse source de ce handshake. Avant ce premier handshake, les keepalives envoyés par aiguilleur partent vers sa propre adresse et sont rejetés. aiguilleur ne peut donc pas établir le tunnel vers Montriond. C'est routeur-montriond qui l'établit et le maintient.
Une route statique ''192.168.8.0/24 via 10.1.99.20 dev wg0'' existe en plus de la route ajoutée par ''route_allowed_ips'' pour le même préfixe. Les deux routes mènent à wg0 et ne se contredisent pas. Sur une interface WireGuard, le peer destinataire est choisi d'après les AllowedIPs, et le ''gateway'' de la route statique n'a aucun effet.
===== aiguilleur : interface wg1 =====
wg1 a l'adresse 10.1.100.1/24 et l'option ''route_allowed_ips'' est activée. Aucun peer n'a de keepalive côté serveur. Ce n'est pas nécessaire, car ce sont toujours les clients qui établissent la connexion.
^ Peer ^ Description ^ AllowedIPs ^
| 0 | portable-tuxedo | 10.1.100.20/32 |
| 1 | lat7400 | 10.1.100.21/32 |
| 2 | lat7490 | 10.1.100.22/32 |
| 3 | clelin | 10.1.100.23/32 |
L'endpoint de chaque peer est ''vpn.beafrancois.fr:51821'', l'adresse d'aiguilleur, comme sur wg0.
Côté serveur, les AllowedIPs d'un client contiennent uniquement son adresse de tunnel en /32. Le préfixe du LAN figure dans la configuration du client, pas dans celle du serveur. Deux raisons l'imposent. D'abord, dans une interface WireGuard, un préfixe ne peut appartenir qu'à un seul peer : l'attribuer à un peer le retire au précédent. Ensuite, avec ''route_allowed_ips'', netifd ajouterait une route ''192.168.1.0/24 dev wg1'' en concurrence avec la route de ''br-lan''. Le trafic destiné au LAN partirait alors dans le tunnel, y compris les réponses aux handshakes des clients qui se connectent depuis le LAN.
===== aiguilleur : DNS =====
dnsmasq n'écoute que sur les interfaces de sa liste.
dhcp.@dnsmasq[0].interface='Invite' 'lan' 'wg1' 'wg0'
Il répond donc sur 192.168.1.90, 192.168.115.90, 10.1.100.1 et 10.1.99.1. Grâce à la présence de wg0 dans la liste, les clients de wg0 utilisent 10.1.99.1 comme serveur DNS. Cette adresse est déjà couverte par ''10.1.99.0/24'' dans leurs AllowedIPs, il n'est donc pas nécessaire d'y ajouter le LAN. Si une interface est absente de la liste, le noyau rejette les requêtes par un ICMP port unreachable, que ''dig'' affiche sous la forme « connection refused ».
===== aiguilleur : pare-feu =====
^ Zone ^ Réseaux ^ Input ^ Forward ^ Masquerade ^
| lan | lan | ACCEPT | ACCEPT | non |
| wan | wan, wan6 | REJECT | REJECT | oui |
| invite | Invite | ACCEPT | ACCEPT | non |
| VPN | wg0 | ACCEPT | ACCEPT | non |
| vpn1 | wg1 | ACCEPT | ACCEPT | non |
^ Source ^ Destination ^
| lan | wan |
| wan | lan |
| invite | wan |
| wan | invite |
| VPN | invite |
| invite | VPN |
| vpn1 | lan |
| invite | lan |
| lan | invite |
L'option ''forward'' d'une zone ne s'applique qu'au trafic qui reste dans cette zone. Pour passer d'une zone à une autre, il faut une règle de forwarding. Le tableau suivant résume les flux autorisés par cette configuration et par les AllowedIPs des deux routeurs.
^ Origine ^ Routeur ^ LAN ^ Invite ^ Site distant ^ Internet ^
| Client wg0 | oui | non | oui | oui | non |
| Client wg1 | oui | oui | non | non | non |
| Invite | oui | oui | - | oui | oui |
| LAN | oui | - | oui | non | oui |
| LAN distant | oui | non | oui | - | - |
Un client de wg0 peut joindre le site distant parce que son trafic entre et ressort par wg0. Ce trafic reste dans la zone VPN et il est autorisé par ''forward=ACCEPT''. Aucune zone VPN n'a de forwarding vers wan. Le tunnel ne donne donc pas accès à Internet, et les clients ne font passer dans le tunnel que les réseaux internes (split tunnel).
La zone invite n'est pas isolée. Les forwardings ''invite → lan'' et ''lan → invite'' lui donnent le même accès que le LAN. C'est aussi la seule zone locale qui communique avec le site distant.
Les forwardings ''wan → lan'' et ''wan → invite'' laissent passer tout paquet qui arrive par le WAN à destination de 192.168.1.0/24 ou 192.168.115.0/24, sans DNAT. Ces adresses privées ne sont pas routées sur Internet. Seule une machine du LAN de la Freebox disposant d'une route vers ces réseaux peut les atteindre. La DMZ ne change rien à cette exposition : la Freebox redirige le trafic entrant vers l'adresse WAN d'aiguilleur, et non vers ces réseaux, et aiguilleur ne fait aucun DNAT.
Le masquerade n'est actif que sur wan. Les paquets qui arrivent des tunnels gardent leur adresse source de tunnel sur le LAN et sur Invite. Les réponses reviennent correctement, car aiguilleur est la passerelle par défaut de ces réseaux.
Les règles qui ouvrent les ports 51820/udp et 51821/udp sur la zone wan ne sont pas décrites ici.
===== routeur-montriond =====
wg0 a l'adresse 10.1.99.20/24 et écoute sur le port 51820. Ce port ne reçoit aucune connexion entrante, car aiguilleur ne connaît pas l'adresse du site distant.
^ Peer ^ Endpoint ^ AllowedIPs ^ Keepalive ^
| maison | vpn.beafrancois.fr:51820 | 192.168.115.0/24, 10.1.99.0/24 | 25 s |
C'est routeur-montriond qui établit le tunnel. Un keepalive part toutes les 25 secondes, ce qui maintient ouverte la traduction d'adresse de la liaison cellulaire. aiguilleur peut ainsi envoyer du trafic vers le site distant à tout moment. Les AllowedIPs limitent les échanges au réseau Invite et au sous-réseau de wg0, c'est-à-dire à aiguilleur et à ses clients wg0. Le LAN principal et les clients de wg1 n'y ont pas accès.
La ligne ''network.wg0.allowed_ips='192.168.115.0/24''' est placée au niveau de l'interface. Cette option n'existe que dans les sections peer, et netifd l'ignore. Une route statique ''192.168.115.0/24 dev wg0'' fait doublon avec celle qu'ajoute ''route_allowed_ips''.
^ Zone ^ Réseaux ^ Input ^ Forward ^ Masquerade ^
| lan | lan | ACCEPT | ACCEPT | non |
| wan | wan, wan6, Sim | REJECT | REJECT | oui |
| VPN | wg0 | ACCEPT | ACCEPT | non |
| Invite | Invite | ACCEPT | ACCEPT | non |
^ Source ^ Destination ^
| lan | wan |
| VPN | lan |
| lan | VPN |
| Invite | wan |
| Invite | lan |
Les forwardings ''VPN → lan'' et ''lan → VPN'' rendent le LAN distant, et donc le Raspberry Pi Home Assistant, accessible aux réseaux autorisés par les AllowedIPs. Le réseau Invite du site distant n'a pas accès au tunnel.
===== Client : portable Tuxedo (CachyOS) =====
Le portable gère ses tunnels avec NetworkManager. Les profils sont stockés dans ''/etc/NetworkManager/system-connections/''.
^ Profil ^ Interface locale ^ Port local ^ Adresse ^ Endpoint ^ AllowedIPs ^ DNS ^
| Montriond | wg1 | 51820 | 10.1.99.22/32 | vpn.beafrancois.fr:51820 | 10.1.99.0/24, 192.168.8.0/24 | 10.1.99.1 |
| Maison | wg2 | 51821 | 10.1.100.20/32 | vpn.beafrancois.fr:51821 | 10.1.100.0/24, 192.168.1.0/24 | 192.168.1.90 |
Les deux profils ont un MTU de 1380 et aucun keepalive. Montriond ne se connecte pas automatiquement (''autoconnect=false''). Maison ajoute le domaine de recherche ''beafrancois.fr''.
Les noms d'interface du portable n'ont pas de rapport avec ceux d'aiguilleur. Par exemple, le profil Montriond crée une interface locale ''wg1'' mais se connecte à wg0 sur aiguilleur. Les deux profils peuvent être actifs en même temps, car leurs noms d'interface, leurs ports locaux et leurs AllowedIPs sont tous différents. En particulier, deux AllowedIPs qui se chevauchent produiraient deux routes concurrentes vers le même réseau.
NetworkManager donne aux connexions WireGuard une ''dns-priority'' de 50, contre 100 pour les autres connexions. Le DNS du tunnel devient donc prioritaire dès que le tunnel est actif. Il faut que l'adresse de ce serveur DNS soit couverte par les AllowedIPs du profil. Sinon, les requêtes partent hors du tunnel vers une adresse injoignable, la résolution de noms échoue et Internet semble coupé. C'est pour cette raison que Montriond utilise 10.1.99.1, couverte par ''10.1.99.0/24'', et que Maison utilise 192.168.1.90, couverte par ''192.168.1.0/24''.