Reemplazar ProxyJump con Bash

Reemplazar ProxyJump con Bash

Hay algunos desarrollos que necesito hacer en alguna caja remota. Afortunadamente, tengo acceso al shell, pero necesito pasar por una puerta de enlace que tenga AllowTcpForwarding configurado en falso.

Eché un vistazo a los documentos y dice:

AllowTcpForwarding Especifica si se permite el reenvío TCP. El valor predeterminado es "sí". Tenga en cuenta que deshabilitar el reenvío TCP no mejora la seguridad a menos que a los usuarios también se les niegue el acceso al shell, ya que siempre pueden instalar sus propios reenviadores.

¿Cómo haría para instalar (o construir) mi propio transportista? Mi objetivo aquí es configurar unintérprete remoto usando Pycharma través de SSH y vinculándolo a algún puerto local, esos datos se alimentan a través de ssh, a través de la puerta de enlace y luego al cuadro de desarrollo donde realmente se ejecuta el código. Me imagino que de alguna manera podría utilizar nc o alguna otra utilidad Unix que me ayude a realizar el trabajo.

Sé que puedo enviar ssh a mi caja remota haciendo:

ssh -t user1@gateway ssh user2@devbox

Pero obviamente esta opción no está disponible en pycharm. Tendré que poder abrir algún puerto local de modo que

ssh -p 12345 localhost
(or variant)

me conectará con user2@devbox. Esto me permitirá configurar el intérprete remoto para usar el puerto para 12345conectarme localhosta la caja remota.

Respuesta1

Mientras uno pueda ejecutarsocatlocalmente y encendido gateway(o incluso solo bashy catencendido gateway, ¡vea el último ejemplo!) y se le permitenouse un pty para tener 8 bits limpios, es posible establecer un túnel a través de ssh. Aquí tienes 4 ejemplos, mejorando el anterior:

Ejemplo básico trabajando una vez

(tener una bifurcación requeriría una conexión ssh por túnel, lo cual no es bueno). Tener que escapar del :for socat para aceptar el comando ejecutivo:

  • termino 1:
    $ socat tcp-listen:12345,reuseaddr exec:'ssh user1@gateway exec socat - tcp\:devbox\:22',nofork
    
  • término2:
    $ ssh -p 12345 user2@localhost
    
  • termino 1:
    user1@gateway's password:
    
  • término2:
    user2@localhost's password: 
    

La inversión de la primera y segunda dirección hace que el socket esté disponible inmediatamente

socattiene que permanecer a cargo, así que no nofork:

  • termino 1:
    $ socat exec:'ssh user1@gateway exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
    user1@gateway's password:
    
  • término2:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

Usando unControlMasterssh

Apermite bifurcar mientras se usa solo una única conexión SSH a la puerta de enlace, brindando así un comportamiento similar al reenvío de puertos habitual:

  • termino 1:
    $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
    user1@gateway's password:
    
  • término2:
    $ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket user1@gateway exec socat - tcp\:devbox\:22'
    
  • término3:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

Teniendo solo bashy catdisponible engateway

Mediante el usobashRedirección TCP incorporaday dos comandos semidúplex cat(para un resultado dúplex completo), uno ni siquiera necesita un control remoto socato netcat. El manejo de múltiples capas de comillas anidadas y escapadas fue un poco complicado y tal vez pueda hacerse mejor o simplificarse mediante el uso de un bashscript remoto. Se debe tener cuidado de bifurcar catúnicamente para la salida:

  • término1 (sin cambios):
    $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
    user1@gateway's password:
    
  • término2:
    $ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket user1@gateway '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
    
  • término3:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

Respuesta2

Reemplazar ProxyJump con Bash

¡La idea anterior es buena! Aquí está mi versión genérica de ssh_config cuandoProxyJumpno está trabajandoporquePermitir reenvío Tcpconfigurado en no y mi shell predeterminado es BASH:

ProxyCommand=ssh -T user1@gateway "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
  • -TDeshabilitar la asignación de pseudoterminales
  • ejecutivoNo 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.
  • %hy%pagserá evaluado por su cliente OpenSSH comocaja de desarrolloy22
  • 2<&-cerrará STDERR (también puede redirigirlo a /dev/null)
  • gato <&3 &leerá el descriptor de archivo seleccionado 3 en segundo plano
  • gato >&3escribiremos nuestro descriptor de archivo en primer plano
  • matar $!matará la "lectura"gato <&3comando que se ejecuta en segundo plano cuando cierra/interrumpe la conexión. De lo contrario, seguiría funcionando.

Podría reemplazar a ProxyJump en situaciones en las que estaba deshabilitado en el servidor de salto, pero realmente no quería reenviar mi clave privada allí ni ingresar ninguna contraseña sin un nivel adicional de cifrado. Usar otros SSH_AUTH_SOCK como root o grabar sesiones de terminal completamente con pulsaciones de teclas son cosas reales.

Pero, por favor, ¡asegúrese siempre de no violar ninguna política que se aplique a usted!

Respuesta3

¡Oh no, casi nos olvidamos de Netcat!

Si hay Netcat (cualquier versión) en su host de salto, puede usarlo en lugar de ProxyJump en su configuración, generalmente como:

ProxyCommand=ssh -T user1@gateway "exec nc %h %p"

O desde la línea de comando:

ssh user2@devbox -oProxyCommand="ssh -T user1@gateway 'exec nc devbox 22'"

Respuesta4

Simplemente configuraría otro sshd para que se ejecute en un puerto diferente.
Edite la configuración para que se permita tcpforwarding.

cp /etc/ssh/sshd{,-second}_config 

Editar sshd-segundo_config

Port 22220
cp /usr/lib/systemd/system/sshd.service  /etc/systemd/system/sshd-second.service

Modifique /etc/systemd/system/sshd- second.service de la siguiente manera:

Description=OpenSSH server second instance daemon
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS

La línea ExecStart puede diferir según la versión.

systemctl daemon-reload
systemctl enable sshd-second.service --now

Puede encontrar más información aquí:
https://access.redhat.com/solutions/1166283

Ahora deberías poder reenviar lo que quieras.

información relacionada