termal.in

← Blog

Se connecter en SSH à un serveur derrière un NAT ou un CGNAT, sans redirection de port

· Termalin Team sshtunnelingnetworkinghomelab

Vous voulez vous connecter en SSH à une machine qui ne peut pas accepter de connexions entrantes : un serveur maison derrière votre box, un Raspberry Pi au bureau, une machine sur un lien mobile ou 5G. La vieille réponse — rediriger le port 22 sur le routeur — est de moins en moins disponible, et là où elle l’est, c’est une mauvaise idée. Cet article parcourt les quatre approches qui fonctionnent vraiment, ce que chacune vous coûte, et un exemple concret pour chacune. Aucune n’ouvre de port entrant sur la machine que vous atteignez.

Pourquoi on ne peut plus simplement rediriger un port

Deux choses s’y opposent. D’abord, le NAT de l’opérateur (CGNAT) : la plupart des connexions domestiques en fibre, câble, mobile et Starlink partagent désormais une seule IP publique entre de nombreux clients ; il n’y a donc pas de port à rediriger sur « votre » adresse — le routeur que vous contrôlez n’est pas celui qui détient l’IP publique. Ensuite, même avec une vraie IP publique, un port SSH redirigé est repéré par les scanners en quelques minutes ; les journaux se remplissent de tentatives par force brute dès sa mise en ligne. Le correctif, dans tous les cas ci-dessous, a la même forme : la machine privée établit une connexion sortante vers un point joignable, et vous revenez par cette connexion. Le sortant fonctionne même à travers un CGNAT et des pare-feux verrouillés, car ce n’est qu’une connexion de plus qui quitte le réseau.

Les quatre options en un coup d’œil

ApprocheCe que vous exécutezInfrastructure supplémentaireClé permanente sur la machine ?Idéal pour
Tunnel SSH inversessh -R + autossh sur la machineun VPS avec IP publiqueoui (vers le VPS)vous louez déjà un VPS
VPN maillé (Tailscale / WireGuard)un client VPN aux deux boutsun service de coordinationvotre clé SSH habituelleatteindre plusieurs machines
Cloudflare Tunnelcloudflared sur la machineun compte Cloudflare + un domainevotre clé SSH habituellevous utilisez déjà Cloudflare
Connector sortantun petit agent sur la machineun compte Termalinnon — certificat à courte duréeaccès navigateur, sans VPS ni VPN

Les trois premières vous offrent un ssh you@… normal depuis votre portable. La dernière atteint la machine depuis un navigateur ou un agent IA à la place. Lisez la suite pour savoir laquelle vous convient.

Option 1 — Tunnel SSH inverse via un VPS

Si vous louez déjà un VPS bon marché avec une IP publique, la machine privée peut l’appeler et renvoyer son propre port SSH. Sur la machine derrière le NAT :

ssh -N -R 2222:localhost:22 tunnel@vps.example.com

Cela ouvre le port 2222 sur le VPS et renvoie chaque connexion qui l’atteint vers le port 22 de la machine domestique. Depuis n’importe où, rebondissez par le VPS pour atterrir sur la machine :

ssh -J tunnel@vps.example.com -p 2222 you@localhost

Un ssh -R brut meurt au premier hoquet du réseau ; enveloppez-le donc dans autossh dans une unité systemd pour le maintenir en vie à travers les redémarrages et les coupures, et ajoutez -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes. Toute la mécanique — y compris le piège GatewayPorts et pourquoi le tunnel se lie par défaut à la boucle locale du VPS — se trouve dans Les tunnels SSH inverses, expliqués. Compromis : vous entretenez un VPS et une clé permanente sur la machine capable de l’atteindre, et ce VPS fait désormais partie de votre surface d’attaque.

Option 2 — Un VPN maillé (Tailscale ou WireGuard)

Plutôt que d’exposer un port, placez les deux machines sur un réseau privé qu’elles seules voient. Tailscale en est la version sans effort. Sur la machine derrière le NAT :

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Installez aussi Tailscale sur votre portable, et les deux obtiennent une adresse 100.x.y.z stable (et un nom MagicDNS). Ensuite, il suffit de :

ssh you@home-box

comme si vous étiez sur le même réseau local — la machine n’est jamais exposée à l’Internet public. sudo tailscale up --ssh peut même gérer l’authentification SSH à votre place, vous n’avez donc pas de clés à administrer pour cela. WireGuard est la même idée montée à la main : vous assurez vous-même la coordination et configurez les pairs manuellement — plus de travail, pas de coordinateur tiers. Pour un home lab avec un NAS et deux ou trois Raspberry Pi, un VPN maillé est en général toute la réponse, et c’est l’option par défaut que je privilégie dans le guide du serveur/NAS maison. Compromis : chaque appareil qui a besoin d’un accès doit rejoindre le réseau, ce qui fait un client à installer et un compte à gérer.

