[Résolu] Serveur WEB derrière un NAT qu'on ne peut pas configurer

Serveur WEB derrière un NAT qu'on ne peut pas configurer [Résolu] - Réseaux - Réseaux grand public / SoHo

Marsh Posté le 01-07-2009 à 17:17:14    

Bonjour à tous  :hello:  
 
J'ai un boîtier électronique (avec un linux embarqué) qui implémente un serveur WEB, et est connecté à internet par GPRS.
Je veux pouvoir accéder au boîtier depuis n'importe où, donc il faudrait que le boîtier soit connecté au net avec une IP publique.
 
Problème, les opérateurs téléphoniques GPRS fournissent une IP privée, on se retrouve derrière leur NAT et donc il est impossible de faire une connexion entrante vers le boîtier.
Il y a la possibilité d'avoir une IP publique mais c'est la croix et la bannière, et l'abonnement est hors de prix.
 
Pour palier au problème, j'ai une idée qui ne devrait pas être trop difficile à implémenter, mais si ça se trouve ça existe déjà, donc peut être que ça m'éviterait de réinventer la roue ?
 
Il suffirait que sur le boîtier j'ai un petit programme démon qui se connecte en tant que client sur un serveur quelque part sur internet, de manière à créer un tunnel. Le démon aurait juste à rediriger les flux entrants/sortants de ce tunnel vers/depuis le port 80 local.
 
Et du côté du serveur, il y aurait un autre démon qui écoute les connexions entrantes sur le port 80, et redirigait les requêtes vers la socket du tunnel.
 
Techniquement c'est faisable, et coder ça ne me fait pas peur. Mais peut être qu'il existe déjà quelque chose pour faire ça !?


Message édité par nlc le 02-07-2009 à 15:01:03

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 01-07-2009 à 17:17:14   

Reply

Marsh Posté le 01-07-2009 à 18:16:20    

ca a deja etait fait ca il me semble, je vais chercher  
 
niveau concept ca me parait proche d'un reverse proxy + tunnel SSL non ??


---------------
I sit, in my desolate room, no lights, no music, Just anger, I've killed everyone, I'm away forever, but I'm feeling better,How do I feel,What do I say,Fuck you, it all goes away,
Reply

Marsh Posté le 01-07-2009 à 19:21:40    

reverse proxy ? Je ne connaissais pas le terme, je vais voir si ça correspond bien à mon besoin !
 


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 01-07-2009 à 20:38:14    

Bon j'ai regardé, ça ne colle pas le reverse proxy.
En fait ça se met en amont d'un ou plusieurs serveur web (qui peuvent etre sans doute sur reseau natté mais dans ce cas le reverse proxy doit être la passerelle), et ça permet de faire du cache, faire le tunnel SSL, de l'équilibrage de flux sur plusieurs serveur web, etc...
 


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 02-07-2009 à 12:40:40    

Je crois que j'ai trouvé la solution, grâce à ssh et la possibilité de faire du "remote port forwarding"
 
Sur le boîtier derrière le réseau naté, je lance la commande :
 
ssh -R 12345:localhost:80 user@serveur.com
 
Ca a pour effet d'ouvrir un tunnel ssh vers le serveur, et d'ouvrir le port 12345 sur le serveur. Et toute connexion faite sur ce port du serveur est redirigé vers le port 80 local du boitier à travers le tunnel ssh.
 
Quand je me loggue sur le serveur, et que je lance un client web sur le port 12345, j'atteins bien le serveur web du boitier à travers le tunnel !!
 
Par contre je n'ai pas accès au port 12345 du serveur depuis l'extérieur, mais ça c'est juste un problème de config ou de firewall je pense !


Message édité par nlc le 02-07-2009 à 12:42:49

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 02-07-2009 à 14:57:12    

C'est bon ça marche !
 
La commande magique du côté du boîtier électronique derrière le réseau naté de type 3G/GPRS (ou n'importe quel réseau naté du coup !) :
 
ssh -R *:12345:localhost:80 user@serveur.com
 
Le *: permet d'indiquer au serveur ssh d'ouvrir à l'ecoute le port 12345 sur toutes les interfaces réseau, et pas seulement l'interface localhost. Par contre sur le serveur ssh il faut rajouter l'option GatewayPorts yes dans le fichier /etc/ssh/sshd_config (et redemarrer ssh bien sûr).
 
Du coup le boîtier se connecte au serveur en ssh, ce qui crée le tunnel, et sur le serveur le port 12345 est ouvert et accessible de n'importe où. Les connexions entrantes sur ce port sont redirigées dans le tunnel à destination du boitier vers le port 80.
 
Du coup dans les boitiers à chaque déconnexion/reconnexion réseau, j'ai juste à appeler une url php sur le serveur en indiquant un identifiant boitier (par exemple l'adresse mac), et en retour je récupère le n° du port à utiliser dans la commande ssh.
 
Comme ça je peux ensuite me connecter à n'importe quel boitier en me connectant sur le serveur avec le bon numéro de port :
http://serveur.com:portCorrespondAuBoitier
 
Merci ssh ! :bounce:  :bounce:


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed