VPNSmith
self-host-vpnINFO

UFW et WireGuard : le tunnel monte, rien ne passe (2026)

Le handshake réussit, le client reçoit son IP, et pourtant aucun trafic ne sort. Ouvrir le port UDP ne suffit pas : UFW filtre le transit séparément, et son propre sysctl écrase celui du système.

Par Eric Gerard · Fondateur · VPNSmith - Spécialiste self-host VPN & VPS GDPR5 min de lecturePhoto via Pexels

Le symptôme est toujours le même, et il est déroutant parce que tout a l'air de marcher :

  • wg show affiche un handshake récent ;
  • le client a bien reçu son adresse dans le tunnel ;
  • et pas un octet ne sort vers Internet.

La cause n'est presque jamais le port. Elle tient à une distinction qu'UFW fait et qu'on oublie en le configurant : entrer sur une machine et la traverser sont deux autorisations différentes.

Le malentendu de départ

sudo ufw allow 51820/udp autorise les paquets à entrer sur le serveur, sur ce port. C'est nécessaire, et c'est tout ce que cette règle fait.

Le trafic de vos clients, lui, ne s'arrête pas au serveur : il le traverse pour ressortir par l'interface publique. Ce passage-là relève d'une autre chaîne de filtrage, que rien n'a autorisée — et qu'UFW refuse par défaut.

D'où la scène du dessus : la porte d'entrée est ouverte, le tourniquet ne s'ouvre pas.

Les quatre points à vérifier, dans cet ordre

1. Le transfert IP, et le piège du fichier qui écrase l'autre

UFW charge son propre fichier sysctl au démarrage, et il prime sur celui du système. Un réglage posé dans /etc/sysctl.conf peut donc être écrasé au premier ufw enable.

Le bon endroit est /etc/ufw/sysctl.conf :

net/ipv4/ip_forward=1 net/ipv6/conf/default/forwarding=1 net/ipv6/conf/all/forwarding=1

Puis on vérifie la valeur effective, pas le fichier :

sysctl net.ipv4.ip_forward

C'est le point qui coûte le plus de temps, parce que le réglage a l'air fait. On relit un fichier correct en se demandant pourquoi rien ne change.

2. Le transit, qui n'est pas l'entrée

Deux façons de l'autoriser. La ciblée, à préférer :

sudo ufw route allow in on wg0 out on eth0

Et la globale, dans /etc/default/ufw :

DEFAULT_FORWARD_POLICY="ACCEPT"

La seconde ouvre le transit pour toutes les interfaces. Elle dépanne en dix secondes, ce qui en fait un bon test de diagnostic — et une mauvaise configuration à laisser en place.

3. La traduction d'adresses, qu'UFW ne pose jamais tout seul

Sans elle, les paquets sortent avec leur adresse du tunnel, à laquelle aucune machine sur Internet ne sait répondre. Dans /etc/ufw/before.rules, tout en haut du fichier, avant la ligne *filter :

*nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE COMMIT

Deux erreurs classiques ici : placer ce bloc après *filter (il est alors ignoré) et recopier eth0 sans vérifier.

4. Le nom réel de l'interface de sortie

eth0 est une convention d'article, pas une réalité. Selon l'hébergeur, ce sera ens3, enp1s0 ou autre chose. La commande qui donne la réponse sans deviner :

ip route get 1.1.1.1

L'interface citée dans la sortie est celle qu'il faut écrire dans les deux règles ci-dessus.

Barrière tubulaire jaune en premier plan, deux chaînes pendantes accrochées à des crochets et un cadenas rouge, devant une cour industrielle asphaltée en fin de journée
Barrière tubulaire jaune en premier plan, deux chaînes pendantes accrochées à des crochets et un cadenas rouge, devant une cour industrielle asphaltée en fin de journée

Une barrière tubulaire jaune occupe le premier plan. Deux chaînes pendent librement de leurs crochets, sans être reliées entre elles, avec un cadenas rouge sous l'une d'elles. Derrière, une cour asphaltée avec des flaques, des bâtiments bas et un ciel de fin de journée.

Le test qui sépare les deux familles de causes

Depuis un client connecté, essayez de joindre l'adresse du serveur dans le tunnel (souvent 10.8.0.1) :

ce que vous observezce que cela dit
l'adresse du tunnel répond, rien d'extérieur ne répondle tunnel va bien : transit ou traduction d'adresses manquant
l'adresse du tunnel ne répond pas non plusle problème est en amont : clés, AllowedIPs, routage du client
tout répond mais les noms ne se résolvent pasce n'est pas UFW, c'est le DNS poussé au client

Cette troisième ligne mérite d'être connue : « je n'ai pas Internet » signifie très souvent « aucun nom ne se résout ». Une adresse IP jointe directement le montre en une commande.

Après application : recharger, et vérifier ce qui tourne

before.rules n'est relu qu'au rechargement :