Option 3 — Cloudflare Tunnel

Si votre domaine est déjà sur Cloudflare, cloudflared vous donne un tunnel sortant sans port ouvert. Sur la machine :

cloudflared tunnel login
cloudflared tunnel create home

Routez un nom d’hôte vers le tunnel et pointez-le vers le sshd local (ssh://localhost:22) dans la configuration du tunnel, puis lancez cloudflared comme service. Côté client, SSH l’atteint via un ProxyCommand dans votre ~/.ssh/config (en anglais) :

Host ssh.example.com
    ProxyCommand cloudflared access ssh --hostname %h

Désormais, ssh you@ssh.example.com circule à travers le réseau en périphérie de Cloudflare jusqu’à la machine. Le palier gratuit suffit. Compromis : vous faites transiter votre SSH par un tiers et prenez une dépendance à un compte Cloudflare et à un domaine que vous y hébergez — parfait si c’est déjà le cas, excessif sinon.

Option 4 — Un Connector sortant (sans VPS, sans VPN)

Les trois options ci-dessus exigent chacune une infrastructure permanente — un VPS, un VPN ou un domaine Cloudflare. Le Connector de Termalin réduit tout cela à une seule commande et atteint la machine depuis votre navigateur, l’app Termalin ou un agent IA au lieu d’un ssh local. Sur le serveur privé, une seule ligne installe un petit agent statique (Linux x86_64 et arm64) :

curl -fsSL https://termal.in/tunnel-install.sh | sudo TERMALIN_TOKEN=<token> sh

L’agent appelle Termalin vers l’extérieur par un unique WebSocket qu’il garde ouvert ; il n’écoute jamais sur un port. Quand vous ouvrez un terminal dans le client web, la requête descend par ce lien et l’agent se connecte au sshd de la machine sur localhost — il ne transporte que des octets SSH opaques, il ne voit donc jamais vos identifiants ni le contenu en clair de la session. L’inscription configure le sshd de la machine pour qu’il fasse confiance à l’autorité de certification SSH de Termalin, si bien que les connexions utilisent un certificat à courte durée plutôt qu’une clé privée permanente posée sur le serveur. C’est la seule ligne du tableau où figure « non » sous clé permanente sur la machine.

Le revers, dit franchement : vous atteignez la machine par la partie hébergée de Termalin — le terminal web, les apps de bureau et iOS de Termalin (qui se connectent par la même passerelle), ou un agent IA via le serveur MCP — et non avec une commande ssh brute depuis votre propre machine, et le Connector fait partie du forfait payant (ou de l’essai). Si vous voulez un terminal normal depuis votre portable, les options 1 à 3 conviennent mieux. Si vous voulez un accès navigateur depuis n’importe quel appareil — ou laisser un agent travailler sur une machine sans adresse publique et sans clé à voler — c’est l’option conçue pour ça. Ce même Connector sortant assure aussi une supervision et des alertes légères pour une machine sans port ouvert.

Laquelle choisir ?

  • Vous louez déjà un VPS : le tunnel inverse le réutilise — un ssh -R sous autossh et c’est réglé.
  • Vous avez plus d’une machine à atteindre, ou vous voulez qu’elles se comportent comme un réseau local : un VPN maillé comme Tailscale passe le mieux à l’échelle et n’expose rien.
  • Votre domaine est chez Cloudflare : leur tunnel s’intègre naturellement, sans nouveau prestataire.
  • Vous voulez zéro infrastructure permanente, un accès navigateur, ou un accès supervisé pour un agent : un Connector sortant, sans clé permanente laissée sur le serveur.

Les quatre partagent le seul principe à retenir : n’ouvrez jamais de port entrant sur une machine que vous ne pouvez pas vous permettre de voir scannée. Laissez-la plutôt sortir — ce simple renversement de sens est ce qui rend le SSH derrière un NAT sûr.


Termalin est un client SSH gratuit et multiplateforme, avec tunnels enregistrés, terminal web et Connector sans clé pour les serveurs privés — téléchargez-le, ou voyez comment il gère vos clés en toute sécurité.

Essayez-le sur un hôte.

Termalin est un client SSH rapide pour vous — et pour vos agents.

Offre gratuite · 14 jours d’essai Pro · tarifs