Ce tuto est la suite de celui qui présentait l'utilisation de ngrok.
Il sera certainement utile de relire ce tuto avant d'aborder celui-ci.
Pour rappel, en 4G, et contrairement à l'ADSL, on est généralement pas connecté directement à internet.
Sauf exceptions (airmob, ...), on est connecté au réseau privé de l'opérateur et c'est lui qui route vers internet.
Pour cette raison, il n'est pas possible d'ouvrir un port vers l'extérieur pour établir une connexion entrante.
Ici, nous allons utiliser un tunnel reverse-ssh pour permettre les connexions entrantes.
Par rapport à la solution ngrok, cette méthode présente plusieurs intérêts :
- Les données ne transitent que par des machines de confiance;
- Plusieurs redirections sont possibles simultanément. On peut ouvrir plusieurs ports qui seront redirigés vers une ou plusieurs machines de son LAN;
- Comme on maitrise le serveur "ami", on peut avoir un nom de domaine qui pointe vers cette machine (par exemple mondomaineperso.com). L'accès à la machine du LAN se fera simplement avec un nom de domaine;
- Cette solution coûte un peu moins cher.
L'inconvénient principal est qu'elle est plus complexe à mettre en œuvre.
Pour ceux qui souhaitent maitriser SSH, c'est un très bon exercice !
Prérequis :
1- Il faut disposer d'un serveur "ami" sur lequel :
- on a un accès SSH
- on peut ouvrir les ports vers l'extérieur
- on peut modifier la configuration (ssh et utilisateurs)
Personnellement, j'utilise une instance Scaleway ARM64-2GB à 3,60€ par mois. Elle dispose d'une adresse IP fixe et un de mes noms de domaine pointe dessus.
2- Il faut également disposer d'une machine sur son LAN sur laquelle il y a un client SSH (par exemple Putty sur un PC). Comme la connexion extérieure ne sera possible que quand cette machine est allumée, on peut avantageusement utiliser un Raspberry Pi. C'est ce qui est présenté dans ce tuto.
Principe :
1- Un Raspberry Pi sur son LAN (ou tout autre machine disposant d'un client SSH) crée un tunnel chiffré entre un serveur extérieur "ami" et une ou plusieurs machines du LAN;
2- En se connectant au serveur "ami", on accède aux machines du LAN qu'on a configurées.

Pour mettre en œuvre cette solution, il faut :
1- Ouvrir les ports souhaités sur le serveur "ami";
2- Créer un compte (sans login) sur ce serveur pour que le Raspberry Pi du LAN puisse s'y connecter;
3- Configurer SSH sur ce serveur pour permettre la redirection de port;
4- Configurer SSH sur le Raspberry Pi sur le LAN pour faciliter les reprises sur perte de connexion;
5- Générer une clef d'authentification RSA pour se connecter sur le serveur "ami";
6- Créer le tunnel au démarrage avec crontab.
Dans cet exemple, allons donner accès depuis l'extérieur à un serveur web qui tourne sur le LAN
Nous utiliserons les adresses IP suivantes, qui sont, bien sûr, à remplacer par celles réellement utilisées :
- Serveur "ami" externe : 1.2.3.4 avec SSH sur le port 2200. Le port 80 sera redirigé vers la machine du LAN;
- Raspberry Pi sur le LAN : 192.168.1.20 avec SSH sur le port 22;
- Machine à laquelle on veut donner accès depuis l'extérieur : 192.168.1.100. Serveur Web sur le port 8080.
Fonctionnement :
1- Le Raspberry Pi ouvre un tunnel SSH sécurisé vers le serveur "ami" 1.2.3.4:2200.
Il établit également les connexions avec les machines du LAN concernées (pour être précis, ces connexions ne seront en fait établies qu'au moment d'une connexion entrante, mais pour plus de clarté, je préfère les représenter ici).
Le reverse-ssh permet d'ouvrir un port sur ce serveur (80 dans notre exemple).
Ce port sera redirigé vers le port 8080 de la machine du LAN 192.168.1.100 pour laquelle on souhaite donner un accès depuis l'extérieur.

2- Une machine extérieure souhaite se connecter à notre machine sur le LAN
Pour cela, elle se connecte au serveur "ami" (
http://www.mondomaineperso.com
)

3- Cette connexion est redirigée sur la machine du LAN
La connexion au port externe du serveur 80 est redirigée par son SSH vers le Raspberry Pi par le tunnel sécurisé.
Le client SSH sur Raspberry Pi redirige le tunnel vers la machine finale sur le LAN, sur le port 8080.
Cette connexion n'est pas chiffrée mais ce n'est pas important car on se trouve sur le LAN.

Réalisation :
A - Sur le serveur "ami" :
1 - Ouvrir les ports souhaités sur le serveur "ami" (80 dans notre exemple)
2- Créer un utilisateur "revssh", mot de passe complexe (pas la peine de le noter, on l'utilisera avec une clef)
useradd -m revssh; passwd revssh
3- Par sécurité, interdire à cet utilisateur de se logguer et ne lui autoriser que la redirection de port :
apt-get install rssh # On installe rssh
Certaines fonctions de rssh (scp, sftp, ...) peuvent être activées/désactivées dans /etc/rssh.conf.
Modifier /etc/passwd pour utiliser rssh lors de la connexion, ce qui interdira à cet utilisateur de se logguer :
revssh:x:1006:1007::/home/revssh:/usr/bin/rssh
Dans cet exemple, l'uid et le gid 1006 et 1007 dépendent de la machine. Il ne faut pas y toucher.
4- Modifier /etc/ssh/sshd_config :
GatewayPorts yes # Pour permettre la redirection de port et faire du reverse-ssh
ClientAliveInterval 30 # Pour fermer les ports en cas de perte de connexion
Suite dans le post suivant...