sudo ufw disable && sudo ufw enable

Puis on regarde l'état réel, pas le fichier qu'on vient d'écrire :

sudo ufw status verbose sudo iptables -t nat -L POSTROUTING -n -v

Un dernier point qui produit des configurations en double : si vos règles PostUp et PostDown dans le fichier WireGuard posent déjà du MASQUERADE, vous n'avez pas besoin du bloc *nat ci-dessus. Les deux ensemble ne cassent pas grand-chose, mais vous rendent la prochaine panne beaucoup plus difficile à lire — et il y aura une prochaine panne.

Ce que ce réglage protège, et ce qu'il ne protège pas

Un serveur correctement pare-feuté décide ce qui se connecte à lui. C'est utile, et c'est étroit. Cela ne dit rien de ce que votre navigateur raconte pendant que vous naviguez dans ce tunnel, ni de ce qu'un appareil perdu déverrouille encore, ni du compte qui peut réinitialiser tous les autres chez vous.

Ce sont des habitudes plus que des règles de filtrage, et elles ne se règlent pas dans before.rules.

Situez votre propre surface d'attaque — 10 questions, environ trois minutes, sans compte, sans adresse e-mail, et rien n'est conservé. Le résultat nomme le geste qui, chez vous, réduit le plus l'exposition — et pour quelqu'un qui auto-héberge, ce n'est généralement pas une règle de pare-feu de plus.

En résumé

Ce qu'on croit réglerCe qu'on règle vraiment
ufw allow 51820/udpl'entrée sur le serveur, pas le transit
net.ipv4.ip_forward dans /etc/sysctl.confrien, si UFW recharge le sien par-dessus
« UFW gère le NAT »il n'en pose aucun sans bloc *nat explicite
eth0 recopié d'un tutoriell'interface d'un autre serveur que le vôtre

La phrase à retenir tient en une ligne : un port ouvert dit que les paquets peuvent entrer, pas qu'ils peuvent traverser.

★ Datacenter Nuremberg GDPR · ✓ IPv4 dédiée incluse · 200+ Mbps garantis

Héberge ton VPN sur ton propre VPS → ContaboAccès root complet · IPv4 publique · choisis ta région

Questions fréquentes

Pourquoi mon tunnel WireGuard se connecte mais je n'ai pas Internet ?
Parce que le handshake et le routage sont deux choses différentes. Le handshake ne prouve qu'une chose : les deux pairs se sont reconnus et le port UDP est joignable. Le trafic qui doit ensuite traverser le serveur pour ressortir vers Internet passe par la chaîne FORWARD et par la traduction d'adresses, que rien n'a autorisées. UFW filtre le transit indépendamment des règles d'entrée, donc une règle d'ouverture de port ne dit rien du transit.
Est-ce que ufw allow 51820/udp suffit ?
Non, et c'est la confusion centrale. Cette règle autorise les paquets à ENTRER sur le serveur, sur ce port. Elle n'autorise pas les paquets à TRAVERSER le serveur pour ressortir par l'interface publique. Le transit se règle par ufw route allow, ou par la politique de transfert par défaut dans /etc/default/ufw. Le port ouvert et le tunnel qui achemine ne sont pas la même question.
Où activer le transfert IP quand on utilise UFW ?
Dans /etc/ufw/sysctl.conf, pas dans /etc/sysctl.conf. UFW charge son propre fichier au démarrage et il écrase la valeur du système : on peut donc voir net.ipv4.ip_forward correctement réglé dans le fichier habituel et retrouver zéro après un ufw enable. C'est le piège le plus coûteux de cette configuration, parce que le réglage a l'air fait.
UFW gère-t-il le NAT tout seul ?
Non. UFW ne pose aucune règle de traduction d'adresses de lui-même. Sans un bloc nat déclaré en tête de /etc/ufw/before.rules, les paquets des clients sortent avec leur adresse du tunnel, à laquelle personne ne sait répondre. Le symptôme est trompeur : le trafic part, il ne revient jamais.
Comment savoir si le problème vient d'UFW ou d'ailleurs ?
Un test tranche en quelques secondes : depuis un client connecté, essayez de joindre l'adresse du serveur DANS le tunnel. Si elle répond mais qu'aucune adresse extérieure ne répond, le tunnel fonctionne et c'est le transit ou la traduction d'adresses qui manque. Si l'adresse du serveur dans le tunnel ne répond pas non plus, le problème est en amont : clés, AllowedIPs ou routage du client.
Faut-il aussi s'occuper d'IPv6 ?
Oui, et l'oubli produit deux ennuis symétriques. Si le transfert IPv6 est activé sans règle de transit ni traduction, les clients ont une route qui ne mène nulle part et certains sites deviennent lents avant de basculer en IPv4. Si l'IPv6 est laissé actif côté client sans passer par le tunnel, le trafic sort hors du tunnel — c'est une fuite, pas une panne, et elle ne se voit pas.