Fast reverse proxy : comment j’expose un service derrière un NAT sans toucher au routeur

FRP · REVERSE PROXY · TUNNELING NAT · LINUX

Exposer un service derrière un NAT sans ouvrir de ports sur le routeur, c’est exactement ce que permet FRP (Fast Reverse Proxy). Dans ce guide, je t’explique comment installer et configurer FRP sur Linux pour créer des tunnels SSH, HTTP et HTTPS – avec mes scripts prêts à l’emploi.

Sommaire

  1. Qu’est-ce que FRP (Fast Reverse Proxy) ?
  2. FRP vs ngrok : pourquoi j’ai choisi FRP
  3. Architecture : comprendre frps et frpc
  4. Installer le serveur FRP (frps) sur un VPS
  5. Configurer le client FRP (frpc) derrière le NAT
  6. Cas d’usage concrets en production
  7. Sécuriser FRP : bonnes pratiques
  8. Checklist de déploiement
  9. FAQ

Introduction

Tu as un serveur ou un service derrière un NAT – pas d’IP publique, pas moyen d’ouvrir un port sur le routeur du client. Situation classique en infogérance Linux. FRP (Fast Reverse Proxy) résout ce problème proprement : un binaire côté serveur (frps) sur un VPS avec IP publique, un binaire côté client (frpc) derrière le NAT, et tu exposes SSH, HTTP ou n’importe quel service TCP/UDP en quelques minutes. C’est open source, léger, et bien plus flexible qu’un tunnel SSH classique. J’utilise FRP en production pour accéder à des machines clientes sans VPN, et j’ai packagé mes scripts d’installation dans un dépôt GitLab prêt à cloner. Voici comment le mettre en place.

⚡ Réponse rapide

  1. Installer frps sur un VPS avec IP publique
  2. Générer un token d’authentification
  3. Installer frpc sur la machine derrière le NAT
  4. Configurer les tunnels (SSH, HTTP, HTTPS)
  5. Créer les services systemd
  6. Tester la connectivité
  7. Sécuriser avec TLS et restriction de ports
FRP Fast Reverse Proxy : exposer un service derrière un NAT sans ouvrir de ports sur le routeur
FRP permet de traverser un NAT et d’exposer un service local sur Internet sans configuration du routeur.

Qu’est-ce que FRP (Fast Reverse Proxy) ?

FRP est un outil open source écrit en Go qui permet d’exposer des services locaux derrière un NAT ou un firewall vers Internet, via un serveur intermédiaire. Le projet compte plus de 85 000 étoiles sur GitHub – c’est l’un des outils de tunneling les plus utilisés au monde.

Concrètement, FRP fonctionne avec deux composants :

Le client établit un tunnel persistant vers le serveur. Quand quelqu’un se connecte au VPS sur un port exposé, le trafic est redirigé vers le service local via le tunnel. Pas besoin d’ouvrir de port sur le routeur, pas besoin de VPN.

FRP vs ngrok : pourquoi j’ai choisi FRP

Ngrok est populaire pour le développement local, mais en production, ses limites deviennent vite bloquantes : URLs aléatoires sur le plan gratuit, limites de connexions, dépendance à un service tiers. FRP est une alternative à ngrok auto-hébergée qui offre un contrôle total.

Critère FRP ngrok
Prix Gratuit (open source) Gratuit limité, payant en prod
Hébergement Self-hosted (ton VPS) SaaS (serveurs ngrok)
Domaine custom Oui, natif Payant
Protocoles TCP, UDP, HTTP, HTTPS, STCP TCP, HTTP, HTTPS
Dashboard Oui (web intégré) Oui
Connexions simultanées Illimité Limité (plan gratuit)

En hébergement VPS, j’utilise FRP quand j’ai besoin d’accéder à des machines clientes sans déployer un VPN complet. C’est plus léger, plus rapide à mettre en place, et le client n’a rien à configurer sur son routeur.

Architecture : comprendre frps et frpc

Voici comment FRP fonctionne dans un scénario typique :

