Buen dia a todos!
La próxima semana lanzaremos el próximo
grupo de administradores de Linux , en relación con el cual realizamos una serie de eventos. Una de ellas es una lección abierta sobre el tema "SSH / NC / Socat: consejos y trucos". En él recordamos qué es ssh, su historia y misión. Examinamos varias opciones para su uso: remoto, reenvío de puerto local, copia segura, calcetines proxy, proxy inverso. De hecho, probamos las utilidades nc y socat en un laboratorio virtual.
El seminario
web fue realizado por el experimentado administrador de sistemas
Vladimir Drozdetsky , desarrollador de infraestructura en letundra.com, exposcan.ru, crispmessenger.com.
Traemos a su atención una descripción detallada del evento pasado.
Recordemos qué es SSHSSH (Secure Shell) es un "shell seguro", un protocolo de red de nivel de aplicación. Le permite controlar de forma remota el sistema operativo y las conexiones TCP del túnel (por ejemplo, para transferir archivos). En su funcionalidad, SSH es similar a los protocolos Telnet y rlogin, sin embargo, difiere de ellos porque encripta todo el tráfico, incluidas las contraseñas transmitidas. La especificación del protocolo SSH-2 está contenida en RFC 4251.
Veamos los diversos usos de SSH, tanto estándar como no estándar. El siguiente stand nos ayudará con esto:

