Acceso a servicios locales en un VPS
Ahora que estoy usando un VPS, una de las cosas que hago es acceder a distintas herramientas administrativas que para mayor seguridad no quiero que estén disponibles de modo abierto en Internet. Ejemplos de este tipo de herramientas son un phpMyAdmin (para administrar la bbdd) o paneles de monitorización del rendimiento de la máquina. Aunque muchas de ellas permiten restringir su uso mediante usuario y contraseña, creo que es mejor no exponerlas a un acceso público.
Lo que hago es configurar estas herramientas para que escuchen sólo en el interface localhost (127.0.0.1) y después utilizo el acceso ssh para acceder a ellas. Según el software que se utilice, esto se hace de distintas maneras:
Apache
En el fichero del VirtualHost, configurar la IP desde la que se escucha. Ejemplo:
<VirtualHost 127.0.0.1:8080>
...
</VirtualHost>
NGINX
Igualmente se puede configurar al definir el servidor:
server {
listen 127.0.0.1:8080
...
}
Docker
Docker abre los puertos que se le configuran como públicos, incluso aunque tú no los abras en el firewall de linux, por lo tanto es importante indicar igualmente el host cuando se lanza. Ejemplo de lanzar un phpMyAdmin que sólo escucha en el interface local:
docker run --name phpmyadmin -d --link mysql_db_server:db -p 127.0.0.1:8080:80 phpmyadmin/phpmyadmin
Acceso al servicio
Ahora, cuando queramos acceder a los servicios, lo que haremos será abrir un ssh al servidor y abrir un proxy SOCKS dinámico. La forma de hacer esto depende de el cliente ssh que se esté usando. En el caso de putty, lo que se debe hacer es crear un tunel dinámico en el puerto que se quiera (en el siguiente ejemplo, en el puerto 1080, que por otro lado es el puerto oficial de un proxy SOCKS). No olvidar pulsar sobre el botón “Add” para que realmente añada el tunel.
En el caso de un cliente normal de ssh de línea de comando hay que utilizar el siguiente formato:
ssh -D 1080 user@host
(sustituir user y host por los datos adecuados del servidor)
Una vez hecho esto, configuramos el navegador para que utilice un proxy de tipo SOCKS4, poniendo localhost o 127.0.0.1 como IP del proxy y 1080 como el puerto del mismo. A partir de este momento cualquier acceso en el navegador se hará a través del proxy. Por lo tanto podremos acceder a nuestro servicio sin más que acceder a http://localhost:8080.
Durante todo el tiempo que queramos acceder al servicio, se debe mantener la sesión ssh abierta. Una vez que terminemos de acceder, simplemente cambiamos la configuración del navegador para que no utilice el proxy SOCKS4.
Haciéndolo más fácil con SwitchyOmega y nip.io
Un problema de este tipo de acceso es que hay que estar continuamente cambiando la configuración del proxy del navegador, además de que mientras el proxy está activado todo el tráfico se ruta a través del VPS, lo cual puede no interesarnos.
La solución es utilizar una extensión como SwitchyOmega. Esta extensión para el navegador Chrome (existen alternativas para otros navegadores) permite configurar un proxy que sólo se utiliza para determinadas urls. Ahora lo único que necesitamos es tener un dominio específico para nuestro servicio local, que configuraremos en SwitchyOmega para que utilice el proxy SOCKS4, lo cual podemos lograr mediante el servicio nip.io
nip.io es un servicio público que nos permite acceder a una máquina con diferentes nombres de dominio. Ejemplo:
127.0.0.1.nip.io mapea a 127.0.0.1
app.127.0.0.1.nip.io mapea a 127.0.0.1
…y así cualquier cosa que queramos poner delante de 127.0.0.1.nip.io. Configuraremos SwitchyOmega para que utilice el proxy SOCKS4 cuando accedamos a (por ejemplo) http://local.127.0.0.1.nip.io:
De esta manera, podremos acceder a nuestro servicio mediante, por ejemplo, http://local.127.0.0.1.nip.io:8080, mientras que para el resto de urls el navegador no utilizará el proxy SOCKS que hemos abierto.
Otra solución más sencilla es utilizar túneles ssh. Los puedes hacer con putty o desde el terminal en linux. Luego para conectar no necesitas proxy sokcs sino simplemente insertar en el navegador la dirección local del túnel.
Cierto, Iván.
Yo intento usar esta solución porque así no necesito ir abriendo distintos túneles según los servicios a los que quiero acceder.
Por si a alguien le interesa cómo hacerlos, es con la opción -L de shh:
ssh -L 8080:localhost:80 user@host
Esto mapearía el puerto 80 de la máquina remota con el puerto 8080 local, de tal manera que puedes accederlo en el navegador como:
http://localhost:8080
Sin necesidad de configurar ningún proxy.
Comentarios cerrados para este artículo