Ce que vous recherchez s'appelle un tunnel inverse. ssh
le fournit via le -R
commutateur:
-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, lappy
et 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 ssh
séparément au système distant remotey
et 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.
se connecter à remotey
[user@lappy ~]$ ssh remotey
tester le port du tunnel inverse
[user@remotey ~]$ ssh -p 12345 localhost
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' lo
interface 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 sshd
les configurations ne vous permettent pas de le faire. En fait, sans cette fonctionnalité activée ( GatewayPorts
), vous ne pourrez lier aucun ssh
port 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 sshd
processus é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!
se connecter à remotey
[user@lappy ~]$ ssh remotey
tester la connexion inverse
[user@remotey ~]$ ssh -p 12345 remotey
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
É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.
la source
peu importe, j'ai trouvé la réponse:
depuis l'ordinateur A
EDIT: TL; DR, solution correcte:
la source