La tunelización de datos a través de SSH es bastante sencilla:
ssh -D9999 [email protected]
configura el puerto 9999 en tu localhost
como un túnel para example.com
, pero tengo una necesidad más específica:
- Estoy trabajando localmente en
localhost
host1
es accesible paralocalhost
host2
solo acepta conexiones dehost1
- Necesito crear un túnel de
localhost
ahost2
Efectivamente, quiero crear un túnel SSH "multi-hop". ¿Cómo puedo hacer esto? Idealmente, me gustaría hacer esto sin necesidad de ser superusuario en ninguna de las máquinas.
host2
niegue el reenvíoRespuestas:
Básicamente tienes tres posibilidades:
Túnel de
localhost
ahost1
:Como se señaló anteriormente, la conexión de
host1
ahost2
no se asegurará.Túnel de
localhost
ahost1
y desdehost1
ahost2
:Esto abrirá un túnel de
localhost
ahost1
y otro túnel dehost1
ahost2
. Sin embargo el puerto9999
ahost2:1234
puede ser utilizado por cualquier persona enhost1
. Esto puede o no ser un problema.Túnel de
localhost
ahost1
y desdelocalhost
ahost2
:Esto abrirá un túnel desde
localhost
ahost1
través del cual el servicio SSHhost2
se puede utilizar. Luego se abre un segundo túnel desdelocalhost
ahost2
través del primer túnel.Normalmente, iría con la opción 1. Si la conexión de
host1
ahost2
necesita ser asegurada, vaya con la opción 2. La opción 3 es principalmente útil para acceder a un servicio alhost2
que solo se puede acceder desdehost2
sí mismo.fuente
-A
opción ssh.-f
, inmediatamente se creará un fondo local, por lo que sessh -f -L 9999:localhost:9999 host1
volverá a conectar si presionó ctrl-c en el primer caso. O agregue-f
al comando doble ssh original cuando lo ejecute en segundo plano todo inmediatamente.Hay una excelente respuesta que explica el uso de la
ProxyCommand
directiva de configuración para SSH :Agregue esto a su
~/.ssh/config
(verman 5 ssh_config
para más detalles):Luego
ssh host2
, se canalizará automáticamentehost1
(también funciona con reenvío X11, etc.).Esto también funciona para una clase completa de hosts, por ejemplo, identificados por dominio:
Actualizar
OpenSSH 7.3 presenta una
ProxyJump
directiva, simplificando el primer ejemplo parafuente
ssh
, incluyendogit
,sftp
etc. afaik.ssh -F /path/to/altconfig
. Tenga en cuenta que esto ignorará todo el sistema/etc/ssh/ssh_config
.OpenSSH v7.3 en adelante admite un
-J
conmutador y unaProxyJump
opción, que permiten uno o más hosts de salto separados por comas, por lo tanto, simplemente puede hacer esto ahora:fuente
Tenemos una puerta de enlace ssh en nuestra red privada. Si estoy afuera y quiero un shell remoto en una máquina dentro de la red privada, tendría que ingresar a la puerta de enlace y de allí a la máquina privada.
Para automatizar este procedimiento, utilizo el siguiente script:
Qué está pasando:
fuente
Después de leer lo anterior y pegar todo, he creado el siguiente script de Perl (guárdelo como mssh en / usr / bin y hágalo ejecutable):
Uso:
Para acceder a HOSTC a través de HOSTA y HOSTB (mismo usuario):
Para acceder a HOSTC a través de HOSTA y HOSTB y usar números de puerto SSH no predeterminados y diferentes usuarios:
Para acceder a HOSTC a través de HOSTA y HOSTB y usar X-forwarding:
Para acceder al puerto 8080 en HOSTC a través de HOSTA y HOSTB:
fuente
mssh HOSTA HOSTD
, terminarás en HOSTB (y tal vez no te des cuenta ...)Esta respuesta es similar a Kynan, ya que implica el uso de ProxyCommand. Pero es más conveniente usar IMO.
Si tiene instalado netcat en sus máquinas de salto, puede agregar este fragmento a su ~ / .ssh / config:
Entonces
Hará lo que le pediste.
Vine aquí buscando el lugar original donde leí este truco. Publicaré un enlace cuando lo encuentre.
fuente
Hice lo que creo que querías hacer con
Se me solicitan ambas contraseñas, luego puedo usar localhost: 9999 para un proxy SOCKS para host2. Es lo más parecido al ejemplo que mostraste en primer lugar.
fuente
Significa enlazar a localhost: 9999 y cualquier paquete enviado a localhost: 9999 lo reenvía a host2: 80
Significa que cualquier paquete recibido por host1: 9999 lo reenvía a localhost: 9999
fuente
channel 3: open failed: administratively prohibited: open failed
mensaje de error.debería poder utilizar el reenvío de puertos para acceder a un servicio
host2
desdelocalhost
. Una buena guía se encuentra aquí . Extracto:En su reparto, reemplace
localhost
en el ejemplo conhost2
yhost
conhost1
.fuente
En esta respuesta voy a pasar por un ejemplo concreto. Solo necesita reemplazar los nombres de host, nombres de usuario y contraseñas de las computadoras por los suyos.
Planteamiento del problema
Supongamos que tenemos la siguiente topología de red:
En aras de la concreción, supongamos que tenemos los siguientes nombres de host, nombres de usuario y contraseñas de las computadoras:
Objetivo: queremos configurar un proxy calcetines que escucha en el puerto
9991
deLocalPC
modo que cada vez que una conexión en laLocalPC
que se inicia desde el puerto9991
pasa pormit.edu
entonceshec.edu
.Ejemplo de caso de uso:
hec.edu
tiene un servidor HTTP al que solo se puede acceder en http://127.0.0.1:8001 , por razones de seguridad. Nos gustaría poder visitar http://127.0.0.1:8001 abriendo un navegador web enLocalPC
.Configuración
En
LocalPC
, agregue~/.ssh/config
:Luego, en la terminal de
LocalPC
, ejecute:Le pedirá la contraseña de
bob
onmit.edu
(es decir,dylan123
), luego le pedirá la contraseña dejohn
onhec.edu
(es decir,doe456
).En ese momento, el proxy SOCKS ahora se está ejecutando en el puerto
9991
deLocalPC
.Por ejemplo, si desea visitar una página web sobre el
LocalPC
uso del proxy SOCKS, puede hacerlo en Firefox:Algunas observaciones:
~/.ssh/config
,HEC
es el nombre de la conexión: puede cambiarlo a lo que desee.-D9991
dicessh
que configure un proxy SOCKS4 en el puerto9991
.fuente
Si puede utilizar SSH en ambas máquinas, eche un vistazo a la directiva ProxyCommand de ssh. Esto te permitirá pasar directamente de localhost a host2 (¡en un comando fácil si usas claves públicas!). Entonces puedes hacer lo que quieras con host2.
http://www.statusq.org/archives/2008/07/03/1916/
fuente
La opción 2 de la mejor respuesta podría usarse con diferentes usuarios de ssh que la actual aka: user @ host
fuente
En mi caso lo hice
donde
host2:8890
se ejecuta en un Jupyter Notebook.Luego configuré Firefox para usarlo
localhost:9999
como host SOCKS.Así que ahora tengo el portátil funcionando
host2
accesible por Firefox enlocalhost:8890
mi máquina.fuente
Las tres opciones mencionadas en la respuesta aceptada no me funcionaron en absoluto. Dado que no tengo mucho permiso sobre ambos hosts, y parece que nuestro equipo DevOps tiene reglas bastante estrictas cuando se trata de autenticación y están haciendo MFA. De alguna manera, los comandos anteriores no pueden funcionar bien con nuestra autenticación.
Sin embargo, el contexto es realmente similar a las respuestas anteriores: no puedo ingresar directamente al servidor de producción, y tengo que hacer 1 salto usando un servidor de salto.
Otra solución más: una ingenua
Terminé haciéndolo de una manera muy ingenua: en lugar de intentar ejecutar todos los comandos en mi computadora portátil, ejecuto los comandos en cada una de las máquinas , como se muestra a continuación:
ssh -v -L 6969:localhost:2222 -N your-protected.dest.server
. Si se le solicita que ingrese una contraseña, escríbala.ssh -v -L 6969:localhost:6969 -N your-jump-server.host.name
. Esto reenviará cualquiera de sus solicitudes en el puerto 6969 de su computadora portátil al servidor de salto. Luego, por turno, como configuramos en nuestro paso anterior, el servidor de salto reenviará nuevamente las solicitudes del puerto 6969 al puerto 2222 en el servidor de destino protegido.Debería ver el comando "se cuelga" allí después de imprimir un mensaje, ¡significa que están funcionando! Una excepción: no debería ver un mensaje de error como
Could not request local forwarding.
, si ve eso, entonces todavía no funciona :(. Ahora puede intentar activar la solicitud en el puerto 6969 desde su computadora portátil y ver si funciona.Con suerte, si eres alguien que falló en todos los métodos anteriores, tal vez puedas probar esto.
fuente