El stand presenta cuatro máquinas virtuales que se encuentran detrás del firewall. Realizaremos todas las acciones desde la máquina Nodo-1.
Crear una clave SSH
Para usar la clave SSH, primero debe crearla. Para esto, es adecuada una utilidad especial, que está absolutamente en cualquier distribución de Linux:
ssh-keygen -t RSA -N otuslinux -f ~/.ssh/otus
- -t: qué algoritmo de cifrado usar;
- -N - clave de cifrado (un argumento conveniente si necesita crear una clave sin cifrado y respuestas a varias solicitudes ssh-keygen);
- -f: en qué archivo guardar la clave.
Configuración SSH ssh-serverPara más trabajo, deberá editar el archivo / etc / ssh / sshd_config y reiniciar el servidor ssh. Aquí debe prestar atención a las siguientes opciones:
RSAAuthentication yes
RSA
RSAAuthentication yes
(si se permite la autenticación RSA);
PubkeyAuthentication yes
(si se permite la autenticación por clave);
AuthorizedKeysFile %h/.ssh/authorized_keys
(ruta a la parte pública de la clave);
Autenticación de
PasswordAuthentication yes
(si se permite la autenticación).
Para copiar la clave al servidor, proceda de la siguiente manera:
ssh-copy-id -i /path/to/pub/key user@server
(copie la parte pública de la clave en el servidor remoto, la clave pública se copiará a lo largo de la ruta al archivo% h / .ssh / Authorizedkeys)
Para no volver a ingresar la clave de cifrado cada vez que se conecta a un servidor remoto, podemos usar ssh-agent. Para hacer esto:
eval $(ssh-agent -s)
(eval es parte de POSIX. Su interfaz también puede ser un shell. La clave en el agente se almacenará en forma descifrada).
ssh-add ~/.ssh/our_private_key
(Agregar una clave privada).
En este caso:
- -i: indica la ubicación de la clave pública;
- usuario: nombre de usuario en el servidor remoto;
- servidor: ip o dns del servidor de destino.
Para facilitar la conexión a un servidor remoto, podemos describir los parámetros de conexión en el archivo de configuración ssh, que se encuentra en la ruta ~ / .ssh / config
Por lo tanto, obtenemos el siguiente archivo de configuración SSH:
Host myserver HostName ip/hostname Port 22/??? User username IdentityFile ~/.ssh/id_rsa
Aquí todo es simple:
- Anfitrión: el nombre de nuestra conexión;
- HostName: nombre del servidor;
- Puerto - puerto ssh
- Usuario: nombre de usuario;
- IdentityFile: clave ssh.
SSH SCPSigamos adelante. La forma más fácil de usar SSH es copiar el archivo de una máquina al control remoto. Para hacer esto, use la utilidad SCP (Protocolo de copia segura). Al usarlo, puede copiar un directorio o archivo de un servidor local a un servidor remoto, o viceversa:
scp test.txt username@server:/some/directory
(Copiar un archivo del servidor local al servidor remoto).
scp username@server:test.txt /some/directory
(Copiar un archivo de un servidor remoto a uno local).
scp -r dir_name username@server:/some/directory
(Copiando una carpeta desde el servidor local al remoto).
Aquí:
- nombre de usuario - nombre de usuario;
- servidor - dirección del servidor;
- / some / server - el directorio donde copiamos;
- dir_name: nombre de la carpeta;
- -r: uso recursivo.
Túnel SSH, proxyAhora veamos la opción de reenviar un puerto con un control remoto a la máquina local. Tomemos el caso clásico como ejemplo, es decir, un montón cuando tenemos un "malvado guardia de seguridad" y un servidor con una aplicación web, los puertos ssh y https están mirando al mundo, y realmente queremos conectarnos al servidor MySQL.
Entonces
ssh -f -N -L 9906:127.0.0.1:3306 user@server
(Solo nuestro caso con MySQL)
Como resultado, podemos conectarnos al puerto local 9906 con el cliente mysql y acceder a nuestro servidor de "seguridad".
ssh -D 8080 -q -C -N -f servername
(Proxying el tráfico a través de SOCKS a través del puerto 8080)
Con este comando, creamos un servidor proxy socks5 usando ssh. Para verificar su rendimiento, podemos usar el siguiente comando:
curl -x socks5h://server-with-proxy:8080 https://test.domain
Un ejemplo clásico de reenvío de puertos con ssh es cuando el servidor al que desea conectarse está detrás de la nat. El siguiente comando nos ayudará a conectarnos a dicho servidor:
ssh -f -N -R 2255:localhost:22 username@servername
(reenvío de un servidor remoto a uno local).
En el servidor remoto, se abrirá el puerto 2255, que se redirigirá al puerto 22 de nuestro servidor para la nat. Para conectarse a dicho servidor, podemos usar el comando:
ssh -p 2255 username@localhost
Tenga en cuenta que:
- -f: envía ssh al fondo;
- -N: no ejecuta el comando en el host remoto;
- -L: reenviar el puerto local (puerto local: máquina local: puerto remoto);
- -R - puerto en la máquina remota;
- -q - modo silencioso;
- -D: define el enrutamiento dinámico local de los puertos de nivel de aplicación;
- -C - solicitud de compresión de datos.
Netcat (nc)Nuestra siguiente parada es Netcat, una utilidad de Unix que le permite establecer conexiones TCP y UDP, recibir datos desde allí y transferirlos. A pesar de su utilidad y simplicidad, esta utilidad no está incluida en ningún estándar y no se suministra con ningún kit de distribución. En consecuencia, debe instalarse a mano.
Una de las características interesantes de Netcat (nc) es la capacidad de escanear puertos:
nc -vn ipaddress 22
(escaneo de puerto único);
nc -v ipaddress 10-55
(escaneo de rango de puertos);
nc -l 4444
(abrir y escuchar el puerto 4444);
nc servername 4444
(nos conectamos al servidor en el puerto deseado).
Después de abrir el puerto y conectarnos a él, obtenemos una pequeña sala de chat de red =).
A continuación, consideramos la posibilidad de transferir archivos utilizando la utilidad nc. Para hacer esto, el siguiente comando nos ayudará:
cat test_file | pv -b | nc -l 4444
cat test_file | pv -b | nc -l 4444
(abra el puerto y transfiéralo a través de la tubería; la utilidad pv con el modificador -b se usa para mostrar el progreso de la transferencia de archivos en bytes).
nc servername 4444 | pv -b > filename
nc servername 4444 | pv -b > filename
(nos conectamos al servidor para recibir el archivo, pv -b se usa de la misma manera).
Podemos complicar nuestra tubería agregando archivos de archivos sobre la marcha:
tar -czf - /path/to/ | pv -b | nc -l 4444
tar -czf - /path/to/ | pv -b | nc -l 4444
(archivando carpetas sobre la marcha y enviando);
n
c servername 4444 | pv -b > file.tar.gz
c servername 4444 | pv -b > file.tar.gz
(
c servername 4444 | pv -b > file.tar.gz
el archivo).
Una característica no muy obvia de nc es crear solo un servidor http.
while true; do nc -lp 80 < index.html; done
Tenga en cuenta que para usar el puerto 80, debe tener privilegios de root.
También tenga en cuenta que:
- -l - indica el modo operativo de escucha;
- -n: no utiliza consultas DNS;
- -v - salida detallada.
SocatTambién es una utilidad útil que le permite establecer conexiones TCP entre máquinas, puertos de reenvío, etc. Funciona según el principio de Netcat: abre dos conexiones bidireccionales, puede transferir datos, flujos, etc. Sin embargo, tiene una característica interesante. Por ejemplo, usando Socat, podemos asignar puertos COM a puertos TCP, etc.
Ejemplos de trabajo de Socat:
socat -u FILE:file_name TCP-LISTEN:5778,reuseaddr
# enviar archivo;
socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name
socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name
# obtener archivo;
socat TCP-LISTEN:80,fork TCP:ubuntunode-4:80
# reenvío de puerto del servidor remoto al puerto local;
socat TCP-LISTEN:1234,reuseaddr EXEC:/bin/bash
# Open remote shell =);
socat - TCP:server_with_remote_shell:1234
# Conéctese al shell remoto del servidor remoto.
Pequeño descifrado:
- -u - uso del modo unidireccional;
- ARCHIVO - indica que estamos usando el archivo;
- TCP-LISTEN: escucha el puerto tcp;
- reuseaddr: permite que otros sockets se comuniquen con la misma dirección, incluso si se usa;
- fork: una vez establecida la conexión, el canal se procesa en el proceso secundario;
- TCP es el tipo de conexión.
¿Debo ver la versión de video ahora?Por supuesto, sí, porque en la descripción todo se presenta de manera abstracta. Además, los temas del seminario web se describen con más detalle, y algunos de ellos proporcionan ejemplos adicionales y opciones de implementación. Por lo tanto, si está interesado en este tema, mire la lección abierta por completo y repita todos los pasos para
Vladimir Drozdetsky para una máxima asimilación del material. Y no olvides dejar tus comentarios.
¡Nosotros, a su vez, no nos despedimos y lo invitamos al curso de
Administrador de Linux !