Forum Linux.général Redirection de port avec SSH

Posté par . Licence CC by-sa
Tags :
1
22
avr.
2015

Bonjour,

j'utilise actuellement la commande suivante pour créer un tunnel SSH depuis des PC externes (www) vers mon serveur :

ssh -R 330X:localhost:22 -D 7979 mon_user@mon_serveur -p 444 -N

X vaut de 1 à 99, ce qui veut dire que j'autorise 99 machines à se connecter à mon serveur via SSH.

Ainsi, depuis le serveur, si je fais : ssh -p 330X user@localhost

Je peux me connecter à la machine n°X par ssh.

Le serveur est accessible depuis n'importe quel PC sur mon réseau interne.
J'aimerai pouvoir transférer des fichiers sur la machine externe directement depuis un des PC sur mon réseau interne.

Je pensais que si je faisais :

scp -p 330X le_fichier user@mon_serveur:./

ça fonctionnerait. Hors j'ai connexion refusée.

Est-ce que quelqu'un pourrait m'expliquer comment faire ? Si c'est faisable ? Ou si j'en demande trop ?

Merci d'avance
Sylvain

  • # déjà ssh

    Posté par (page perso) . Évalué à 2.

    avant le scp, essaie d'avoir le ssh accessible en une seule commande.

    Je dis au pif mais en l'occurence je pense que le problème c'est que tu peux pas faire ssh mon_serveur -p 330X parce que c'est disponible que sur le localhost de ton serveur.

    Tu peux peut-être remplacer localhost par ton ip externe ce qui devrait marcher. Sinon tu peux aussi rajouter un proxy dans ton ~/.ssh/.config, un truc de ce style :

    Host machineX
    User user
    Hostname machineX
    ProxyCommand ssh mon_serveur -W %h:%p
    

    à partir de là, tu pourras faire ssh machineX et ça passera par ton serveur, scp marchera aussi du coup.

    • [^] # Re: déjà ssh

      Posté par . Évalué à 1.

      je n'ai pas d'IP pour les machines externes … car elles sont chez des clients, dans leur réseau entreprise, derrière un routeur/firewall.

      D'où les tunnels SSH … cela me permet via ShellInABox et NoVNC sur un site web d'avoir accès à la machine pour faire du support sans demander une modification des règles de sécurité chez les clients.
      Oui, je redirige le port 22 et le port 5900.
      Je voulais rediriger le port du ftp, comme ça je mettais net2ftp dans le site et mon problème était réglé.

      Sauf que je bride ftp à un seul répertoire, pour éviter toute intrusion depuis le réseau usine (ou autre) chez les clients.
      Puis aujourd'hui, seul un automate nécessite ftp pour pouvoir réaliser ses mise à jour.

      Un sftp depuis mon serveur, de la manière suivante, fonctionne très bien :

      sftp -o Port=330X user@localhost

      Maintenant il faut que j'arrive à faire en sorte que la meme commande (ou ssh ou scp) que je fais depuis un autre PC arrive sur le serveur et soit redirigée vers la machine externe.

      Précision supplémentaire, seul un user spécifique du serveur peut se connecter à distance vers les machines externes à cause du tunnel créé avec ce user.

      • [^] # Re: déjà ssh

        Posté par (page perso) . Évalué à 2.

        Tu répondais à moi ou à olivier en dessous ?

        Moi je t'ai donné deux solutions : remplacer localhost par l'adresse ip externe de ton serveur ou ajouter dans le .config de ton client ssh (donc ta machine perso à toi) un proxy pour que ça fasse automatiquement ssh serveur / ssh serveur surlebonport

        Et donc ça c'est quoi qui te va pas en vrai ?

        • [^] # Re: déjà ssh

          Posté par . Évalué à 1.

          je faisais une réponse à toi au départ, puis j'ai dériver sur la réponse d'olivier car j'étais en train de faire les tests en même temps. Désolé ..

          J'ai pas bien compris à quel endroit tu veux que je remplace locahost par adresse IP de la machine. Dans la requete ssh qui crée le tunnel ?
          Et vu que l'IP de la machine externe sera une IP appartenant au réseau interne du client, je pense pas que ça m'aidera .. et utiliser l'adresse IP du routeur du client non plus …

          Après même réponse pour le proxy dans mon client ssh sur mon poste. L'IP de la machine ne me servira pas. Et de toute façon je ne l'ai pas.

          Ou alors j'ai pas vraiment compris comment fonctionne ce que tu veux me faire faire.

          Je cherche également en parallèle un client SFTP que je pourrai intégrer à mon site. Ça m'aiderai tout aussi bien je pense.

          Désolé si je me suis mal fait comprendre …

          S'il faut plus d'explication car je suis pas clair tu me dis ..

          • [^] # Re: déjà ssh

            Posté par (page perso) . Évalué à 2.

            J'ai pas bien compris à quel endroit tu veux que je remplace locahost par adresse IP de la machine. Dans la requete ssh qui crée le tunnel ?
            Et vu que l'IP de la machine externe sera une IP appartenant au réseau interne du client, je pense pas que ça m'aidera .. et utiliser l'adresse IP du routeur du client non plus …
            

            cf réponse de Neox qui est peut-être plus explicite mais oui c'était remplacer localhost dans la requête qui crée le tunnel par l'ip externe de ton serveur

            Idem pour la config du proxy dans ~/.ssh/config, à aucun moment tu ne mets l'adresse du "client" enfin ton client, la machine à accéder que tu connais pas l'adresse, tu ne mets que l'adresse du serveur.

            Je ne m'exprime peut-être pas bien, mais clairement ce que tu veux faire ça correspond à faire machine A --> machine B --> machine C sachant que machine B et machine C c'est chez toi ça correspond à ton serveur donc la même machine mais sur 2 ports différents.

      • [^] # Re: déjà ssh

        Posté par . Évalué à 3.

        Un sftp depuis mon serveur, de la manière suivante, fonctionne très bien :

        sftp -o Port=330X user@localhost

        Maintenant il faut que j'arrive à faire en sorte que la meme commande (ou ssh ou scp) que je fais depuis un autre PC arrive sur le serveur et soit redirigée vers la machine externe.

        comme evoqué par les autres, il faut verifier que le port 330X soit en ecoute sur l'IP externe de ton serveur de rebond, et non pas uniquement sur 127.0.0.1 (localhost).

        ca se verifie en faisant netstat -puant | grep 330X sur la machine de rebond

        • [^] # Re: déjà ssh

          Posté par . Évalué à 2.

          Qu'est ce que tu appelles ma machine de rebond ? Mon serveur ?

          Dans ce cas j'ai ça :

          tcp 0 0 127.0.0.1:3301 0.0.0.0:* LISTEN 62684/sshd: name

          • [^] # Re: déjà ssh

            Posté par . Évalué à 3.

            et voila ta reponse ;)

            ton port 3301 n'est ouvert que sur 127.0.0.1 (la machine de rebond elle meme)
            donc seule la machine de rebond peut se connecter dessus.

            tu ne peux donc pas te connecter depuis une autre machine, sur rebond:3301 pour atteindre le site distant.

            pour cela il faudrait que le port soit branché sur l'IP de la machine de rebond :
            - A.B.C.D:3301
            ou sur toutes les IPs de la machine
            - 0.0.0.0:3301

            à voir si c'est faisable en faisant un truc comme ca
            ssh -R A.B.C.D:330X:localhost:22 -D 7979 mon_user@mon_serveur -p 444 -N
            ou
            ssh -R 0.0.0.0:330X:localhost:22 -D 7979 mon_user@mon_serveur -p 444 -N

            • [^] # Re: déjà ssh

              Posté par . Évalué à 2.

              j'ai essayé ça :

              ssh -R 0.0.0.0:330X:localhost:22 -D 7979 mon_user@mon_serveur -p 444 -N

              et ça aussi du coup :

              ssh -R 330X:0.0.0.0:22 -D 7979 mon_user@mon_serveur -p 444 -N

              Mais ça change rien. J'ai toujours :

              tcp 0 0 127.0.0.1:3301 0.0.0.0:* LISTEN 59691/sshd: name

              • [^] # Re: déjà ssh

                Posté par . Évalué à 3.

                J'ai activé ça dans /etc/ssh/sshd_config sur mon serveur :

                GatewayPorts yes

                du coup maintenant j'ai ce que tu me disais :

                tcp 0 0 0.0.0.0:3301 0.0.0.0:* LISTEN 64487/sshd: name

                Et cela sans mettre 0.0.0.0:3301:localhost:22 .. juste ce que j'avais 3301:localhost:22 suffit

                Et maintenant TOUT BAIGNE !!!!!!!!!!!!!!!!!!!!! EXTRA !!!!!!!!!!!!!

                Depuis mon poste, si je tape :

                ssh -p 3301 user_machine_distante@mon_serveur

                Je suis connecté à ma machine distante.

                ET le plus beau … c'est que j'ai également accès en SFTP avec FileZilla depuis mon … et la c'est tout simplement MAGIQUE !!!!

                Merci de m'avoir mis sur la voie.

                Merci à tous.

                P…. suis content

                Euh … comment on ferme un topic ? Merci

  • # sftp

    Posté par (page perso) . Évalué à 2.

    sftp est fait pour transférer des fichiers. Il fait parti du package client ssh.

    Pour faire du sftp avec un port non standard :

    sftp -o Port=330X user@mon_serveur

    La seul contrainte est d'avoir le serveur sftp d'activé sur la machine à distance. Pour une Debian/Ubuntu, le /etc/ssh/sshd_config doit avoir :
    Subsystem sftp /usr/lib/openssh/sftp-server

  • # c'est pas marseille mais Marseille

    Posté par . Évalué à 3.

    C'est très subtile. La commande scp se voulant être très proche de la commande cp ne pouvait utiliser l'option "-p" pour définir le port car il est réservé pour préserver les métadonnées d'un fichier lors la copie.

    Toutefois, les développeurs, n'étant, ma fois, pas si cons, ont eu l'idée de faire l'option "-P" pour définir le port. Pouvoir définir le port pour une application réseau étant le b.a.-ba.

    Tout ceci est fort bien expliquer dans la page de manuel de la commande scp.

    Ce qui donne pour ta commande:

    scp -P 330X le_fichier user@mon_serveur:./

  • # Un peu plus d'explications

    Posté par . Évalué à 1.

    Je vais essayer d'expliquer un peu mieux.

    J'ai une machine chez un client (n'importe où dans le monde) connectée au réseau entreprise de ce même client, réseau qui à accès à internet.
    Sur cette machine, il existe l'utilisateur user_machine.

    J'ai un serveur en France, connecté au réseau entreprise de ma société, et accessible depuis internet.
    Sur ce serveur il existe un user nommé user_serveur.

    Ma machine chez le client crée un tunnel ssh vers le serveur en utilisant l'utilisateur user_serveur. En faisant la redirection des port 22 et 5900. Le tout par le port 444. Et j'utilise les socket également pour pouvoir faire fonctionner un chat (-D 7979). Ce qui donne la commande suivante en imaginant que la machine est la première connecté au serveur (X=1)

    ssh -R 3301:localhost:22 -R 5901:localhost:5900 -D 7979 user_serveur@mon_serveur -p 444 -N

    Ensuite, si j'ouvre un terminal sur mon serveur, je peux faire ce que je veux (ssh, scp, sftp) avec les commandes suivantes que je sais utiliser en fouillant dans les MAN de chacune d'entre elles :

    ssh -p 3301 user_machine@localhost
    scp -P 3301 le_fichier user_machine@localhost
    sftp -o Port=2201 user_machine@localhost

    Mais cela fonctionne uniquement avec l'utilisateur user_serveur puisque le tunnel ssh a été créé avec cet utilisateur. Avec un autre user du serveur cela ne fonctionne pas. Ce qui est très bien pour moi.

    Voila ce que j'ai si j'essaie de le faire depuis un autre utilisateur du serveur :

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ECDSA key sent by the remote host is
    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
    Please contact your system administrator.
    Add correct host key in /home/utilisateur/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /home/utilisateur/.ssh/known_hosts:2
    ECDSA host key for [localhost]:3301 has changed and you have requested strict checking.
    Host key verification failed.
    Couldn't read packet: Connection reset by peer

    Maintenant, je me situe sur mon poste. Il est sur le réseau interne de mon entreprise. J'ai accès donc en interne au serveur. Je n'ai ni l'utilisateur user_serveur, ni user_machine sur ma machine.

    Je voudrais envoyer un fichier, ou en récupérer un, sur la machine chez le client. Pour cela il faut que j'utilise le user qui est sur la machine, soit user_machine, sachant que ce user n'existe pas sur le serveur.

    En gros je voudrais traverser mon serveur comme s'il n'existait pas.

    Après je suis pas un expert dans le domaine, c'est pour ça que je requière voter aide.

    Merci

    • [^] # Re: Un peu plus d'explications

      Posté par (page perso) . Évalué à 2. Dernière modification le 23/04/15 à 13:51.

      Dans .ssh/config, en utilisant une ProxyCommand, tu indiques à ssh par où passer (par ton serveur intermédiaire) pour atteindre tes machines cibles. Tu n'as ainsi plus à le spécifier pour chaque commande basée sur ssh.

      Python 3 - Apprendre à programmer en Python avec PyZo et Jupyter Notebook → https://www.dunod.com/sciences-techniques/python-3

  • # Redirection-de-ports-avec-ssh

    Posté par . Évalué à 1.

    Bonjour à tous
    Je suis un peu dans le même cas que sygirard et j'ai beau relire vos explications, je reste un peu perdu. Je m'explique:
    J'ai créé mon-adresse.no-ip.org qui doit arriver via P:22 redirigé P:6xxx sur une RaspberryPi en Raspbian qui sera le serveur de rebond vers un serveur final (actuellement UbuntuServeur - ssh sur P:22) sur lequel sont chrootés mes "clients" distants (sur /home car serveur final dédié pour l'instant), qui ne feront que du sftp. Ces deux serveurs sont physiquement chez moi.
    Je pense avoir compris le principe, mais je mélange toujours les machines lors de la saisie des diverses commandes. J'essaie d'installer tout ça de mon win7 avec Putty, tests avec Filezilla, et SecurityKiss Tunnel pour les accès extérieurs.
    Donc pour l'instant,
    sur le serveur final:
    création des users chrootés avec leur fichier .ssh/config contenant:

    Host 192.168.1.60 serveur-final
    User toto
    Hostname serveur-final
    ProxyCommand sftp -q -W %h:%p:%r mon-adresse.no-ip.org

    modification du fichier ssh_config avec ajout de:
    ProxyCommand sftp -q -W %h:%p:%r mon-adresse.no-ip.org

    modification du fichier sshd_config avec:
    Subsystem sftp internal-sftp
    .....
    ChhrootDirectory %h
    .....

    sur le serveur de rebond:
    pas d'users chrootés
    fichier sshd_config:
    Subsystem sftp /usr/lib/openssh/sftp-server

    fichier ssh_config non modifié

    Configuré de la sorte, j'arrive uniquement à me connecter en sftp via Putty en interne du serveur de rebond sur le serveur final, et pour Filezilla seulement si je mets Hôte: serveur final Port:22
    J'ai testé divers paramétrages et je m'y perds un peu (beaucoup).
    En outre, le peu de fois où ça marche en partie, je vois le nom du serveur final ainsi que les commandes qui passent (privatekey.ppk) pour les autres users chrootés dans la fenêtre supérieure de Filezilla.

    Pouvez-vous m'aider?
    Merci d'avance,
    fahdyezz.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.