Siempre que se pueda ejecutar socat
localmente y en gateway
(o incluso solo bash
y cat
el gateway
, ¡vea el último ejemplo!) y se le permite no use un pty para estar limpio en 8 bits, es posible establecer un túnel a través de ssh. Aquí hay 4 ejemplos, mejorando el anterior:
Ejemplo básico trabajando una vez
(Tenerlo bifurcado requeriría una conexión ssh por túnel, no es bueno). Tener que escapar del :
para que socat acepte el comando exec:
término1:
$ socat tcp-listen:12345,reuseaddr exec:'ssh [email protected] exec socat - tcp\:devbox\:22',nofork
término2:
$ ssh -p 12345 [email protected]
término1:
[email protected]'s password:
término2:
[email protected]'s password:
Invertir la primera y la segunda dirección hace que el socket esté disponible de inmediato
socat
tiene que permanecer a cargo, así que no nofork
:
término1:
$ socat exec:'ssh [email protected] exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
[email protected]'s password:
término2:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Usando un ControlMaster
ssh
permite bifurcarse usando solo una única conexión ssh a la puerta de enlace, dando así un comportamiento similar al reenvío de puertos habitual:
término1:
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
término2:
$ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket [email protected] exec socat - tcp\:devbox\:22'
término3:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Tener solo bash
y cat
disponible en gateway
Usando bash
redirección tcp integrada y dos semidúplex cat
comandos (para un resultado full-duplex) uno ni siquiera necesita un socat
remoto o netcat
. El manejo de múltiples capas de comillas anidadas y escapadas fue un poco incómodo y tal vez se pueda hacer mejor o simplificar mediante el uso de un bash
remoto. guion. Se debe tener cuidado de tener el cat
bifurcado solo para salida:
term1 (sin cambios):
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket [email protected]
[email protected]'s password:
término2:
$ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket [email protected] '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
término3:
$ ssh -p 12345 [email protected]
[email protected]'s password:
Reemplace ProxyJump con Bash
¡La idea anterior es buena! Esta es mi versión genérica de ssh_config cuando ProxyJump no funciona porque AllowTcpForwarding establecido en no y mi shell predeterminado es BASH:
ProxyCommand=ssh -T [email protected] "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
- -T Deshabilitar asignación de pseudo-terminal
- ejecutivo No se creará ningún proceso nuevo (bash)
3<> es simplemente una redirección a un descriptor de archivo disponible- /dev/tcp/... le pedirá a bash que abra el socket TCP correspondiente.
%h y %p será evaluado por su cliente OpenSSH como devbox y 22- 2<&- cerrará STDERR (también puede redirigirlo a /dev/null)
- gato <&3 & leerá el descriptor de archivo seleccionado 3 en segundo plano
- gato>&3 escribirá nuestro descriptor de archivo en primer plano
- matar a $! matará al "gato lector" gato comando ejecutándose en segundo plano cuando cierra/interrumpe la conexión. De lo contrario, seguiría funcionando.
Podría reemplazar ProxyJump para mí en situaciones en las que estaba deshabilitado en el servidor de salto, pero realmente no quería reenviar mi clave privada allí o ingresar contraseñas sin un nivel adicional de cifrado. Usar otros SSH_AUTH_SOCK como raíz o grabar sesiones de terminal completamente con pulsaciones de teclas son cosas reales.
Pero, por favor, ¡asegúrate siempre de no infringir ninguna política que se aplique a ti!