¿Qué es el reenvío de puertos SSH, también conocido como túnel SSH?
el reenvío de puertos SSH es un mecanismo en SSH para tunelizar puertos de aplicaciones desde el equipo cliente al equipo servidor, o viceversa. Se puede usar para agregar cifrado a aplicaciones heredadas, pasar por firewalls, y algunos administradores de sistemas y profesionales de TI lo usan para abrir puertas traseras en la red interna desde sus máquinas domésticas. También puede ser abusado por hackers y malware para abrir el acceso desde Internet a la red interna., Consulte la página de túneles SSH para obtener una visión general más amplia.
reenvío Local
el reenvío Local se utiliza para reenviar un puerto desde el equipo cliente al equipo servidor. Básicamente, el cliente SSH escucha conexiones en un puerto configurado, y cuando recibe una conexión, los túneles de la conexión a un servidor SSH. El servidor se conecta a un puerto de destino configurado, posiblemente en una máquina diferente al servidor SSH.,
los usos típicos para el reenvío de puertos locales incluyen:
-
Tunneling sessions and file transfers through Jump servers
-
Connecting to a service on an internal network from the outside
-
Connecting to a remote file share over the Internet
bastantes organizaciones para todo el acceso SSH entrante a través de un solo servidor jump. El servidor puede ser una caja estándar de Linux/Unix, generalmente con algún endurecimiento adicional, detección de intrusiones y / o registro, o puede ser una solución de servidor de salto comercial.,
muchos servidores jump permiten el reenvío de puertos entrantes, una vez que la conexión se ha autenticado. Este reenvío de puertos es conveniente, ya que permite a los usuarios expertos en tecnología usar los recursos internos de manera bastante transparente. Por ejemplo, pueden reenviar un puerto en su máquina local al servidor web de intranet corporativa, al puerto IMAP de un servidor de correo interno, a los puertos 445 y 139 de un servidor de archivos local, a una impresora, a un repositorio de control de versiones o a casi cualquier otro sistema en la red interna. Con frecuencia, el puerto se tuneliza a un puerto SSH en una máquina interna.,
en OpenSSH, el reenvío de puertos locales se configura utilizando la opción -L
:
ssh -L 80:intra.example.com:80 gw.example.com
Este ejemplo abre una conexión al gw.example.com
Jump server, y reenvía cualquier conexión al puerto 80 en la máquina local al puerto 80 en intra.example.com
.
de forma predeterminada, cualquier persona (incluso en diferentes máquinas) puede conectarse al puerto especificado en la máquina cliente SSH., Sin embargo, esto se puede restringir a programas en el mismo host proporcionando una dirección bind:
ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com
la opción LocalForward
en el archivo de configuración del cliente OpenSSH se puede usar para configurar el reenvío sin tener que especificarlo en la línea de comandos.
reenvío remoto
en OpenSSH, los reenvíos remotos de puertos SSH se especifican utilizando la opción -R
. Por ejemplo:
ssh -R 8080:localhost:80 public.example.com
esto permite a cualquier persona en el servidor remoto Conectarse al puerto TCP 8080 en el servidor remoto., La conexión se tunelizará de nuevo al host cliente, y el cliente realizará una conexión TCP al puerto 80 en localhost
. Se puede usar cualquier otro nombre de host o dirección IP en lugar de localhost
para especificar el host al que conectarse.
este ejemplo en particular sería útil para dar a alguien en el exterior Acceso a un servidor Web interno. O exponer una aplicación web interna a la Internet pública. Esto podría ser hecho por un empleado que trabaja desde casa, o por un atacante.,
de forma predeterminada, OpenSSH solo permite conectarse a puertos reenviados remotos desde el host del servidor. Sin embargo, la opción GatewayPorts
en el archivo de configuración del servidor sshd_config se puede usar para controlar esto. Las siguientes alternativas son posibles:
GatewayPorts no
esto impide la conexión a puertos reenviados desde fuera del equipo servidor.
GatewayPorts yes
esto permite a cualquiera conectarse a los puertos reenviados. Si el servidor está en Internet público, cualquier persona en Internet puede conectarse al puerto.,
GatewayPorts clientspecified
esto significa que el cliente puede especificar una dirección IP desde la que Se Permiten Las conexiones al puerto. La sintaxis para esto es:
ssh -R 52.194.1.73:8080:localhost:80 host147.aws.example.com
en este ejemplo, solo se permiten conexiones desde la dirección IP 52.194.1.73
al puerto 8080.
OpenSSH también permite el puerto remoto reenviado a especificado como 0. En este caso, el servidor asignará dinámicamente un puerto e informará al cliente. Cuando se utiliza con la opción -O forward
, el cliente imprimirá el número de puerto asignado a la salida estándar.,
abrir puertas traseras en la empresa
el reenvío remoto de puertos SSH es comúnmente utilizado por los empleados para abrir puertas traseras en la empresa. Por ejemplo, el empleado puede configurar obtener un servidor de nivel libre desde Amazon AWS e iniciar sesión desde la oficina a ese servidor, especificando el reenvío remoto desde un puerto del servidor a algún servidor o aplicación de la red interna de la empresa. Se pueden especificar múltiples reenvíos remotos para abrir el acceso a más de una aplicación.,
el empleado también establecería GatewayPorts yes
en el servidor (la mayoría de los empleados no tienen direcciones IP fijas en casa, por lo que no pueden restringir la dirección IP).
por ejemplo, el siguiente comando abre el acceso a una base de datos Postgres interna en el puerto 5432 y a un puerto SSH interno en el puerto 2222.
ssh -R 2222:d76767.nyc.example.com:22 -R 5432:postgres3.nyc.example.com:5432 aws4.mydomain.net
configuración del lado del servidor
la opción AllowTcpForwarding
en el archivo de configuración del servidor OpenSSH debe estar habilitada en el servidor para permitir el reenvío de puertos. De forma predeterminada, se permite el reenvío., Los valores posibles para esta opción son yes
o all
para permitir todo el reenvío TCP, no
para evitar todo el reenvío TCP, local
para permitir reenvíos locales, y remote
para permitir reenvíos remotos.
otra opción de interés es AllowStreamLocalForwarding
, que se puede utilizar para reenviar sockets de dominio Unix. Permite los mismos valores que AllowTcpForwarding
. El valor predeterminado es yes
.,
por ejemplo:
AllowTcpForwarding remote AllowStreamLocalForwarding no
la opción de configuración GatewayPorts
como se describió anteriormente también afecta a los reenvíos de puertos remotos. Los valores posibles fueron no
( solo se permiten conexiones locales desde el host del servidor; predeterminado), yes
(cualquier persona en Internet puede conectarse a puertos reenviados remotos), y clientspecified
(el cliente puede especificar una dirección IP que se puede conectar, cualquiera puede si no se especifica).,
cómo evitar que el reenvío de puertos SSH Evite los Firewalls
recomendamos que el reenvío de puertos se deshabilite expresamente cuando no sea necesario. Dejar habilitado el reenvío de puertos puede exponer a la organización a riesgos de seguridad y puertas traseras. Por ejemplo, si un servidor destinado a proporcionar solo transferencias de archivos SFTP permite reenvíos de puertos, esos reenvíos podrían usarse para obtener acceso no deseado a la red interna desde la Intranet.
el problema es que el reenvío de puertos en la práctica solo puede ser evitado por un servidor o firewall., Una empresa no puede controlar todos los servidores en Internet. El control basado en Firewall también puede ser complicado, ya que la mayoría de las organizaciones tienen servidores en Amazon AWS y otros servicios en la nube, y generalmente se accede a esos servidores mediante SSH.