┌──────────────┐         ┌──────────────────┐         ┌──────────────────┐
│  Utilisateur │────────▶│  VPS (frps)      │◀────────│  Machine NAT     │
│  (Internet)  │  port   │  IP publique     │  tunnel │  (frpc)          │
│              │  exposé │  203.0.113.10    │  sortant│  192.168.1.50    │
└──────────────┘         └──────────────────┘         └──────────────────┘
                          Port 7000 (contrôle)
                          Port 6000 → SSH local :22
                          Port 6080 → HTTP local :80

Le client frpc initie une connexion sortante (port 7000 par défaut) vers le serveur frps. Cette connexion reste ouverte et sert de tunnel. Quand un utilisateur se connecte au VPS sur le port 6000, le trafic est acheminé vers le port 22 de la machine derrière le NAT.

Installer le serveur FRP (frps) sur un VPS

J’ai créé un script d’installation automatique que j’utilise pour mes tests. Le code source est disponible sur mon dépôt GitLab.

Installation rapide avec mon script

git clone https://gitlab.com/babidi34/frp-tools.git
cd frp-tools
chmod +x setup_frp_server.sh
sudo ./setup_frp_server.sh

Le script fait tout automatiquement :

Configuration manuelle (frps.toml)

Si tu préfères configurer manuellement, voici un fichier de configuration type :

# /etc/frp/frps.toml
bindPort = 7000

# Authentification par token
auth.method = "token"
auth.token = "ton_token_securise_genere_par_openssl"

# Dashboard web
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "un_mot_de_passe_fort"

# Restriction des ports exposés
allowPorts = [
  { start = 6000, end = 6100 }
]

# Logs
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 7

⚠️ Sécurité

Ne laisse jamais le token par défaut. Génère un token aléatoire avec openssl rand -hex 32. Le token transite en clair si tu n’actives pas TLS – voir la section sécurité plus bas.

Démarrer le service

sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps

Configurer le client FRP (frpc) derrière le NAT

Côté client, l’installation est tout aussi simple avec mon script :

git clone https://gitlab.com/babidi34/frp-tools.git
cd frp-tools
chmod +x setup_frp_client.sh
sudo ./setup_frp_client.sh

Le script te demande l’IP du serveur, le token, et les ports à exposer (SSH, HTTP, HTTPS).

Configuration manuelle (frpc.toml)

# /etc/frp/frpc.toml
serverAddr = "203.0.113.10"
serverPort = 7000

auth.method = "token"
auth.token = "ton_token_securise_genere_par_openssl"

# Tunnel SSH
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

# Tunnel HTTP
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 6080

# Tunnel HTTPS
[[proxies]]
name = "web-ssl"
type = "tcp"
localIP = "127.0.0.1"
localPort = 443
remotePort = 6443

Tester la connexion

# Depuis n'importe quelle machine avec accès Internet
ssh -p 6000 user@203.0.113.10

# Le trafic arrive sur la machine derrière le NAT, port 22

💡 Astuce

Ajoute un ~/.ssh/config pour simplifier l’accès quotidien :

Host machine-client
    HostName 203.0.113.10
    Port 6000
    User admin

Cas d’usage concrets en production

🔧

Maintenance à distance

Accéder en SSH à un serveur client derrière une box opérateur sans VPN ni ouverture de port côté client.

🌐

Prévisualisation web

Exposer temporairement un site de développement local pour un client, sans déployer en staging.

📊

Monitoring distant

Remonter les métriques d’un serveur isolé vers une instance Grafana centralisée via un tunnel TCP.

🏠

Homelab accessible

Rendre un NAS ou un service auto-hébergé (Nextcloud, Plex) accessible depuis l’extérieur sans IP fixe.

Sécuriser FRP : bonnes pratiques

FRP est puissant, mais mal configuré il peut devenir un vecteur d’attaque. Voici les mesures que j’applique systématiquement dans mes déploiements chez Linux-Man :

1. Token fort et unique

# Générer un token de 64 caractères
openssl rand -hex 32

2. Restreindre les ports autorisés

Dans frps.toml, limite la plage de ports que les clients peuvent utiliser :

allowPorts = [
  { start = 6000, end = 6100 }
]

