
Tengo la siguiente configuración: Me gustaría acceder a la máquina A desde la máquina C, pero ninguna de ellas tiene una dirección IP pública. Sin embargo, la máquina C está en la misma red que la máquina B, que tiene acceso a una IP pública, por lo que puedo acceder a la máquina C desde cualquier lugar ingresando primero a la máquina B y desde allí a la máquina C. No tengo acceso root en la máquina B, mientras que tanto en A como en CI lo hacen. Consulte el siguiente diagrama para mayor claridad:
machine A machine B machine C
no public IP public IP no public IP
root access no root access root access
how to access? '---------------------------'
same network
hence both accessible
Una solución tonta sería hacer que la máquina A husmee regularmente un archivo en la máquina C (mediante el acceso ssh de 2 pasos descrito anteriormente) y cada vez que aparezca un comando en ese archivo, ejecútelo y escriba las salidas a través de ssh en algún lugar de la máquina C. Sin embargo, me pregunto, ¿puede ssh de alguna manera "invertir" la conexión, de modo que la máquina A se conecte en 2 pasos a la máquina C, y luego la conexión se "invierte" de modo que la máquina C realmente tenga el shell remoto de la máquina A? Y si es así, ¿cómo lo hago?
Respuesta1
Es posible que tengas que machineA
abrir un túnel SSH hacia machineB
, con una opción de reenvío remoto, lo que te permitiría ingresar por SSH machineA
desde machineB
.
Si tiene acceso root activado machineB
, configure la GatewayPorts
opción de configuración en yes
in /etc/ssh/sshd_config
y luego emita este comando en machineA
:
ssh -N -R 0.0.0.0:2222:127.0.0.1:22 the_public_ip_of_machine_B
Esto abrirá el puerto 2222 en machineB
, y reenviará cualquier tráfico en ese puerto hacia sí mismo, al puerto 22. Tenga en cuenta que esto escuchará en todas las interfaces, incluida la pública, por lo que es posible que desee proteger el puerto número 2222 (pero probablemente tenga un firewall activado machineB
de todos modos). Mientras este túnel esté activo, puede conectarse mediante SSH machineB
al puerto 2222, y esto lo llevará a machineA
. Dado que machineB
y machineC
están en la misma subred, puede iniciar sesión machineA
en machineC
un solo paso.
Si no tiene acceso root en machineB
, entonces el proceso es el mismo, con la excepción de la dirección de escucha. Si GatewayPorts
se establece en no
(que es el valor predeterminado), entonces el primer argumento ( 0.0.0.0
) simplemente se ignorará y la dirección de escucha estará vinculada a 127.0.0.1
. En este caso, aún puede usar el comando anterior y el reenvío funcionará igual, pero el puerto abierto no estará disponible desde ningún otro lugar que no sea machineB
. Por lo tanto, debe ingresar SSH machineB
y luego SSH al localhost
puerto 2222, que lo llevará a machineA
.
Sin embargo, es posible que desees considerar el uso de algo más sólido, como una VPN.