Accueil Divers
routeur4g.fr est financé par ses lecteurs. Quand vous achetez en passant par les liens du site, nous pouvons toucher une commission d’affiliation.

[TUTO] Accéder à son LAN derrière un routeur 4G, depuis l'extérieur, avec SSH

oga83oga83 Membre Messages: 1121
Modifié (mai 2020) dans Divers
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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Pour permettre la redirection de port et faire du reverse-ssh<br>ClientAliveInterval 30 # Pour fermer les ports en cas de perte de connexion 

Suite dans le post suivant...
Message edité par pioc34 on
«1

Réponses

  • oga83oga83 Membre Messages: 1121
    Modifié (février 2020)
    Suite :

    B- Sur le client Raspberry 4G

    1- Modifier /etc/ssh/ssh_config (attention, pas sshd_config !) pour faciliter la récupération de la connexion en cas de coupure
    TCPKeepAlive yes<br>ServerAliveCountMax 3<br>ServerAliveInterval 15<br>ExitOnForwardFailure yes
    2- Générer une clef privée (en étant root pour que la clef soit dans /root/.ssh/id_rsa) :
    ssh-keygen -t rsa
    3- Copier la clef publique sur le serveur
    Copier le contenu de /home/root/.ssh/id_rsa.pub (sur le Raspberry) dans le fichier /home/revssh/.ssh/authorized_keys (du serveur)

    4- Installer autossh pour obtenir un tunnel ssh avec reprise automatique en cas de perte de connexion
    apt-get install autossh
    5- Ajouter une ligne dans /etc/crontab :
    @reboot&nbsp;&nbsp;&nbsp; export AUTOSSH_POLL=30; /usr/lib/autossh/autossh -M 20000 -C -N -f -n -T -p 2200 -R \*:80:192.168.1.100:8080 revssh@1.2.3.4
    Les options utilisées pour autossh sont les suivantes :
    -M&nbsp;&nbsp;&nbsp;   Port de surveillance utilisé par autossh<br>-C &nbsp;&nbsp;   Les données sont compressées<br>-N &nbsp;&nbsp;   Ne pas exécuter de commande distante. Rediriger les ports uniquement.<br>-f &nbsp;&nbsp;   Fonctionnement en arrière-plan<br>-n&nbsp;&nbsp;&nbsp;   Ne pas lire sur stdin<br>-T&nbsp;&nbsp;&nbsp;   Désactiver la création du pseudo-terminal.<br>-p 2200 Port SSH utilisé par le serveur. A remplacer par le port réellement utilisé.<br>-R &nbsp;&nbsp;&nbsp;  Configuration de la redirection reverse-ssh. <br>&nbsp;&nbsp;&nbsp;     La syntaxe est la suivante : Interface:PortServeur:IPMachineLAN:PortMachineLan<br>En indiquant \* comme interface, on ouvre les ports de toutes les interface réseau du serveur. C'est indispensable car, par défaut, le reverse-ssh ouvre le port de l'interface "lo" alors qu'on souhaite utiliser le port de l'interface ouverte sur internet.<br>
    Si l'on souhaite effectuer plusieurs redirections, il suffit d'ajouter une option -R supplémentaire :)

    A noter que l'on peut très bien donner accès au Raspberry depuis l'extérieur. Il suffit d'utiliser 127.0.0.1 comme adresse LAN.
    Par exemple, pour accéder au Raspberry en SSH depuis l'extérieur, on pourra ajouter :
    -R \*:2222:127.0.0.1:22
    Il faudra bien sûr penser à ouvrir le port 2222 sur le serveur. On aura accès au Raspberry Pi de l'extérieur avec la commande suivante :
    ssh -p 2222 www.mondomaineperso.com

    Voilà, vous avez maintenant la possibilité de donner accès à n'importe quelle machine de votre LAN :)

    Si ce genre de post vous plait, n'oubliez pas de le promotionner pour que j'en fasse d'autres !
    Message edité par ludovick on
  • oga83oga83 Membre Messages: 1121
    Modifié (février 2020)
    Complément :

    Accéder à des machines de son LAN de l'extérieur, sans ouvrir de ports supplémentaires
    La méthode exposée ci-dessus permet d'exposer certains ports des machines de son LAN sur internet. Cela est très utile pour héberger un serveur web chez soi ou donner accès à des services de manière permanente.

    Si l'on souhaite avoir accès temporairement et à la demande à des machines de son LAN, voici comment procéder.

    Cas d'utilisation :
    Se connecter à une machine quand on est à l'extérieur, sans que cette machine ait un port ouvert à l'extérieur

    Principe :
    Utiliser un tunnel SSH sur son PC (à l'extérieur), avec redirection de port, dans un tunnel déjà établi par le Raspberry Pi.

    Réalisation :
    1- Avec la méthode exposée dans les posts précédents, donner accès au serveur SSH du Raspberry Pi.
    On supposera que l'option suivante a été utilisée pour établir le tunnel entre le Raspberry Pi et le serveur "ami" :
    -R \*:2222:127.0.0.1:22
    Cette option donne accès, de l'extérieur, sur le port 2222, au serveur SSH du Raspberry Pi sur son LAN.
    Pour plus de sécurité, il est fortement conseillé de n'utiliser que les connexions par clef d'authentification et d'interdire les connexions par mot de passe (à configurer sur le Raspberry Pi).

    2- Etablir une connexion SSH de l'extérieur sur le Raspberry Pi avec une redirection de port vers la machine souhaitée.
    Imaginons que l'on souhaite avoir accès à un serveur MySql sur son LAN qui tourne sur la machine 192.168.1.55. Sachant que MySql utilise par défaut le port 3306, nous allons rediriger le port du PC utilisé à l'extérieur vers 192.168.1.55:3306.
    Pour cela, on utilise la commande suivante avec redirection de port (la redirection n'est pas reverse cette fois-ci) :
    ssh -p 2222 -L 3306:192.168.1.55:3306 www.mondomaineperso.com
    Sur PC ou Mac, on peut avantageusement utiliser Putty :

    Configuration de la connexion


    Configuration des redirections



    3- A partir de là, le port local 3306 de son PC  est redirigé vers son LAN sur le serveur MySql :)
    Pour s'y connecter (par exemple avec MySQL Workbench), on utilise l'adresse 127.0.0.1:3306

    [A noter, que dans le cas de MySql, il y a encore plus simple puisque MySQL Workbench est capable de se connecter à un serveur au travers d'un tunnel SSH. La commande ssh ci-dessus n'est donc pas nécessaire]

    De cette manière, on peut avoir accès à l'interface web de son routeur, ou à n'importe quelle autre machine de son LAN :)
    Pour avoir accès à l'interface wb d'un routeur Huawei, il y a un petit piège lié à une redirection html vers une url absolue. Si vous avez suivi jusque ici, vous saurez certainement le résoudre ;)

    Vos commentaires sont les bienvenus !

    Si ce genre de post vous plait, n'oubliez pas de le promotionner pour que j'en fasse d'autres !

    Message edité par ludovick on
  • thierryRthierryR Membre Messages: 36
    Bonjour. Merci pour ce tuto illustré. C'est très chouette. Il y juste un point qui me semble obscur car au serveur j'ai une autre box en ip fixe.
    -R &nbsp;&nbsp;&nbsp;  Configuration de la redirection reverse-ssh. 
    Peux tu détailler davantage. Merci.
  • oga83oga83 Membre Messages: 1121
    thierryR a dit :
    Peux tu détailler davantage. Merci.
    De quels détails as-tu besoin ?
    Il y a déjà la syntaxe du reverse-tunnel et un exemple juste en dessous.
  • dupratpierre11dupratpierre11 Membre Messages: 59
    Sauf erreur de ma part :
    Attention, il y a une petite discordance entre les explications/implantations et les 4 premiers schémas rzo
    En effet, le LAN sur les schémas est en adressage avec un préfixe dans 192.168/16
    Alors que dans le texte on parle d’un adressage avec un préfixe dans 172.16/12

  • oga83oga83 Membre Messages: 1121
    @dupratpierre11
    Tu as raison. Ça vient du fait que je suis en 172.17.0.0/16 chez moi et que j'ai fait le tuto avec une config plus classique en 192.168.1.0/24.
    J'ai demandé à Ludovick de le corriger.
  • thierryRthierryR Membre Messages: 36
    Modifié (février 2020)
    Merci les gars. Un tel tuto est plutôt rare sur la toile. Ce n'est pas tous les jours qu'on utilise du reverse ssh.
    Pour des curieux comme moi, qui n'y connait rien, il est important d'être précis. (C'est de l'apprentissage).
    Pour accéder à son installation de l'extérieur, on m'a toujours dit qu'il fallait créer une liaison VPN mais jamais cet exemple. Félicitations.
  • oga83oga83 Membre Messages: 1121
    @thierryR Tant mieux si ce post t'a servi. Tu peux le promotionner :wink:
  • ludovickludovick Membre Messages: 8188
    on peux pas double-promote !
  • oga83oga83 Membre Messages: 1121
    ludovick a dit :
    on peux pas double-promote !
    Je n'en demande pas tant, un seul suffit :D

  • ShenShen Membre Messages: 33
    Modifié (février 2020)
    Bonjour,

    Est-ce que le reverse-ssh fonctionne pour les connexions entrantes d'un client torrent avec la connexion à un tracker privé?
  • oga83oga83 Membre Messages: 1121
    Aucune idée, mais me semble qu'un tel client utilise tcp ET udp.
    Faire du reverse-ssh udp est possible mais beaucoup plus compliqué (il faut convertir le flux udp en tcp pour passer dans le tunnel qui ne supporte que tcp).

  • ShenShen Membre Messages: 33
    Merci de la réponse,
    J'ai vu que mon client propose le choix des protocoles utilisés (TCP,UDP ou les 2)
    Ca restreint le nombre de seed, ceux ne proposant que l'UDP forcément. Et théoriquement les paquets TCP ont moins de charge utile du aux en-têtes sur chaque paquet de ce que j'ai lu.

    Je me suis interessé à OpenMTCProuteur, évoqué et présenté plusieurs fois sur le forum, je suis en test et ca marche très très bien.
    Par contre je vais aussi tester le reverse-ssh, comme tu le dis c'est un exercice interessant pour approfondir ssh

    ++
  • maxime92hsmaxime92hs Membre Messages: 1
    bonjour, lorsque j'execute la commande apt-get install rssh j'obtient :

    Package rssh is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    E: Package 'rssh' has no installation candidate

    et je ne trouve pas de solution sur internet, merci à vous



  • ludovickludovick Membre Messages: 8188
    @maxime92hs sous quel environnement ? Si c'est Debian Buster c'est normal, ne pas en tenir compte.
  • plenevepleneve Membre Messages: 2
    Bonjour ludovick,
    Merci pour ces tutos qui sont très clairs et très bien expliqués.
    Ils pourrait répondre à mon problème d'accès à mon réseau situé derrière un routeur 4G perso, mais j'ai aussi trouvé un troisième solution sur le net à base de FRP  (Fast Reverse Proxy) qui à l'air alléchante.
    Mon idée c'est de faire tourner le serveur FRP sur mon NAS avec IP privé et le client FRP sur mon NAS avec IP publique. Du coup je maitrise les 2 de bout en bout sans besoin de passer par un serveur externe (payant) ; seul défaut il faut que mon NAS principal reste allumé 24/24 mais c'est déjà le cas.
    Connaissez vous FRP et auriez vous des conseils sur cette solution ?
    Cordialement
    Pascal
  • oga83oga83 Membre Messages: 1121
    Le principe est toujours le même (FRP, ngrok, reverse-ssh, ...) :
    On effectue une connexion sortante vers un serveur "ami", accessible de l'extérieur, pour établir une route inverse.
  • Gazby18Gazby18 Membre Messages: 3

    Bonjour,

    J'ai trouvé le sujet très intéressant car je voudrais atteindre depuis internet  une caméra D-Link  DCS 4633EV située derrière un modem routeur Huavei B525s-65a.
    Après deux jours d’essais malgré que le DDNS fonctionne j’avais bien remarqué que l’adresse retourné par celui-ci en 10.116.x.x n’était pas joignable depuis un navigateur.

    Je vais donc essayer votre solution et comme je souhaite que le dispositif consomme le moins possible d’électricité vu qu’il fonctionnera 24h sur 24 le Raspberry Pi  sera le bienvenu.
    Quel modèle me conseilleriez-vous et quelle version de Linux faudrait-il  utiliser ?
    Autrefois j’ai bidouillé sous Linux et travaillé sur des stations Unix Sun mais maintenant je suis plutôt plus habitué à Windows jusqu’à la version 7 pro.

    En vous remerciant par avance.





  • ludovickludovick Membre Messages: 8188
    Modifié (janvier 2021)
    Un Raspberry Pi 3 ou nano suffit. Mais pour avoir de l'ethernet Gigabit ce sera un RPi4
    J'utilise la distrib dietpi.
  • oga83oga83 Membre Messages: 1121
    Modifié (janvier 2021)
    J'utilise Pi OS Lite (Ex Raspbian lite) avec l'imager officiel qu'on trouve ici : https://www.raspberrypi.org/software/
    Message edité par ludovick on
  • vbr42vbr42 Membre Messages: 33
    Modifié (janvier 2021)
    Hello oga83

    Comme tout le monde, j'ai une camera IP (axis) branchée sur un routeur 4G dans une résidence secondaire, et j'aimerais y accéder depuis mon domicile (en fibre avec Freebox). Je pense prendre un RPI que je raccorderai sur le routeur avec la camera.
    Le serveur ami (à mon domicile) peut il être un ordi portable (mac en l'occurrence) qu'on allume seulement quand on veut se connecter au LAN du routeur 4G ?
    Merci encore
    Vincent
  • oga83oga83 Membre Messages: 1121
    @vbr42 Oui à partir du moment où il dispose d'un serveur ssh accessible de l'extérieur.
  • vbr42vbr42 Membre Messages: 33
    Modifié (janvier 2021)
    ok merci :) ce serveur ami peut il accéder directement au LAN 4G ou faut il nécessairement un "client externe" qui se connecte à ce serveur ami ?
    Autre chose : le serveur ami peut il être un NAS Synology ? je ne crois pas que RSSH existe pour Synology...
  • oga83oga83 Membre Messages: 1121
    Oui, le client "externe" et le serveur ami peuvent être sur la même machine.
    C'est le Rpi du LAN 4G qui se connecte au serveur ami. C'est la raison pour laquelle il doit être accessible de l'extérieur.
  • Gazby18Gazby18 Membre Messages: 3
    Modifié (janvier 2021)
    oga83 est-ce que Pi OS Lite que tu préconises peut fonctionner en langue Française ?
    Merci.



  • oga83oga83 Membre Messages: 1121
    Modifié (janvier 2021)
    @Gazby18 Oui.
    Mais je ne préconise pas particulièrement cette distro, c'est juste celle que j'utilise le plus.
    Le choix dépend de ce qu'on veut faire avec.
    Comme leur nom l'indique, Pi OS Lite (Raspbian) et DietPi sont moins gourmandes en ressources et bien adaptées pour l'application décrite dans ce tuto.

  • vbr42vbr42 Membre Messages: 33
    Je pense qu’il faut obligatoirement RSSH pour suivre le tuto. Car sur Mac ce n’est pas la même syntaxe ni les mêmes fichiers de config. 
  • oga83oga83 Membre Messages: 1121
    rssh n'est pas indispensable.
    C'est juste une sécurité supplémentaire qui permet d’interdire le login ssh.
  • Marco44Marco44 Membre Messages: 5
    Bonjour, j'ai essayé de mettre en place cette solution mais ça ne fonctionne pas !

    Mon besoin c'est d'accéder à un serveur web sur le port 443 sur le LAN derrière le routeur 4g.

    Mon installation est la suivante : 
    - Un VPS chez IONOS avec 1Vcpu, 512Mo Ram, 10Go de SSD avec DEBIAN 10
    - Un PI4b 4Go RAM, 32Go SD, PI OS Lite
    - je fais le test de chez moi, je suis derrière une box fibre up Orange (c'est juste pour finaliser la conf du PI et du VPS avant d'aller l'installer derrière un TP-LINK MR600)

    J'ai mis en place tout le tutoriel, mais le port sur le VPS reste clos et avec un tcpdump je vois bien le paquet arriver avec un SYN et ensuite il y un RESET juste derrière ! 
    Je ne sais pas comment ouvrir un port (ex: TCP 2200 comme dans le tutoriel) en écoute sur le VPS. 
    J'ai du créer le répertoire .ssh de l'utilisateur revssh et créer aussi le fichier de la clé publique (j'ai peut-être mal mis les droit sur ce fichier ?).
    Le Firewall DEBIAN est en full open, il y un firewall dans la solution IONOS ou j'ai ouvert les ports suivants : 22, 80, 443, 2200, 8443, 8447

    Merci pour votre aide.
  • ModprobeModprobe Membre Messages: 79
    Hello,

    Si t'as un VPS, pourquoi tu ne passes pas par un VPN ?
    Personnellement j'utilise le même mécanisme avec du Wireguard.

    Serveur VPN sur le VPS. Le routeur 4G est client (dans ton cas ce sera le RPI) et mon smartphone se connecte aussi au VPS et le routage est fait vers l'interne grâce au routeur 4G (routes sur le serveur).

    Si tu veux utiliser impérativement du rSSH, il se peut simplement que ce soit le firewall dans l'interface qui pose souci. Quand j'étais chez IONOS j'avais fait une règle "any:any" dans l'interface et je gérais le pare-feu directement depuis le VPS.

    Il faut aussi modifier la configuration SSH (sshd_config) si tu veux que ça écoute sur un autre port que le 22.

    A+
Connectez-vous ou Inscrivez-vous pour répondre.