Tunnel chaussettes inversées SSH


26

ssh -D peut créer un port de chaussettes sur la machine locale, qui transmet le trafic à la télécommande, puis à d'autres endroits.

ssh -L port:host:hostport, écouter le port sur la machine locale, transmettre le trafic à "host: hostport" du point de vue de la machine distante.

ssh -R port:host:hostportest la contrepartie de ssh -L, qui écoute le port sur la machine distante et transmet le trafic à "host: hostport" du point de vue de la machine locale.

Mais quelle est la contrepartie de ssh -D, c'est-à-dire, comment ouvrir un port de chaussettes sur une machine distante, qui passera le trafic au local, puis à d'autres endroits?


1
la question perd de sa valeur car vous avez accepté une réponse qui ne fonctionne pas et ne peut pas fonctionner. Cela (que le répondeur a mentionné dans le commentaire) le fait
via

Réponses:


12

Avec -D& -Lvous avez un moyen de communiquer dans les deux cas entre les deux machines.

Alors...

  • À partir de la machine locale, utilisez -Rpour créer un port d'écoute sur la machine distante pointé vers le sshd de la machine locale.
  • Utilisez -Dsur la machine distante, dirigée vers le port que vous avez créé ci-dessus.

Je "pense" que le fait de remplir ce qui suit le fera fonctionner ...

ssh remotehost -R remoteport:localhost:localport "ssh -D 9050 localhost -p remoteport"

' remotehost', ' remoteport' et ' localport' dans les points ci-dessus doivent être modifiés. Un proxy de chaussettes sera formé sur 9050.


Oh, on dirait que cela a été demandé sur SO: stackoverflow.com/questions/842021/… La seule réponse est la même idée. Je suis sûr que l'un fonctionnera ;-) EDIT - oui, celui-là avait plus raison que le mien. J'ai rafistolé le mien.
Cher

En fait, j'ai utilisé cette méthode indirecte dans ma propre situation. Mais dans la situation de mon ami, il n'avait pas le privilège root, donc il ne peut pas avoir de service sshd, il n'a que le client OpenSSH. Je veux donc comprendre qu'il existe une méthode directe, mais OpenSSH ne semble pas ... Merci la même chose
Berry

1
@barlop et cela ne fonctionnera pas car disons que vous exécutez l'exécutable ssh du 10.0.0.10, le -R dit de le transférer au 10.0.0.10:9050 Mais le serveur SOCKS fonctionne le 10.0.0.5
barlop

1
@PriceChild avez-vous réellement testé votre commande?
barlop

5
-1 Vous n'avez pas pris la peine de le tester et votre commande est complètement fausse. Vous avez essayé de faire comme l'autre réponse SO mais vous avez échoué. SSHing de A à B, celui que vous liez a ssh -D écouter sur A. Votre celui-ci l'écouter sur B. Votre celui est erroné. Le proxy SOCKS écoute du côté qui écoute.
barlop

14

Peut être réalisé de manière transparente avec cet extrait dans ~ / .ssh / config:

Host sockstunnel
    ProxyCommand ssh -D 3128 localhost nc -q 1 localhost 22

Host target
    RemoteForward 3128 localhost:3128
    ProxyCommand ssh -W target:22 sockstunnel

Détails

Nous voulons un DynamicForward inversé. Ceci est réalisé en utilisant deux commandes ssh:

  • ssh -D 3128 localhost
  • ssh -R 3128:localhost:3128 target

De cette façon, la cible dispose d'un tunnel SOCKS vers le client SSH.

Ce que j'ai fait, c'est d'utiliser la manière classique de chaîner ssh pour atteindre une cible distante via des hôtes intermédiaires afin que la création du tunnel SOCKS soit gérée de manière transparente lors de la connexion à la cible. La première astuce ProxyCommand + nc est obligatoire car -W implique ClearAllForwardings.


1
cela vaut une médaille d'or.
Dakatine

Pourriez-vous fournir une explication plus détaillée de ce que font vos commandes?
alonso s

3

Il n'y a aucune possibilité de fournir un tunnel inverse de chaussettes avec OpenSSH, vous devez donc exécuter la commande ssh fournissant le proxy de chaussettes sur la machine "distante".

Si la machine distante ne peut pas ssh dans la machine locale, créez d'abord une connexion ssh de local à distant qui transfère le port 22 à par exemple 2222. Ensuite, la machine distante peut ssh dans la machine locale sur le port 2222.


2
local$ ssh -R 1080 remote
remote$ curl --socks5 localhost https://example.com

depuis OpenSSH 7.6

ssh (1): ajoute la prise en charge du transfert dynamique inverse. Dans ce mode, ssh agira comme un proxy SOCKS4 / 5 et transmettra les connexions aux destinations demandées par le client SOCKS distant. Ce mode est demandé à l'aide de la syntaxe étendue pour les options -R et RemoteForward et, parce qu'il est implémenté uniquement sur le client, ne nécessite pas la mise à jour du serveur pour être pris en charge.

https://www.openssh.com/txt/release-7.6


Pouvez-vous fournir une référence pour cela?
Scott

Soit dit en passant, il y a un bogue dans openssh-client 8.0 dans lequel vous ne pouvez pas choisir une adresse de liaison avec le port ( ssh -R 127.0.0.3:1080 remote), vous pouvez actuellement lier un proxy SOCKS inversé uniquement à un port.
Adam Katz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.