21 de abril de 2016

SSH Tunneling (port forwading) en Linux


Tenemos este escenario (localhost > VPN > 192.168.2.155 > 192.168.2.131):

- Desde localhost, mediante un servicio VPN (podría no tener una VPN y el ejemplo valdría igual, pero en mi caso había un VPN en medio) puedo conectarme mediante SSH al servidor que (en la red de la VPN, aunque como he dicho podría estar en una red local) tiene una IP 192.168.2.155.

- Desde este último servidor puedo acceder al puerto 389 de otro servidor con IP 192.168.2.131.

- El problema es que desde localhot necesitaría acceder al puerto 389 del servidor con IP 192.168.2.131 pero no tengo acceso a dicha IP desde localhost.

Solución: usar SSH Tunneling (port forwading)

A continuación explico como lo he hecho en un CentOS 7, aunque debería funcionar, salvo los últimos puntos donde hablo del firewall, en otras distribuciones Linux:

1.- Hago un ssh al servidor 192.168.2.155:

usuario@localhost$ ssh root@192.168.2.155

2.- Una vez dentro ejecuto el siguiente comando:

root@192.168.2.155$ ssh -f -L 192.168.2.155:9389:192.168.2.131:389 192.168.2.155 -N

3.- Con este comando redirigimos lo que llegue al servidor 192.168.2.155 por el puerto 9389 al puerto 389 del servidor 192.168.2.131.

4.- Podemos ver este proceso ejecutándose lanzando el siguiente comando:

root@192.168.2.155$ ps -ef | grep ssh
root 1234 1 0 10:24 ? 00:00:00 ssh -f -L 192.168.2.155:9389:192.168.2.131:389 192.168.2.155 -N

5.- Si queremos parar el proceso de redirección, deberíamos ejecutar el siguiente comando:

root@192.168.2.155$ kill -9 1234

6.- Para comprobar que efectivamente el servidor 192.168.2.151 está escuchando por el puerto 9389 ejecutamos el siguiente comando:

root@192.168.2.155$ netstat -punta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address      Foreign Address State  PID/Program name    
tcp        0      0 192.168.2.155:9389 0.0.0.0:*       LISTEN 4843/ssh

7.- Normalmente para que un servidor pueda escuchar por un determinado puerto tenemos que abrir dicho puerto en el firewall, y en este caso (un CentOS 7) tenemos que ejecutar el siguiente comando:

root@192.168.2.155$ firewall-cmd --zone=public --add-port=9389/tcp --permanent

8.- Y una vez hecho esto reiniciar el firewall con el siguiente comando:

root@192.168.2.155$ firewall-cmd --reload

9.- En otras distribuciones Linux para abrir un puerto en el firewall se hace mediante iptables.


10.- Para comprobar que el firewall está correctamente configurado podemos ejecutar el siguiente comando:

root@192.168.2.155$ iptables -nL | grep ACCEPT | grep NEW

11.- Que nos debería mostrar algo así (fijaros, que como estamos conectados por SSH el puerto 22 está abierto):

root@192.168.2.155$ iptables -nL | grep ACCEPT | grep NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9389 ctstate NEW

12.- Ahora, si nos vamos a nuestra máquina local, podremos acceder al puerto 389 del servidor 192.168.2.131 a través del puerto 9389 del servidor 192.168.2.155 gracias al túnel SSH que hemos creado y lo podemos comprobar haciendo un telnet en la máquina local:

usuario@localhost$ telnet 192.168.2.155 9389
Trying 192.168.2.155...
Connected to 192.168.2.155.
Escape character is '^]'. 

0 comentarios:

Publicar un comentario en la entrada