SSH
Introducción histórica
En los primeros días de internet se creo el protocolo telnet
para poder comunicar varios ordenadores, pero tenía el problema de que no estaba cifrado, por lo que cualquiera que se metiera en medio podía leer la comunicación sin problema, por eso se creó SSH
(Secure Shell)
Cifrado de SSH
El sistema de cifrado de SSH
funciona mediante el sistema de clave pública y clave privada, de manera que si se encripta la comunicación con una de las dos claves, solo puede ser descifrada por la otra clave
¿Y por qué hay una clave pública y una clave privada? La clave pública es la que le das a todo el mundo y la clave privada es la que solo tienes que poseer tú.
De manera que si te quieres comunicar con otro equipo por SSH
, primero le das tu clave pública, a continuación encriptas el mensaje con tu clave privada y solo se puede desencriptar el mensaje con la clave pública que le has dado al otro equipo
De la misma manera ocurre a la inversa, si el otro equipo te quiere mandar un mensaje, lo encripta con tu clave pública y solo se puede desencriptar con la clave privada que solo tú posees
Requerimentos SSH
Servicio SSH
Para poder usar SSH
necesitas tener un servicio de SSH
. En Linux
normalmete ya viene instalado, pero si no es así lo puedes instalar mediante
!apt install openssh-server
Durante el proceso de instalación te pedirá tu ubicación para ajustar el time zone
A continuación levantamos el servicio
!apt install openssh-server!systemctl enable ssh
Cliente SSH
Una vez tienes el servicio necesitas un cliente, aunque en Linux
suele venir instalado, pero si no es así lo puedes instalar mediante
!apt install openssh-server!systemctl enable ssh!apt install openssh-client
Conexión por SSH
Para conectarte por SSH
necesitas introducir el comando ssh <user>@<ip>
!apt install openssh-server!systemctl enable ssh!apt install openssh-client!ssh root@172.17.0.1
The authenticity of host '172.17.0.1 (172.17.0.1)' can't be established.ECDSA key fingerprint is SHA256:M+qsqSC4HiYztm1ij8iDkh9KHJz+pxrTm9GTZIf2N9k.Are you sure you want to continue connecting (yes/no/[fingerprint])?
Como puedes ver, la primera vez te pregunta si quieres guardar el fingerprint
, esto es para que si la próxima vez que te conectes a la misma máquina (a la misma clave pública) si ha cambiado el fingerprint
debes tener cuidado porque puede haber algo peligroso, como que hagan pasarse por esa máquina.
Si nos fiamos introducimos yes
!ssh root@172.17.0.1
The authenticity of host '172.17.0.1 (172.17.0.1)' can't be established.ECDSA key fingerprint is SHA256:M+qsqSC4HiYztm1ij8iDkh9KHJz+pxrTm9GTZIf2N9k.Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added '172.17.0.1' (ECDSA) to the list of known hosts.root@172.17.0.1's password:
A continuación, la máquina a la que nos conectamos nos pide la contraseña, la introducimos y ya estaremos dentro de la máquina
!ssh root@172.17.0.1
The authenticity of host '172.17.0.1 (172.17.0.1)' can't be established.ECDSA key fingerprint is SHA256:M+qsqSC4HiYztm1ij8iDkh9KHJz+pxrTm9GTZIf2N9k.Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added '172.17.0.1' (ECDSA) to the list of known hosts.root@172.17.0.1's password:Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-58-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantage1 device has a firmware upgrade available.Run `fwupdmgr get-upgrades` for more information.* Introducing Expanded Security Maintenance for Applications.Receive updates to over 25,000 software packages with yourUbuntu Pro subscription. Free for personal use.https://ubuntu.com/proSe pueden aplicar 0 actualizaciones de forma inmediata.Your Hardware Enablement Stack (HWE) is supported until April 2025.Last login: Thu Dec 1 16:32:23 2022 from 127.0.0.1root@172.17.0.1:~$
Conexión sin necesidad de contraseña
Como hemos visto cuando nos conectamos nos pide la contraseña de la máquina de destino, pero si es una máquina a la que nos vamos a conectar mucho podemos hacer que no nos pida la contraseña cada vez que nos queramos conectar
Para ellos, en primer lugar generamos una clave ssh
mediante ssh-keygen
!ssh-keygen
Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa):Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /root/.ssh/id_rsaYour public key has been saved in /root/.ssh/id_rsa.pubThe key fingerprint is:SHA256:4HxRXkVkcK5kNXNyzakfQ6t8a24wRGCUYz4s5KL5ZEc root@e108f6f395b3The key's randomart image is:+---[RSA 3072]----+| o+==@.=|| +.= * Oo|| . + = = + .|| o o E * + + || = S . = o o|| o + . = o || + . + .|| . + || +. |+----[SHA256]-----+
Como vemos, primero nos pregunta dónde queremos guardar la clave, si no introducimos nada nos la guarda en la ruta por defecto. Y a continuación una frase para generar la clave, si escribes una frase debes recordarla siempre. Además si escribes una frase, te la pédirá cada vez que intentes acceder a la clave, por lo que cada vez que queramos acceder a la máquina por medio de SSH
, no nos pedirá la contraseña de la máquina, pero sí esta frase. Por lo que tu eliges si no introduces una frase para que nunca te la pida, o si sí la introduces y siempre las vas a meter.
A continuación le pedimos a la máquina remota que se guarde nuestra clave mediante ssh-copy-id <user>@<id>:
!ssh-copy-id root@172.17.0.1:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysroot@172.17.0.1's password:Number of key(s) added: 1Now try logging into the machine, with: "ssh 'root@172.17.0.1'"and check to make sure that only the key(s) you wanted were added.root@103b6040196a:/# ssh root@172.17.0.1Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-58-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantage4 devices have a firmware upgrade available.Run `fwupdmgr get-upgrades` for more information.58 updates can be applied immediately.41 of these updates are standard security updates.To see these additional updates run: apt list --upgradableNew release '22.04.1 LTS' available.Run 'do-release-upgrade' to upgrade to it.Your Hardware Enablement Stack (HWE) is supported until April 2025.Last login: Thu Feb 2 08:05:48 2023 from 172.17.0.2(base) root@172.17.0.1:~$
Usar la terminal remota por SSH
A lo mejor no nos hace falta tener que meternos a la máquina remota porque solo necesitamos ejecutar un solo comando, por lo que podemos usar remotamente su terminal añadiendo el flag -t
al comando SSH
, es decir, mediante ssh -t <user>@<id> <command>
!ssh -t root@172.17.0.1 ping -c 4 google.com
PING google.com (172.217.168.174) 56(84) bytes of data.64 bytes from mad07s10-in-f14.1e100.net (172.217.168.174): icmp_seq=1 ttl=111 time=2.94 ms64 bytes from mad07s10-in-f14.1e100.net (172.217.168.174): icmp_seq=2 ttl=111 time=2.55 ms64 bytes from mad07s10-in-f14.1e100.net (172.217.168.174): icmp_seq=3 ttl=111 time=2.78 ms64 bytes from mad07s10-in-f14.1e100.net (172.217.168.174): icmp_seq=4 ttl=111 time=2.69 ms--- google.com ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3005msrtt min/avg/max/mdev = 2.550/2.739/2.940/0.142 msConnection to 172.17.0.1 closed.
Como se puede ver se realiza el comando en la máquina remota y cuando termina, en la última línea nos dice que se cierra la conexión
Proxy SSH
Si estás navegando en un lugar no muy seguro, o en un lugar que tiene un proxy que no te deja acceder a algunos puertos, puedes navegar a través del proxy de otra máquina meidante SSH
, esto se puede hacer añadiendo el flag -D
y el puerto por el que quieres realizar la conexión al proxy remoto, como el puerto para el tcp/ip
es el 9999
el comando podría quedar como ssh -D 9999 <user>@<id>
Para que esto se vea mejor, antes de ejecutarlo obtengo mi IP píbluca
!curl ifconfig.me
188.127.184.59
Ahora utilizo el proxy de un servidor web que tengo levantado
!ssh -D 9999 root@194.62.99.222
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantageSystem information as of Wed Feb 22 06:08:51 AM UTC 2023System load: 0.02978515625Usage of /: 11.7% of 24.53GBMemory usage: 33%Swap usage: 0%Processes: 89Users logged in: 0IPv4 address for eth0: 194.62.99.222IPv4 address for eth1: 10.7.0.168IPv6 address for eth2: 2a04:3542:8000:1000:d48a:cbff:fefb:5b10 updates can be applied immediately.The list of available updates is more than a week old.To check for new updates run: sudo apt updateLast login: Wed Feb 22 06:02:35 2023 from 188.127.184.59root@server1:~#
Cambio la configuración proxy de mi ordenador
Ahora vuelvo a mirar mi IP pública, pero cogiendo el proxy recientemente configurado
!curl -x socks5h://localhost:9999 ifconfig.me
194.62.99.222
Vemos que obtenemos la IP pública del servidor
Interfaz gráfica remota por SSH
En linux la interfaz gŕafica es un servidor, por lo que nos podemos beneficiar de ello y podemos ejecutar programas con interfaces gráficas que están en una máquina remota por SSH
, para ello hay que usar el flag -X
. El comando quedaría ssh -X <user>@<id>
Primero entro a mi servidor e instalo xeyes
mediante sudo apt install x11-apps
y después lo ejecuto remotamente desde mi ordenador
!ssh -X root@194.62.99.222
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)Last login: Wed Feb 22 06:39:52 2023 from 188.127.184.59/usr/bin/xauth: file /root/.Xauthority does not existroot@server1:~sudo apt install x11-appsroot@server1:~#xeyes
Ahora en mi ordenador se abre la ventana de xeyes
pero no se está ejecutando en mi ordenador
Tunel SSH
Como he comentado, he levantado un servidor al que tengo acceso por ssh
!ssh root@194.62.99.222
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)Last login: Wed Feb 22 06:40:58 2023 from 188.127.184.59root@server1:~#
Y levanto también un segundo servidor desde el que tengo acceso desde el server1
, pero no tengo acceso desde mi ordenador
A continuación intento acceder al server2
desde mi ordenador y vemos que no puedo
!ssh root@194.62.99.235
ssh: connect to host 194.62.99.235 port 22: Connection timed out
Y a continuación intento acceder al server2
desde el server1
y vemos que sí puedo
!root@server1:~# ssh root@10.7.2.228
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)Last login: Wed Feb 22 06:59:01 2023 from 10.7.0.168root@server2:~#
Así que lo que creamos es un tunel desde mi ordenador hasta el server2
a través del server1
, para ello usamos el flag -L
. Para crear el tunel hay que indicar el puerto de tu ordenador en el que vas a crear el tunel, a continuación la IP
de destino del tunel, el puerto por el que irá el tunel y por último el disposicivo que creará el tunel. Quedaría así
ssh -L <HOST PORT>:<DEST IP>:<TUNNEL PORT> <TUNNEL CREATOR USER>@<TUNNEL CREATOR IP>
Veámoslo con mi ejemplo, tengo el server1
con una IP
pública que podemos llamar ip_pub1
y al que tengo acceso por SSH
y una IP
privada que podemos llamar ip_priv1
que está dentro de la misma red que server2
. Y tengo el server2
con una IP
pública que podemos llamar ip_pub2
a la que no tengo acceso por SSH
y una IP
que podemos llamar ip_priv2
dentro de la misma red de server1
Primero creo el tunel
ssh -L host_port:ip_priv2:22 root@ip_pub1
He creado un tunel hasta la IP
privada del server2
a través de la IP
pública del server1
Por último, para conectarme al server2
lo hago a través del localhost
y del puerto del host que he declarado en el tunel
ssh -p 2020 root@localhost
Vamos a verlo en la realidad, las IP
s de mis servidores son
server1
:IP
pública:194.62.99.222
IP
privada:10.7.0.168
server2
:IP
pública:194.62.99.235
IP
privada:10.7.2.228
Primero creo el tunel
!ssh -L 2020:10.7.2.228:22 root@194.62.99.222
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantageSystem information as of Wed Feb 22 11:13:39 AM UTC 2023System load: 0.0Usage of /: 13.3% of 24.53GBMemory usage: 36%Swap usage: 0%Processes: 91Users logged in: 1IPv4 address for eth0: 194.62.99.222IPv4 address for eth1: 10.7.0.168IPv6 address for eth2: 2a04:3542:8000:1000:d48a:cbff:fefb:5b1101 updates can be applied immediately.60 of these updates are standard security updates.To see these additional updates run: apt list --upgradableLast login: Wed Feb 22 09:29:52 2023 from 188.127.184.59]0;root@server1: ~root@server1:~# ^C]0;root@server1: ~root@server1:~#
Con el tunel creado ya me puedo conectar al server2
desde mi ordenador
!ssh -p 2020 root@localhost
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantageSystem information as of Wed Feb 22 11:14:15 AM UTC 2023System load: 0.0Usage of /: 13.3% of 24.53GBMemory usage: 33%Swap usage: 0%Processes: 90Users logged in: 0IPv4 address for eth0: 194.62.99.235IPv4 address for eth1: 10.7.2.228IPv6 address for eth2: 2a04:3542:8000:1000:d48a:cbff:fefb:7f47* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8sjust raised the bar for easy, resilient and secure K8s cluster deployment.https://ubuntu.com/engage/secure-kubernetes-at-the-edge101 updates can be applied immediately.60 of these updates are standard security updates.To see these additional updates run: apt list --upgradableLast login: Wed Feb 22 11:14:16 2023 from 10.7.0.168]0;root@server2: ~root@server2:~# ^C]0;root@server2: ~root@server2:~#
Conexión reversa
Volvamos a suponer que me quiero conectar al server2
, pero ahora no puedo hacer, por la razón que sea, un tunel desde el server1
. Lo que podemos hacer es crear una conexión reversa desde otro servidor.
Supongamos que tengo un tercer servidor, llamado server3
, al que se tiene acceso por SSH
desde cualquier lado, es decir, tanto yo desde mi ordenador, como el server2
tienen acceso. Por lo que si podemos acceder físicamente al server2
se puede hacer una conexión reversa desde el server2
al server3
ssh -R <server3port>:localhost:22 root@<IPserver3>
Con esto, lo que he hecho es habilitar una conexión desde el server3
al server2
(cosa que antes no se podía), a través del localhost
y puerto server3port
del server3
Ahora desde mi ordenador me puedo conectar al server3
y desde el server3
nos podemos conectar al server2
mediante
ssh -p <server3port> root@localhost
Veámoslo con los datos de mis servidores
server2
:IP
pública:194.62.99.235
server3
:IP
pública:194.62.96.236
Primero hago la conexión reversa desde el server2
al server3
!root@server2:~# ssh -R 2020:localhost:22 root@194.62.96.236
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)Last login: Wed Feb 22 15:25:58 2023 from 188.127.184.59root@server3:~#
Ahora me conecto al server3
!ssh root@194.62.96.236
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)Last login: Wed Feb 22 15:12:19 2023 from 188.127.184.59root@server3:~#
Y ahora que estoy en el server3
me conecto al server2
!root@server3:~# ssh -p 2020 root@localhost
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)Last login: Wed Feb 22 15:12:07 2023 from 188.127.184.59root@server2:~#
Conseguido! A través de mi ordenador no puedo conectarme directamente al server2
, pero al conectarme al server3
he podido acceder al server2
gracias a la conexión inversa que había hecho del server2
al server3
Jump
Por último, otra manera de entrar al server2
es entrando al server1
y a continuación, desde el server1
entrar al server2
. Pero esto es un poco engorroso, porque primero hay que hacer una conexión SSH
al server1
y luego otra al server2
, así que para hacerlo todo de una podemos usar el flag -J
(jump
), es decir, quedaría ssh -J server1 server2
Resumem, primero haríamos ssh root@194.62.99.222
y luego ssh root@10.7.2.228
(ya que dentro de server1
nos conectamos a server2
mediante la IP
privada).
Así que podríamos hacer todo de una haciendo ssh -J root@194.62.99.222 root@10.7.2.228
Vamos a probar
!ssh -J root@194.62.99.222 root@10.7.2.228
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 06:46:11 2023 from 10.7.0.168root@server2:~#
Hemos podido hacer los saltos!
Archivo de configuración SSH
del usuario
Dispositivos con Alias
En todo ordenador hay un archivo de configuración para el SSH
que suele estar en la carpeta del usuario
!cat ~/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 192.168.1.138HostName 192.168.1.138User maximo.fernandez
En este archivo tengo guardados el usuario e ip de algunos dispositivos a los que me suelo conectar y así no tengo que rellenar todo yo. Veamoslo con los servidores que tengo
Mi servidor server1
tiene el usuario root
y la IP 194.62.99.222
, por lo que lo añado a la lista
!echo "Host server1 HostName 194.62.99.222 User root" >> ~/.ssh/config
Volvemos a ver cómo ha quedado el archivo de configuración
!echo "Host server1 HostName 194.62.99.222 User root" >> ~/.ssh/config!cat ~/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 192.168.1.138HostName 192.168.1.138User maximo.fernandezHost server1HostName 194.62.99.222User root
Ahora que lo hemos añadido para conectarnos al server1
ya solo nos hace falta hacer ssh server1
!ssh server1
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 05:18:59 2023 from 188.127.184.59root@server1:~#
Proxy
Como ya vimos, añadiendo el flag -D <port>
podiamos cambiar la proxy. Para dejar esto guardado en el archivo de configuración solo tenemos que añadir la línea DynamicForward <port>
al host que estamos guardando
Repitiendo el ejemplo anterior en el que usamos el server1
como un proxy del puerto tcp/ip
(9999
), en el archivo de configuración quedaría así
Host proxyServer1
HostName 194.62.99.222
User root
DynamicForward 9999
Lo añadimos
!echo "Host proxyServer1 HostName 194.62.99.222 User root DynamicForward 9999" >> ~/.ssh/config
Veamos cómo queda el archivo de configuración
!echo "Host proxyServer1 HostName 194.62.99.222 User root DynamicForward 9999" >> ~/.ssh/config!cat ~/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 192.168.1.138HostName 192.168.1.138User maximo.fernandezHost server1HostName 194.62.99.222User rootHost proxyServer1HostName 194.62.99.222User rootDynamicForward 9999
Obtengo mi IP
pública
!curl ifconfig.me
188.127.184.59
Me conecto al servidor proxy
!ssh proxyServer1
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 05:42:32 2023 from 188.127.184.59root@server1:~#
Cambio la configuración proxy de mi ordenador
Vuelvo a ver mi IP
pública, pero cogiendo el proxy recientemente configurado
!curl -x socks5h://localhost:9999 ifconfig.me
194.62.99.222
Vemos que obtenemos la IP pública del servidor
Tunel SSH
Si como antes quiero crear un tunel hasta el server2
a través del server1
, antes teníamos que hacer ssh <HOST PORT>:<DEST IP>:<TUNNEL PORT> <TUNNEL CREATOR USER>@<TUNNEL CREATOR IP>
, ahora tenemos que añadir la línea
LocalForward <localhost>:<HOST PORT> <DEST IP>:<TUNNEL PORT>
Es decir, el archivo de configuarción quedaría
Host tunelToServer2
HostName 194.62.99.222
User root
LocalForward 127.0.0.1:2020 10.7.2.228:22
Pero como así no se entiende muy bien veamoslo con algo concreto
server1
:IP
pública:194.62.99.222
IP
privada:10.7.0.168
server2
:IP
pública:194.62.99.235
IP
privada:10.7.2.228
Antes el comando era
ssh -L 2020:10.7.2.228:22 root@194.62.99.222
De modo que el archivo de configuración tiene que quedar
Host tunelToServer2
HostName 194.62.99.222
User root
LocalForward 127.0.0.1:2020 10.7.2.228:22
Veamos si funciona
Añadimos la nueva configuración
!echo "Host tunelToServer2 HostName 194.62.99.222 User root LocalForward 127.0.0.1:2020 10.7.2.228:22" >> ~/.ssh/config
Veamos cómo ha quedado el archivo de configuración
!echo "Host tunelToServer2 HostName 194.62.99.222 User root LocalForward 127.0.0.1:2020 10.7.2.228:22" >> ~/.ssh/config!cat ~/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 192.168.1.138HostName 192.168.1.138User maximo.fernandezHost server1HostName 194.62.99.222User rootHost proxyServer1HostName 194.62.99.222User rootDynamicForward 9999Host tunelToServer2HostName 194.62.99.222User rootLocalForward 127.0.0.1:2020 10.7.2.228:22
Creamos el tunel
!ssh tunelToServer2
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 06:02:20 2023 from 188.127.184.59root@server1:~#
Ahora intentamos conectarnos al server2
desde mi ordenador
!ssh -p 2020 root@localhost
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 06:02:36 2023 from 10.7.0.168root@server2:~#
Conseguido! Pero podemos dejarlo un poco más limpio todo, podemos añadir esta última conexión al archivo de configuración
!echo "Host server2ByTunel HostName localhost User root Port 2020" >> ~/.ssh/config
Veamos cómo queda el archivo de configuración
!echo "Host server2ByTunel HostName localhost User root Port 2020" >> ~/.ssh/config!cat ~/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 192.168.1.138HostName 192.168.1.138User maximo.fernandezHost server1HostName 194.62.99.222User rootHost proxyServer1HostName 194.62.99.222User rootDynamicForward 9999Host tunelToServer2HostName 194.62.99.222User rootLocalForward 127.0.0.1:2020 10.7.2.228:22Host server2ByTunelHostName localhostUser rootPort 2020
Ahora nos volvemos a conectar al server2
desde mi ordenador, a través del tunel, pero con la última configuración que acabamos de guardar
!ssh server2ByTunel
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 06:13:33 2023 from 10.7.0.168root@server2:~#
En resumen, con todo lo que hemos hecho, podemos crear el tunel hasta el server2
con el comando ssh tunelToServer2
y a continuación conectarnos al server2
con el comando ssh server2ByTunel
Impresionante!
Conexión reversa
Recordamos que ahora nuestro problema era que no nos podíamos conectar al server2
a través del tunel del server1
. De modo que creando una conexión reversa desde el server2
(tenemos alguien en el server2
que puede hacer esa conexión reversa, o lo dejamos hecho nosotros antes de irnos) hasta un server3
, desde mi ordenador me puedo conectar al server3
y a continuación conectarme al server2
Primero tenemos que hacer la conexión reversa desde el server2
al server3
. Esto lo podíamos hacer mediante un comando
ssh -R <server3port>:localhost:22 root@<IPserver3>
O guardar la conexión en el archivo de configuración añadiendo
Host reverseToServer3
HostName <IPserver3>
User root
RemoteForward <server3port> localhost:22
Y hacer la conexión reversa mediante
ssh reverseToServer3
Como así no se entiende bien, veámoslo con datos concretos
server2
:IP
pública:194.62.99.235
server3
:IP
pública:194.62.96.236
Para hacer la conexión reversa habría que usar el comando
ssh -R 2020:localhost:22 root@194.62.96.236
O guardar la siguiente configuración
Host reverseToServer3
HostName 194.62.96.236
User root
RemoteForward 2020 localhost:22
Y conectarse mediante
ssh reverseToServer3
De modo que guardo la configuración en el server 2 y hago la conexión
!root@server2:~# echo "Host reverseToServer3 HostName 194.62.96.236 User root RemoteForward 2020 localhost:22" >> ~/.ssh/config
Veamos que se ha guardado bien
!root@server2:~# echo "Host reverseToServer3 HostName 194.62.96.236 User root RemoteForward 2020 localhost:22" >> ~/.ssh/config!root@server2:~# cat .ssh/config
Host reverseToServer3HostName 194.62.96.236User rootRemoteForward 2020 localhost:22
Hago la conexión reversa
!root@server2:~# ssh reverseToServer3
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-53-generic x86_64)Last login: Wed Feb 22 15:26:18 2023 from 194.62.99.235root@server3:~#
Jump
Como hemos dicho hacíamos saltos mediante el flag -J
, de manera que con el comando ssh -J root@194.62.99.222 root@10.7.2.228
podíamos llegar a conectarnos al server2
Para configurar el archivo de configuración hay dos opciones
La primera es que como ya tenemos el server1
guardada en el archivo de configuración, solamente añadimos server2
Host server2
HostName 10.7.2.228
User root
Y a continuación nos podríamos conectar mediante
ssh -J server1 server2
Vamos a probarlo
!echo "Host server2 HostName 10.7.2.228 User root " >> ~/.ssh/config
Vemos el archivo de configuración
!echo "Host server2 HostName 10.7.2.228 User root " >> ~/.ssh/config!cat ~/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 192.168.1.138HostName 192.168.1.138User maximo.fernandezHost server1HostName 194.62.99.222User rootHost proxyServer1HostName 194.62.99.222User rootDynamicForward 9999Host tunelToServer2HostName 194.62.99.222User rootLocalForward 127.0.0.1:2020 10.7.2.228:22Host server2ByTunelHostName localhostUser rootPort 2020Host server2HostName 10.7.2.228User root
Ahora nos conectamos mediante los saltos
!ssh -J server1 server2
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 12:05:16 2023 from 10.7.0.168root@server2:~#
Esta ha sido la primera opción, guardar cada servidor y establecer los saltos, pero una segunda opción es guardar todos los saltos en una sola configuración, que quedaría así
Host server2jumping
HostName 10.7.2.228
User root
ProxyJump root@194.62.99.222
Y ya solo haría falta conectarse mediante
ssh server2jumping
Vamos a probar
!echo "Host server2jumping HostName 10.7.2.228 User root ProxyJump root@194.62.99.222" >> ~/.ssh/config
Vamos a ver el archivo de configuración
!echo "Host server2jumping HostName 10.7.2.228 User root ProxyJump root@194.62.99.222" >> ~/.ssh/config!cat ~/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost 192.168.1.138HostName 192.168.1.138User maximo.fernandezHost server1HostName 194.62.99.222User rootHost proxyServer1HostName 194.62.99.222User rootDynamicForward 9999Host tunelToServer2HostName 194.62.99.222User rootLocalForward 127.0.0.1:2020 10.7.2.228:22Host server2ByTunelHostName localhostUser rootPort 2020Host server2HostName 10.7.2.228User rootHost server2jumpingHostName 10.7.2.228User rootProxyJump root@194.62.99.222
Ahora intentamos conectarnos
!ssh server2jumping
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)Last login: Fri Feb 24 12:06:22 2023 from 10.7.0.168root@server2:~#
Archivo de configuración SSH
del sistema
Antes vimos el archivo de configuración de SSH
del usuario, donde guardamos configuraciones de maquinas donde nos queríamos conectar por SSH
, pero hay otro archivo de configuración de SSH
pero en este caso del sistema, que se encuentra en /etc/ssh/ssh_config
, vamos a verlo
!cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $# This is the sshd server system-wide configuration file. See# sshd_config(5) for more information.# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin# The strategy used for options in the default sshd_config shipped with# OpenSSH is to specify options with their default value where# possible, but leave them commented. Uncommented options override the# default value.Include /etc/ssh/sshd_config.d/*.conf#Port 22#AddressFamily any#ListenAddress 0.0.0.0#ListenAddress ::#HostKey /etc/ssh/ssh_host_rsa_key#HostKey /etc/ssh/ssh_host_ecdsa_key#HostKey /etc/ssh/ssh_host_ed25519_key# Ciphers and keying#RekeyLimit default none# Logging#SyslogFacility AUTH#LogLevel INFO# Authentication:#LoginGraceTime 2m#PermitRootLogin prohibit-password#StrictModes yes#MaxAuthTries 6#MaxSessions 10#PubkeyAuthentication yes# Expect .ssh/authorized_keys2 to be disregarded by default in future.#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2#AuthorizedPrincipalsFile none#AuthorizedKeysCommand none#AuthorizedKeysCommandUser nobody# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts#HostbasedAuthentication no# Change to yes if you don't trust ~/.ssh/known_hosts for# HostbasedAuthentication#IgnoreUserKnownHosts no# Don't read the user's ~/.rhosts and ~/.shosts files#IgnoreRhosts yes# To disable tunneled clear text passwords, change to no here!#PasswordAuthentication yes#PermitEmptyPasswords no# Change to yes to enable challenge-response passwords (beware issues with# some PAM modules and threads)ChallengeResponseAuthentication no# Kerberos options#KerberosAuthentication no#KerberosOrLocalPasswd yes#KerberosTicketCleanup yes#KerberosGetAFSToken no# GSSAPI options#GSSAPIAuthentication no#GSSAPICleanupCredentials yes#GSSAPIStrictAcceptorCheck yes#GSSAPIKeyExchange no# Set this to 'yes' to enable PAM authentication, account processing,# and session processing. If this is enabled, PAM authentication will# be allowed through the ChallengeResponseAuthentication and# PasswordAuthentication. Depending on your PAM configuration,# PAM authentication via ChallengeResponseAuthentication may bypass# the setting of "PermitRootLogin without-password".# If you just want the PAM account and session checks to run without# PAM authentication, then enable this but set PasswordAuthentication# and ChallengeResponseAuthentication to 'no'.UsePAM yes#AllowAgentForwarding yes#AllowTcpForwarding yes#GatewayPorts noX11Forwarding yes#X11DisplayOffset 10#X11UseLocalhost yes#PermitTTY yesPrintMotd no#PrintLastLog yes#TCPKeepAlive yes#PermitUserEnvironment no#Compression delayed#ClientAliveInterval 0#ClientAliveCountMax 3#UseDNS no#PidFile /var/run/sshd.pid#MaxStartups 10:30:100#PermitTunnel no#ChrootDirectory none#VersionAddendum none# no default banner path#Banner none# Allow client to pass locale environment variablesAcceptEnv LANG LC_*# override default of no subsystemsSubsystem sftp /usr/lib/openssh/sftp-server# Example of overriding settings on a per-user basis#Match User anoncvs# X11Forwarding no# AllowTcpForwarding no# PermitTTY no# ForceCommand cvs server
Con este archivo podemos cambiar la configuración de cómo funciona SSH
en nuestro ordenador. Por ejemplo podemos ver una linea comentada que pone
#Port 22
Si la descomentamos y cambiamos el número SSH
dejará de ir por el puerto 22, que es su puerto por defecto, e ira por el número de puerto que ahí se especifique.
Copia de archivos por SSH
Podemos copiar archivos por SSH
mediante el comando scp
(secure copy), para ello la sintaxis es
scp <path local file> <user>@<IP>:<path to save>
o
scp <user>@<ip>:<path to remote file> <path to save>
De la primera forma se copia un archivo de nuestro ordenador a otro y de la segunda de otro al nuestro
Por ejemplo hagamos un ls
del server1
!ssh -t server1 "ls"
snapConnection to 194.62.99.222 closed.
Veamos ahora qué tenemos en local que le podamos pasar
!ls
2021-02-11-Introduccion-a-Python.ipynb html_files2021-04-23-Calculo-matricial-con-Numpy.ipynb html.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb introduccion_python2022-09-12-Introduccion-a-la-terminal.ipynb mi_paquete_de_python2023-01-22-Docker.ipynb movies.csv2023-02-01-Bash-scripting.ipynb movies.dat2023-02-04-Blip-2.ipynb notebooks_translated2023-XX-XX-SSH.ipynb __pycache__california_housing_train.csv scripts_bashcommand-line-cheat-sheet.pdf ssh.ipynbCSS.ipynb test.ipynb'Expresiones regulares.ipynb'
Vamos a mandarle al servidor el archivo html.ipynb
ya que ocupa poco
!scp html.ipynb server1:/root/
html.ipynb 100% 14KB 229.0KB/s 00:00
Volvemos a ver qué hay dentro de server1
!ssh -t server1 "ls"
html.ipynb snapConnection to 194.62.99.222 closed.
Se ha copiado
Sincroniazción de archivos por SSH
Lo malo del comando scp
es que si en medio de la copia pasa algo y no se termina de copiar el archivo, cuando se vuelva a intentar hay que empezar desde cero, esto sobre todo es un problema con archivos muy pesados
Para solucionar esto se puede usar rsync
, la sintaxis es
rsync --partial --progress --rsh=ssh <path local file> <user>@<IP>:<path to save>
o
rsync --partial --progress --rsh=ssh <user>@<ip>:<path to remote file> <path to save>
Al igual que antes, de la primera forma se copia un archivo de nuestro ordenador a otro y de la segunda de otro al nuestro. El flag --partial
es para indicar que se guarden archivos parcialmente copiados, es decir, que si se para la copia antes de que termine, que lo que se haya copiado se mantenga. El flag --progress
es para indicar que muestre el progreso de la copia. El flag --rsh=ssh
es para indicar que la transferencia de archivos se haga por SSH
Pasamos un archivo
!rsync --partial --progress -rsh=ssh 2021-06-15-Manejo-de-datos-con-Pandas.ipynb server1:/root/
sending incremental file list2021-06-15-Manejo-de-datos-con-Pandas.ipynb608.34K 100% 197.78MB/s 0:00:00 (xfr#1, to-chk=0/1)
Y vemos si se ha copiado
!ssh -t server1 "ls"
2021-06-15-Manejo-de-datos-con-Pandas.ipynb html.ipynb snapConnection to 194.62.99.222 closed.
Montar carpetas remotas en local
En el caso que queramos tener una carpeta de otra máquina como si estuviese en nuestro ordenador tenemos que uasr sshfs
Primero es necesario instalarlo mediante
sudo apt install sshfs
Y una vez esté instalado se usa con la sintaxis
sshfs <user>@<ip>:<remote path> <local path to mount>
Vamos a montar la carpeta /root
del server1
, pero para ello primero vamos a crear una carpeta en la que lo vamos a montar
!mkdir server1folder
Vemos que dentro de la carpeta que hemos montado no hay nada
!mkdir server1folder!ls server1folder
Ahora montamos la carpeta del servidor
!mkdir server1folder!ls server1folder!!sshfs server1:/root/ server1folder
Volvemos a ver qué hay dentro
!mkdir server1folder!ls server1folder!!sshfs server1:/root/ server1folder!ls server1folder
2021-06-15-Manejo-de-datos-con-Pandas.ipynb html.ipynb snap
Cuando ya no queramos tener más la carpeta montada la podemos desmontar mediante fusermount -u server1folder
!!fusermount -u server1folder
Volvemos a mirar qué hay dentro para ver que no hay nada
!!fusermount -u server1folder!ls server1folder
Depurar la conexión SSH
Podemos depurar la conexión SSH
añadiendo desde -v
, hasta -vvvv
a la conexión, cuantas más v
s pongamos mayor nivel de información
!!fusermount -u server1folder!ls server1folder!ssh -v server1
OpenSSH_8.2p1 Ubuntu-4ubuntu0.5, OpenSSL 1.1.1f 31 Mar 2020debug1: Reading configuration data /home/wallabot/.ssh/configdebug1: /home/wallabot/.ssh/config line 6: Applying options for server1debug1: Reading configuration data /etc/ssh/ssh_configdebug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no filesdebug1: /etc/ssh/ssh_config line 21: Applying options for *debug1: Connecting to 194.62.99.222 [194.62.99.222] port 22.debug1: Connection established.debug1: identity file /home/wallabot/.ssh/id_rsa type 0debug1: identity file /home/wallabot/.ssh/id_rsa-cert type -1debug1: identity file /home/wallabot/.ssh/id_dsa type -1debug1: identity file /home/wallabot/.ssh/id_dsa-cert type -1debug1: identity file /home/wallabot/.ssh/id_ecdsa type -1debug1: identity file /home/wallabot/.ssh/id_ecdsa-cert type -1debug1: identity file /home/wallabot/.ssh/id_ecdsa_sk type -1debug1: identity file /home/wallabot/.ssh/id_ecdsa_sk-cert type -1debug1: identity file /home/wallabot/.ssh/id_ed25519 type -1debug1: identity file /home/wallabot/.ssh/id_ed25519-cert type -1debug1: identity file /home/wallabot/.ssh/id_ed25519_sk type -1debug1: identity file /home/wallabot/.ssh/id_ed25519_sk-cert type -1debug1: identity file /home/wallabot/.ssh/id_xmss type -1debug1: identity file /home/wallabot/.ssh/id_xmss-cert type -1debug1: Local version string SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5debug1: Remote protocol version 2.0, remote software version OpenSSH_8.9p1 Ubuntu-3debug1: match: OpenSSH_8.9p1 Ubuntu-3 pat OpenSSH* compat 0x04000000debug1: Authenticating to 194.62.99.222:22 as 'root'debug1: SSH2_MSG_KEXINIT sentdebug1: SSH2_MSG_KEXINIT receiveddebug1: kex: algorithm: curve25519-sha256debug1: kex: host key algorithm: ecdsa-sha2-nistp256debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: nonedebug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: nonedebug1: expecting SSH2_MSG_KEX_ECDH_REPLYdebug1: Server host key: ecdsa-sha2-nistp256 SHA256:jwpQt2a69LQcuvvYPPKL32bBwTi1Je/ZmUdr4zEiD1Ydebug1: Host '194.62.99.222' is known and matches the ECDSA host key.debug1: Found key in /home/wallabot/.ssh/known_hosts:14debug1: rekey out after 134217728 blocksdebug1: SSH2_MSG_NEWKEYS sentdebug1: expecting SSH2_MSG_NEWKEYSdebug1: SSH2_MSG_NEWKEYS receiveddebug1: rekey in after 134217728 blocksdebug1: Will attempt key: /home/wallabot/.ssh/id_rsa RSA SHA256:ID3HcrbyPBGjFx/qeiJK50eqihLGrpDVu02oRSyKGh4 agentdebug1: Will attempt key: wallabot@wallabot RSA SHA256:Qlq6hXbToInW+efEK666BFT26EeUSpBhzcqxTLrDBpQ agentdebug1: Will attempt key: /home/wallabot/.ssh/id_dsadebug1: Will attempt key: /home/wallabot/.ssh/id_ecdsadebug1: Will attempt key: /home/wallabot/.ssh/id_ecdsa_skdebug1: Will attempt key: /home/wallabot/.ssh/id_ed25519debug1: Will attempt key: /home/wallabot/.ssh/id_ed25519_skdebug1: Will attempt key: /home/wallabot/.ssh/id_xmssdebug1: SSH2_MSG_EXT_INFO receiveddebug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,sk-ssh-ed25519@openssh.com,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ecdsa-sha2-nistp256@openssh.com,webauthn-sk-ecdsa-sha2-nistp256@openssh.com>debug1: kex_input_ext_info: publickey-hostbound@openssh.com (unrecognised)debug1: SSH2_MSG_SERVICE_ACCEPT receiveddebug1: Authentications that can continue: publickeydebug1: Next authentication method: publickeydebug1: Offering public key: /home/wallabot/.ssh/id_rsa RSA SHA256:ID3HcrbyPBGjFx/qeiJK50eqihLGrpDVu02oRSyKGh4 agentdebug1: Authentications that can continue: publickeydebug1: Offering public key: wallabot@wallabot RSA SHA256:Qlq6hXbToInW+efEK666BFT26EeUSpBhzcqxTLrDBpQ agentdebug1: Server accepts key: wallabot@wallabot RSA SHA256:Qlq6hXbToInW+efEK666BFT26EeUSpBhzcqxTLrDBpQ agentdebug1: Authentication succeeded (publickey).Authenticated to 194.62.99.222 ([194.62.99.222]:22).debug1: channel 0: new [client-session]debug1: Requesting no-more-sessions@openssh.comdebug1: Entering interactive session.debug1: pledge: networkdebug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0debug1: Remote: /root/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwardingdebug1: Remote: /root/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwardingdebug1: Sending environment.debug1: Sending env LANG = es_ES.UTF-8Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-60-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantageSystem information as of Fri Feb 24 01:25:10 PM UTC 2023System load: 0.0Usage of /: 15.2% of 24.53GBMemory usage: 34%Swap usage: 0%Processes: 89Users logged in: 0IPv4 address for eth0: 194.62.99.222IPv4 address for eth1: 10.7.0.168IPv6 address for eth2: 2a04:3542:8000:1000:d48a:cbff:fefb:5b1* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8sjust raised the bar for easy, resilient and secure K8s cluster deployment.https://ubuntu.com/engage/secure-kubernetes-at-the-edge43 updates can be applied immediately.To see these additional updates run: apt list --upgradableLast login: Fri Feb 24 13:10:05 2023 from 188.127.184.59]0;root@server1: ~root@server1:~# ^C]0;root@server1: ~root@server1:~#