Túnel de calcetines reverso SSH

26

ssh -D puede hacer un puerto de calcetines en la máquina local, que pasa el tráfico al control remoto y luego a otros lugares.

ssh -L port:host:hostport, escuche el puerto en la máquina local, pase el tráfico a "host: hostport" desde el punto de vista de la máquina remota.

ssh -R port:host:hostportes la contraparte de ssh -L, que escucha el puerto en la máquina remota, y pasa el tráfico a "host: hostport" desde el punto de vista de la máquina local.

Pero, ¿cuál es la contrapartida de ssh -D, es decir, cómo abrir un puerto de calcetines en una máquina remota, que pasará el tráfico al local y luego a otros lugares?

Baya
fuente
1
la pregunta pierde valor porque aceptó una respuesta que no funciona y no puede funcionar. Esto (que el respondedor mencionó en el comentario) lo hace stackoverflow.com/questions/842021/…
barlop

Respuestas:

12

Con -D& -Ltiene una manera de comunicarse de cualquier manera entre las dos máquinas.

Asi que...

  • Desde la máquina local, use -Rpara crear un puerto de escucha en la máquina remota que apunte al sshd de la máquina local.
  • Úselo -Den la máquina remota, apuntando al puerto que creó anteriormente.

"Creo" que completar el siguiente hará que funcione ...

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

' remotehost', ' remoteport' & ' localport' en lo anterior necesitan ser cambiados. Se formará un proxy de calcetines en 9050.

Caro
fuente
Oh, parece que esto se preguntó en SO: stackoverflow.com/questions/842021/… La única respuesta es la misma idea. Estoy seguro de que uno funcionará ;-) EDITAR - sí, ese era más correcto que el mío. He arreglado el mío.
Caro
En realidad, utilicé este método indirecto en mi propia situación. Pero en la situación de mi amigo, él no tenía el privilegio de root, por lo que no puede tener el servicio sshd, solo tiene el cliente OpenSSH. Así que quiero descubrir que existe un método directo, pero OpenSSH parece que no ... Gracias de todos modos
Berry
1
@barlop y eso no funcionará porque digamos que ejecuta el ejecutable ssh desde 10.0.0.10 el -R dice que reenvíe a 10.0.0.10:9050 Pero el servidor SOCKS se ejecuta en 10.0.0.5
barlop
1
@PriceChild ¿realmente probaste tu comando?
barlop
55
-1 No te molestaste en probarlo y tu comando está completamente equivocado. Intentaste hacerlo como la otra respuesta SO pero no lo hiciste. SSHing de A a B, el que enlazas tiene ssh -D escucha en A. Tu tiene escucha en B. Tu está equivocado. Tiene el proxy SOCKS escuchando en el lado que está escuchando.
barlop
14

Se puede lograr de forma transparente con este fragmento en ~ / .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

Detalles

Queremos un DynamicForward inverso. Esto se logra usando dos comandos ssh:

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

De esta manera, el objetivo tiene un túnel SOCKS para el cliente SSH.

Lo que hice fue usar la forma clásica de encadenar ssh para alcanzar un objetivo remoto a través de hosts intermedios, de modo que la creación del túnel SOCKS se maneje de manera transparente al iniciar sesión en el objetivo. El primer truco ProxyCommand + nc es obligatorio porque -W implica ClearAllForwardings.

usuario305311
fuente
1
Esto vale una medalla de oro.
Dakatine
¿Podría proporcionar una explicación más detallada de lo que hacen sus comandos?
Alonso s
3

No hay ninguna facilidad para proporcionar un túnel de calcetines inversos con OpenSSH, por lo que debe ejecutar el comando ssh que proporciona el proxy de calcetines en la máquina "remota".

Si la máquina remota no puede ingresar en la máquina local, cree primero una conexión ssh de local a remota que reenvíe el puerto 22 a, por ejemplo, 2222. Luego, la máquina remota puede ingresar a la máquina local en el puerto 2222.

Thorbjørn Ravn Andersen
fuente
2
local$ ssh -R 1080 remote
remote$ curl --socks5 localhost https://example.com

desde OpenSSH 7.6

ssh (1): agrega soporte para reenvío dinámico inverso. En este modo, ssh actuará como un proxy SOCKS4 / 5 y reenviará las conexiones a los destinos solicitados por el cliente SOCKS remoto. Este modo se solicita utilizando la sintaxis extendida para las opciones -R y RemoteForward y, dado que se implementa únicamente en el cliente, no requiere que se actualice el servidor para ser compatible.

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

zmx
fuente
¿Puede proporcionar una referencia para esto?
Scott
Por cierto, hay un error en openssh-client 8.0 en el que no puede elegir una dirección de enlace con el puerto ( ssh -R 127.0.0.3:1080 remote), actualmente puede vincular un proxy SOCKS inverso solo a un puerto.
Adam Katz