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 12345
conectarme localhost
a la caja remota.
Respuesta1
Mientras uno pueda ejecutarsocat
localmente y encendido gateway
(o incluso solo bash
y cat
encendido 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
socat
tiene 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 unControlMaster
ssh
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 bash
y cat
disponible engateway
Mediante el usobash
Redirección TCP incorporaday dos comandos semidúplex cat
(para un resultado dúplex completo), uno ni siquiera necesita un control remoto socat
o 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 bash
script 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.