3. Activer TLS

# frps.toml
transport.tls.force = true

# frpc.toml
transport.tls.enable = true

4. Firewall côté serveur

# UFW : n'ouvrir que les ports nécessaires
sudo ufw allow 7000/tcp    # Port de contrôle FRP
sudo ufw allow 6000:6100/tcp  # Plage de ports exposés
sudo ufw allow 7500/tcp    # Dashboard (restreindre par IP si possible)

🚨 Critique

Ne rends jamais le dashboard FRP accessible sans authentification. Limite l’accès par IP source avec UFW ou iptables. Le dashboard expose la liste de tous les tunnels actifs et leurs ports locaux.

5. Monitoring et logs

# Vérifier les connexions actives
curl -s http://admin:password@localhost:7500/api/proxy/tcp | jq

# Suivre les logs en temps réel
journalctl -u frps -f

Checklist de déploiement FRP

✅ Avant de mettre en production

  • ☐ Token généré avec openssl rand -hex 32
  • ☐ Plage de ports restreinte dans allowPorts
  • ☐ TLS activé (transport.tls.force = true)
  • ☐ Dashboard protégé par mot de passe fort
  • ☐ Firewall configuré (UFW/iptables)
  • ☐ Service systemd activé côté serveur et client
  • ☐ Logs configurés avec rotation
  • ☐ Test de connectivité validé de bout en bout

Erreurs fréquentes et solutions

❌ login to server failed: token in login doesn’t match

Le token dans frpc.toml ne correspond pas à celui de frps.toml. Vérifie qu’il n’y a pas d’espace ou de retour à la ligne dans le fichier de configuration.

❌ port not allowed

Le remotePort demandé par le client n’est pas dans la plage allowPorts du serveur. Ajuste la configuration côté serveur ou change le port côté client.

❌ connection refused sur le port 7000

Soit frps n’est pas démarré, soit le firewall bloque le port 7000. Vérifie avec systemctl status frps et sudo ufw status.

Questions fréquentes

FRP est-il adapté à la production ?
Oui, à condition de suivre les bonnes pratiques de sécurité (token fort, TLS, restriction de ports). Je l’utilise en production chez plusieurs clients pour de la maintenance à distance. Le binaire est stable, léger (quelques Mo), et le service systemd assure le redémarrage automatique.
Quelle est la différence entre FRP et un VPN comme WireGuard ?
Un VPN comme WireGuard crée un réseau privé complet entre les machines. FRP expose des services spécifiques (port par port). FRP est plus simple à déployer pour un accès ponctuel, WireGuard est préférable pour un réseau maillé permanent entre plusieurs serveurs.
Peut-on exposer plusieurs machines derrière le même serveur FRP ?
Absolument. Chaque machine fait tourner son propre client frpc avec des ports distants différents. Par exemple : machine A sur le port 6000 (SSH), machine B sur le port 6001 (SSH). Le serveur frps gère les connexions de façon indépendante.
FRP supporte-t-il les sous-domaines pour du HTTP ?
Oui. En configurant un vhostHTTPPort sur le serveur et un customDomains sur le client, tu peux router le trafic HTTP par nom de domaine. C’est idéal pour exposer plusieurs sites derrière le même VPS sans multiplier les ports.
Comment superviser les tunnels FRP en production ?
Le dashboard intégré (port 7500) montre l’état de chaque tunnel en temps réel. Pour du monitoring avancé, tu peux interroger l’API REST (/api/proxy/tcp) depuis un script ou l’intégrer dans Prometheus/Grafana via un exporter custom.
FRP fonctionne-t-il avec Docker ?
Oui, l’image Docker officielle snowdreamtech/frps et snowdreamtech/frpc sont disponibles. Tu montes ton fichier de configuration en volume et tu exposes les ports nécessaires. C’est pratique pour un déploiement conteneurisé.

Besoin d’accéder à des serveurs derrière un NAT sans VPN ?

Je déploie et sécurise FRP pour mes clients en infogérance. Configuration, monitoring, maintenance – tout est inclus.

Contacte-moi →

Quitter la version mobile