ssh à private-ip

18

J'ai un ordinateur avec CentOS (ordinateur A) configuré comme ayant une IP privée 10.150.5.141 (avec pare-feu restreint), peut accéder à Internet et à mon ArchLinux VPS (ordinateur B) avec une véritable ip wxyz

Comment puis-je créer un autre PC (ordinateur C) qui pourrait accéder à l'ordinateur B pour se connecter à l'ordinateur A, mais l'ordinateur C ne peut pas se connecter directement à l'ordinateur A (car il se trouve sur le propre réseau privé de A)?

Je sais qu'un tunnel peut ouvrir des ports locaux vers un autre ordinateur: port, mais comment faire le contraire?

Je veux accéder à l'ordinateur A à l'aide sshde l'ordinateur B mais l'ordinateur B ne peut pas accéder à l'ordinateur A, car le réseau sur l'ordinateur A est restrictif (peut sortir, mais ne peut pas entrer, car je n'ai pas accès à leur routeur)

Je veux quelque chose comme ça:

ssh -connect-to w.x.y.z:22 -open-port vvv -forward-to 10.150.5.141 -port 22

de sorte que lorsque je ssh w.x.y.z:vvvpartirai de l'ordinateur C, il sera transmis au réseau privé 10.150.5.141:22.

Kokizzu
la source

Réponses:

14

Ce que vous recherchez s'appelle un tunnel inverse. sshle fournit via le -Rcommutateur:

-R [bind_address:]port:host:hostport
       Specifies that the given port on the remote (server) host is to 
       be forwarded to the given host and port on the local side.  This 
       works by allocating a socket to listen to port on the remote side, 
       and whenever a connection is made to this port, the connection is
       forwarded over the secure channel, and a connection is made to host 
       port hostport from the local machine.

Comme l'OP l'a découvert avec sa réponse, la syntaxe est la suivante:

$ ssh -f -N -R vvv:localhost:22 w.x.y.z

Exemple

J'ai 2 ordinateurs sur le réseau, lappyet remotey. J'exécute donc la commande suivante lappy:

$ ssh -f -N -R 12345:localhost:22 remotey

Je peux confirmer que cela fonctionne:

$ ps -eaf|grep "[l]ocalhost:22"
saml     27685     1  0 11:10 ?        00:00:00 ssh -f -N -R 12345:localhost:22 remotey

Maintenant, si je me connecte sshséparément au système distant remoteyet que j'exécute cette commande, je peux voir qu'il accepte désormais les connexions sur le port 12345 sur l'interface locale du système distant:

$ netstat -an|grep :12345
tcp        0      0 127.0.0.1:12345             0.0.0.0:*                   LISTEN      
tcp        0      0 ::1:12345                   :::*                        LISTEN      

Test de la connexion

Vous pouvez voir que le tunnel ssh inverse fonctionne comme suit.

  1. se connecter à remotey

    [user@lappy ~]$ ssh remotey
    
  2. tester le port du tunnel inverse

    [user@remotey ~]$ ssh -p 12345 localhost
    
  3. devrait maintenant être de retour sur lappy

    user@localhost's password: 
    Last login: Thu Aug  1 17:53:54 2013
    /usr/bin/xauth:  creating new authority file /home/user/.Xauthority
    [user@lappy ~]$ 
    

Ports sur des interfaces autres que localhost ( lo)?

Vous pourriez vous gratter la tête si vous essayez une commande comme celle-ci et qu'elle ne semble pas fonctionner, ou qu'elle se lie toujours à un port sur l' lointerface localhost ( ).

Par exemple:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

REMARQUE: cette commande indique d'ouvrir le port 12345 @ remotey et de tunneler toutes les connexions au port 22 @ lappy.

Puis à distance:

remotey$ netstat -an|grep 12345
tcp        0      0 127.0.0.1:12345              0.0.0.0:*                   LISTEN   

Ce qui se passe, c'est que sshdles configurations ne vous permettent pas de le faire. En fait, sans cette fonctionnalité activée ( GatewayPorts), vous ne pourrez lier aucun sshport de tunnel à autre chose que localhost.

Activation de GatewayPorts

remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no

Pour l'activer, modifiez ce fichier /etc/ssh/sshd_config:

GatewayPorts clientspecified

Et redémarrez sshd:

remotey$ sudo service sshd restart

Maintenant, essayez à nouveau et nous devrions voir l'effet que nous recherchons:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

Et revérifiez cette fois sur remotey:

remotey$ netstat -anp | grep 12345
tcp        0      0 192.168.1.3:12345           0.0.0.0:*                   LISTEN      9333/sshd

NOTE: Dans ce qui précède, nous pouvons voir que le sshdprocessus écoute maintenant sur l'interface qui a l'adresse IP 192.168.1.3, pour les connexions sur le port 12345.

Tester la connexion (deuxième partie)

Maintenant, avec notre configuration modifiée lorsque nous la testons cette fois. La principale différence est que nous n'avons plus à nous connecter à localhost!

  1. se connecter à remotey

    [user@lappy ~]$ ssh remotey
    
  2. tester la connexion inverse

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. devrait maintenant être de retour sur lappy

    root@remotey's password: 
    Last login: Wed Aug 21 01:49:10 2013 from remotey
    [user@lappy ~]$ 
    

Les références

slm
la source
existe-t-il un moyen de créer un tunnel de 0.0.0.0:12346 à 127.0.0.1:12345 sur la même machine?
Kokizzu
1
@Kokizzu - J'ai essayé de mettre cela en place et je m'enroule autour de l'essieu sur ce que vous demandez. J'ai trouvé cela qui ressemble à ce que vous voulez, anattatechnologies.com/q/2012/08/chaining-ssh-tunnels . Je vais essayer de m'en occuper plus tard ce soir, n'hésitez pas à jouer avec et dites-moi si vous progressez avec.
slm
ce n'est pas ce que je voulais dire, je veux qu'il se lie à wxyz: vvv2 au lieu de 127.0.0.1 (sur l'ordinateur B), afin que d'autres personnes puissent l'utiliser également ..
Kokizzu
1
@Kokizzu - voir les mises à jour.
slm
2

Étant donné que l'ordinateur B ne peut pas accéder à l'ordinateur A, vous devrez d'abord ouvrir un tunnel distant à partir de l'ordinateur A.

ssh user@computerB -R vvv:localhost:22
Ignacio Vazquez-Abrams
la source
merci, mais existe-t-il un moyen d'ouvrir un port sur l'IP d'eth0 qui a transmis à un service qui a écouté localhost?
Kokizzu
1

peu importe, j'ai trouvé la réponse:

ssh -f -N -R vvv:localhost:22 w.x.y.z

depuis l'ordinateur A

EDIT: TL; DR, solution correcte:

ssh -f -N -R w.x.y.z:vvv:localhost:22 w.x.y.z
Kokizzu
la source