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
- Qu’est-ce que FRP (Fast Reverse Proxy) ?
- FRP vs ngrok : pourquoi j’ai choisi FRP
- Architecture : comprendre frps et frpc
- Installer le serveur FRP (frps) sur un VPS
- Configurer le client FRP (frpc) derrière le NAT
- Cas d’usage concrets en production
- Sécuriser FRP : bonnes pratiques
- Checklist de déploiement
- 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
- Installer frps sur un VPS avec IP publique
- Générer un token d’authentification
- Installer frpc sur la machine derrière le NAT
- Configurer les tunnels (SSH, HTTP, HTTPS)
- Créer les services systemd
- Tester la connectivité
- Sécuriser avec TLS et restriction de ports

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 :
- frps (server) : tourne sur un VPS avec IP publique, reçoit les connexions entrantes
- frpc (client) : tourne sur la machine derrière le NAT, initie la connexion sortante vers frps
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 :
- Télécharge le binaire frps depuis les releases GitHub
- Génère un token d’authentification avec OpenSSL
- Configure la plage de ports autorisée (6000-6100 par défaut)
- Active le dashboard de monitoring
- Crée un service systemd pour le démarrage automatique
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 ?
▶ Quelle est la différence entre FRP et un VPN comme WireGuard ?
▶ Peut-on exposer plusieurs machines derrière le même serveur FRP ?
▶ FRP supporte-t-il les sous-domaines pour du HTTP ?
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 ?
/api/proxy/tcp) depuis un script ou l’intégrer dans Prometheus/Grafana via un exporter custom.
▶ FRP fonctionne-t-il avec Docker ?
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.