J'ai un ordinateur avec CentOS (ordinateur A) qui a configuré comme un ip privé 10.150.5.141 (avec un pare-feu restreint), peut accéder à Internet et mon ArchLinux VPS (ordinateur B) avec une réelle ip wxyz
Comment puis-je faire un autre ordinateur (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 est sur le réseau privé de A)?
Je sais qu'un tunnel peut ouvrir des ports locaux à un autre ordinateur: port, mais comment faire le contraire?
Je veux accéder à l'ordinateur A en utilisant ssh
par l'ordinateur B mais l'ordinateur B ne peut pas accéder à l'ordinateur A, parce que le réseau sur l'ordinateur A est ressortingctif (peut sortir, mais ne peut pas entrer, parce que je n'ai pas access à leur routeur)
Je veux quelque chose comme ça:
ssh -connect-to wxyz:22 -open-port vvv -forward-to 10.150.5.141 -port 22
de sorte que lorsque je ssh wxyz:vvv
de l'ordinateur C, il sera transmis au réseau privé 10.150.5.141:22
.
Ce que vous cherchez s'appelle un tunnel inverse. ssh
fournit via le commutateur -R
:
-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 listn 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 a découvert avec leur réponse, la syntaxe est la suivante:
$ ssh -f -N -R vvv:localhost:22 wxyz
J'ai 2 ordinateurs sur le réseau, lappy
et remotey
. Donc, lappy
command suivante sur lappy
:
$ ssh -f -N -R 12345:localhost:22 remotey
Je peux confirmer que ça marche:
$ 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 ssh
séparément vers le système distant, remotey
et exécuter cette command, je peux voir qu'il accepte maintenant les connections 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
Vous pouvez voir que le tunnel ssh inverse fonctionne comme suit.
connection à remotey
[user@lappy ~]$ ssh remotey
tester le port du tunnel inversé
[user@remotey ~]$ ssh -p 12345 localhost
devrait maintenant être de return 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 ~]$
lo
)? Vous risquez de vous égratigner la tête si vous essayez une command comme celle-ci et cela ne semble pas fonctionner, ou il se lie toujours à un port de l'interface localhost ( lo
).
Par exemple:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
REMARQUE: Cette command indique d'ouvrir le port 12345 @ remotey et de tunneler toutes les connections au port 22 @ lappy.
Ensuite, à 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 les configurations de sshd
ne vous permettent pas de le faire. En fait, sans cette fonctionnalité activée ( GatewayPorts
), vous ne pourrez pas lier les ports du tunnel ssh
à quoi que ce soit, à l'exception de localhost.
remotey$ grep GatewayPorts /etc/ssh/sshd_config #GatewayPorts no
Pour l'activer, éditez le file /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 double le vérifier cette fois sur remote:
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 process sshd
écoute maintenant sur l'interface qui a l'adresse IP 192.168.1.3, pour les connections sur le port 12345.
Maintenant, avec notre configuration modifiée lorsque nous testons cette fois. La principale différence est que nous n'avons plus besoin de nous connecter à localhost!
connection à remotey
[user@lappy ~]$ ssh remotey
tester la connection inverse
[user@remotey ~]$ ssh -p 12345 remotey
devrait maintenant être de return sur lappy
root@remotey's password: Last login: Wed Aug 21 01:49:10 2013 from remotey [user@lappy ~]$
Comme l'ordinateur B ne peut pas accéder à l'ordinateur A, vous devez d'abord ouvrir un tunnel distant depuis l'ordinateur A.
ssh user@computerB -R vvv:localhost:22
nevermind, j'ai trouvé la réponse:
ssh -f -N -R vvv:localhost:22 wxyz
de l'ordinateur A
EDIT: TL; DR, solution correcte:
ssh -f -N -R wxyz:vvv:localhost:22 wxyz