Conectar con nuestra casa a través de un Proxy y sin conexión directa a Internet en ninguno de los dos lados

Member for

9 años 4 meses

Quiero relataros como podemos conectar con nuestro ordenador de casa en un panorama bastante complejo. En mi caso tengo el siguiente panorama.

 

Panorama

Mi ordenador objetivo está detrás de un servidor Proxy muy restrictivo, solo tengo acceso de salida a los puertos 80 (HTTP) y 443 (HTTPS). Y demás puertos internos para servicios internos de la intranet.

En mi casa comparto Internet y no tengo posibilidad de "abrir" un puerto que me de acceso directo a mi casa.

El esquema sería mas o menos el siguiente:

Configuración de un servidor intermedio, Parte 1

Elección del servidor

Primero necesitamos tener acceso directo a nuestra casa desde un dispositivo que no esté detrás de un Proxy. Para ello la solución que yo he optado es lanzar túneles desde mi casa a un servidor intermedio, y conectarme directamente a ese túnel en el servidor intermedio. Si tenemos un servidor contratado (ojo un servidor, un hosting compartido no nos vale) o un VPS. En mi caso yo opté por OVH, tiene VPS muy pequeños y muy baratos (3€ al mes) y para nuestro caso no necesitamos ninguna maravilla. También podréis mirar una Instancia de Amazon, la "micro" es gratis durante un año y también nos vale. Pero ya tenéis que saber ademas como administrar las instancias de AWS.

Si queremos también podemos adquirir un dominio, pero esto es algo opcional.

En este tutorial doy por echo que nuestro servidor corre Linux, en especial Debian o Ubuntu.

Bien una vez tengamos nuestro servidor en marcha, no hace falta instalarle nada, seguramente con las herramientas que tiene por defecto nos sobre y baste para nuestro objetivo.

Configuración del servidor

Lo primero es en nuestro servidor intermedio, configurarlo para que permita crear túneles a través de SSH redirigiendo los puertos. Para ello nos logueamos como súper usuario (o usad sudo, lo que mas os guste)

# nano /etc/ssh/sshd_config
Al final de nuestro archivo añadimos:

Match User root
  GatewayPorts yes

Guardamos el archivo (Ctrl + X).

Y por ultimo reiniciamos nuestro servidor SSH

# service ssh restart

Listo, ya tenemos nuestro servidor preparado para nuestro objetivo. Ahora queda configurar nuestro ordenador de casa.

Configuración de el ordenador de casa

Generación de un juego de llaves

Al igual que le servidor esto está pensado para un ordenador (o una Raspberry) corriendo Linux.

Para automatizarlo lo máximo posible crearemos una juego de llaves pública y privada para poder conectarnos a nuestro servidor sin necesidad de tener que introducir nuestra contraseña si no solo con nuestra llave privada.

Asique desde nuestro ordenador de casa ejecutaremos los siguientes comandos a ser posible como el usuario que usaremos mas tarde para conectarnos a nuestro ordenador:

$ ssh-keygen

Nos aseguramos de NO meter una contraseña para que luego no sea necesario que para conectarnos nos la pida.

Esto nos generará nuestra copia de las llaves dentro de nuestro directorio HOME/.ssh con el nombre "id_rsa y id_rsa.pub"

Ahora necesitamos darle ciertos permisos seguros a nuestra clave, usaremos el comando:

$ chmod 0600 $HOME/.ssh/*

El siguiente punto es autorizar nuestra clave en el servidor, para ello usaremos el siguiente comando:

$ ssh-copy-id root@

Metemos nuestros datos de acceso y listo, la clave quedará instalada. Podemos probarla simplemente con el siguiente comando:

$ shh root@

(Opcional) Añadir seguridad al servidor


Como paso opcional podemos "securizar" nuestro servidor (os lo recomiendo en mi experiencia es muy necesario) para evitar que se pueda iniciar sesión usando usuario + contraseña, y solo sea posible usar nuestra llave privada para poder acceder. Así nos evitamos ataques de fuerza bruta.

Para ello haciendo uso del comando anterior, iniciamos sesión en nuestro servidor y editamos nuevamente el archivo /etc/ssh/sshd_config

# nano /etc/ssh/sshd_config

Buscamos la linea que ponga

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication no


Y la descomentamos (quitamos el "#" del principio). Reiniciamos el servicio de SSH de nuevo

# service ssh restart


Y listo, nuestro servidor es ligeramente mas seguro.

Creación del túnel SSH de casa al servidor

Seguimos con nuestro ordenador de casa, tenemos que decirle que tiene que crear un túnel con nuestro servidor y esperar que nos conectemos, para ello yo me valgo de unos scripts. Por cada servicio que usemos tendremos que abrir un puerto, por ejemplo, para SSH tendremos que abrir otro, para VNC otro y para nuestro servidor web local otro mas. Como os decía yo me valgo de una series de script. El de SSH lo lanzo siempre a través de CRON y el resto me conecto y los voy lanzando según lo necesite.

También me valdré de la utilidad "Screen" para mantener estos túneles activos en segundo plano. Para instalarlo simplemente como root (o con sudo) ejecutamos:

# apt-get update; apt-get install screen


Una vez termine nos ponemos con nuestro script, (podéis nombrarlo como queráis)

# nano /usr/bin/autoReverseSSHtunnel


Este es mi script:

#!/bin/bash
### BEGIN INIT INFO
# Provides: autoReverseSSHtunnel
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: autoReverseSSHtunnel
# Description: Enable an a Tunnel from localhost to other machine
### END INIT INFO

# *************Parámetros de configuración******************
logDir=/var/log/autoReverseSSHtunnel #Este será nuestro archivo de logueo para comprobar el estado
tempFile=/tmp/autoReverseSSHtunnel #Este será nuestro puerto local, en nuestro caso 22 para el servicio SSH
localPort=22 #Este será nuestro puerto local, en nuestro caso 22 para el servicio SSH
remotePort=9922
#Este será el puerto que redirigiremos en el servidor, lógicamente el
22 no puede ser ya que se está usando para el propio serviio SSH del
servidor

URLServer=<URL DEL SERVIDOR> #Este será o la IP de nuestro servidor o la dirección web
ServerSSHUser=root #Puede ser root o cualquier otro que hayamos configurado, si has seguido los pasos de mi tutorial será root
KeyFileSSH=/home/<NUESTRO USUARIO>/.ssh/id_rsa.pub #Acceso a nuestra llave privada de aceso al servidor

# *************No editar si no se conoce lo que se está haciendo *******
openTunel(){ #Abrimos el tunel
  screen -d -m -S bukkit bash -c 'ssh -R $remotePort:localhost:$remotePort $ServerSSHUser@$URLServer -i $KeyFileSSH -N'
  touch $tempFile
}

case "$1" in
  start)
    checkCommand=`ls $tempFile 2> /dev/null` #Comprobamos si ya se ha ejecutado el script
    if [[ -z "$checkCommand" ]]
      then #No se ha ejecutado
      echo "$(date) $line Al parecer aun no hay ningun tunnel creado" | tee $logDir
      openTunel
      echo "$(date) $line El tunel aparentemente ha sido creado" | tee -a $logDir
    else #Ya se a creado, comprobamos que el tunel esté activo
      echo "$(date) $line El tunel aparentemente está creado comprobando que esté el proceso aún activo" |       tee -a $logDir
      CommandCheck=`nc -dvzw$URLServer $remotePort> /dev/null`
      #if [ -z "$CommandCheck" ]
      if [ $? -eq 1 ]
        then #El tunel ya no está activo, lo reabrimos
        echo "$(date) $line El tunel ya no está activo, hay que recrearlo" | tee -a $logDir
        openTunel
      else #El tunel sigue activo, no hacemos nada
        echo "$(date) $line El proceso está aun activo" | tee -a $logDir
      fi
    fi
    exit 0
  ;;
  stop)
    exit 0
  ;;
  restart|force-reload)
    $0 stop
    sleep 8
    $0 start
  exit 0
  ;;
  *)
    echo "Uso: $0 {start|stop|restart}" >&2
    exit 1
  ;;
esac


Tenéis que editar los parámetros de configuración, si habéis seguido este tutorial al pié de la letra con modificar sólo los parámetros en verde es suficiente.

Por último le damos permisos de ejecución:

# chmod +x /usr/bin/autoReverseSSHtunnel


Podemos testear ya nuestro tunel simplemente desde el interprete de ordenenes ejecutamos

$ autoReverseSSHtunnel start


Si se a creado todo correctamente reciviremos el mensaje "El tunel aparentemente ha sido creado" y podremos testearlo del siguiente modo:

$ ssh @ -P 9922


Si nos pide usuario y contraseña enhorabuena todo funciona correctamente. Por ejemplo también podeis testearlo con ConnectBot y Android conectado a la red movil.

Por útlimo vamos a hacer que el escript se ejecute cada minuto, asi si el tunel cae se levantará de nuevo automáticamente sin nuestra intervención.

Para ello lo añadiremos como una tarea de CRON, como nuestro usuario

$ crontab -e


Y añadimos lo siguiente:

* * * * * /usr/bin/autoReverseSSHtunnel start >/dev/null 2>&1


Y listo, con esto ya tendremos todo lo necesario para conectarnos desde fuera de casa a nuestro ordenador a una consola SSH.

Mas adelante tocaremos como lanzar un servidor VNC en nuestra casa para tener una interfaz gráfica.

Configuración del servidor: Parte 2

Saltarse el bloqueo de puertos del Proxy

Bien, con esto tenemos cubierto conectarnos a nuestra casa desde cualquier sitio con acceso directo a Internet. Pero lamentablemente desde nuestro curro no es así, si intentamos conectar con nuestro ordenador al puerto 9922 de nuestro servidor nos bloqueará la conexión.

Bien como hemos investigado tenemos el puerto HTTPS abierto. Y este el proxy no lo puede filtrar pues si no nos sería imposible navegar a páginas web seguras. Bien pues aprovecharemos esta situación para colarnos a través de ahí. Asique lo primero que tenemso que hacer es configurar nuestro servidor para que aparente tener un servicio HTTPS y en realidad abrir una conexión SSH.

Bien yo para ello me he valido de la utilidad SSLH, digamos que esto hace que podamos tener multiples servicios en un solo puerto, de modo que conectándonos ahí dependiendo de lo que solcitemos (una web HTTPS, una conexión SSH, una VPN...) nos redirija de forma transparente al servicio correspondiente.

En nuestro caso vamos a hacer que en el puerto HTTPS pueda convivir sin problemas una web con un servidor seguro HTTPS y nuestro servicio SSH.

Configuarar apache, en caso de quererlo usar para servir páginas web seguras

Lo primero, es que si estamos usando ya Apache (o cualquier servidor web) hay que configurarlo para que escuche únicamente la interfaz local en el modo SSH, si no tienes apache puedes ignorar estos pasos

Editamos el archivo de configuración de puertos de escucha de apache:

# nano /etc/apache2/ports.conf

Y editamos las líneas donde ponga *:443 y lo sustituimos por 127.0.0.1:443, debería quedar algo parecido a esto:


# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
        Listen 127.0.0.1:443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 127.0.0.1:443
</IfModule>

Y reiniciamos apache

# service apache restart

Insalar y configurar SSLH


Empezamos, lo primero en nuestro servidor instalamos SSLH:

# apt-get update; apt-get install sslh

Y lo configuramos

# nano /etc/default/sslh

Y lo dejamos de este modo:

# Default options for sslh initscript
# sourced by /etc/init.d/sslh

# Disabled by default, to force yourself
# to read the configuration:
# - /usr/share/doc/sslh/README.Debian (quick start)
# - /usr/share/doc/sslh/README, at "Configuration" section
# - sslh(8) via "man sslh" for more configuration details.
# Once configuration ready, you *must* set RUN to yes here
# and try to start sslh (standalone mode only)

RUN=yes

# binary to use: forked (sslh) or single-thread (sslh-select) version
# systemd users: don't forget to modify /lib/systemd/system/sslh.service
DAEMON=/usr/sbin/sslh

DAEMON_OPTS="--user sslh --listen :443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"

Una vez editado iniciamos sslh

# /etc/init.d/sslh start

Configurar el ordenador que está detrás del proxy

Ahora ya pasamos a nuestro objetivo real, el ordenador detrás del proxy. Presupongo que tristemente tendrá Windows, por lo que me centraré en esta plataforma.

Descargar y configurar Putty para conectar con el servidor

Lo que haremos es un puerto local, tunelizarlo a través de SSH a nuestro servidor y de ahí este a nuestra casa. Para ello nos valdremos de la herramienta Putty

Es portable por lo que no necesitamos ni permisos de administrador para usarla. Si no podéis aceder a internet directamente a archivos .exe podéis jugar mandandolo por correo con otra extensión o dentro de un zip o un rar, por pendrive... hay mil maneras.

También necesitaremos la clave privada que generamos en los pasos anteriores para poder conectar con nuestro servidor.

Bien una vez bajado lo configuramos del siguiente modo:

Por ultimo volvemos a la imagen 1 y guardamos la configuración con el nombre que queramos y pulsamos en save y luego ya en open. Si vemos nuestro interprete de ordenes del servidor perfecto! Lo hemos logrado! nos acabamos de saltar el proxy!

Conectar con nuestro ordenador de casa

Bien, pero nos queda un paso mas, conectar con casa. Para ello SIN CERRAR la ventana del Putty que tenemos ahora abierta, abrimos otra vez PUTTY. Pero esta vez configuramos del siguiente modo

Unicamente pondremos en la dirección ip "localhost" y el puerto el que hemos establecido mas arriba en el tunel, en nuestro ejemplo el 9922, ponemos un nombre distinto al anterior, guardamos y por ultimo open. Si todo a ido bien, misión cumplida! estaremos conectados con nuestra casa!

(Opcional) Acceder a todo internet y saltarse las páginas bloequeadas del proxy

Para que internet funcione mas rápido en vez de desviar la conexión hasta casa lo que haremos será unicamente desviarla hasta nuestro servidor y salir a través de ahí. Así burlaremos al proxy.

Es tan simple como abrir putty, y seleccionamos nuestra conexión con el servidor, cargamos los ajustes y vamos de nuevo a la opción de "Tunnels" y añadimos lo siguiente:

Volvemos a la pantalla inicial, guardamos y abrimos la conexión.

Ahora iremos a nuestro navegador Chrome o Firefox, he instalamos la extensión Foxyproxy. Una vez instalado añadimos una nueva conexión y lo dejamos así:

Guardamos y activamos la conexión desde el iconito de foxyproxy en la barra de herramientas.

Si todo va bien estaremos navegando por todo internet sin preocuparnos de la lista negra del proxy de nuestra empresa.

La única pega es que aparentemente para cualquier navegador estaremos navegando desde donde esté hubicado nuestro servidor, si es un impedimiento en vez de editar la configuración del servidor lo que haremos será editar la de la conexión de Putty de nuestra casa, el resultado será e lmismo sólo que mas lento.

(Opcional) Desviar el trafico de Windows por nuestro tunel

Verás que muchos programas no admiten las conexiones por un Proxy tipo Socks, por lo que es necesario tener "algo" que simule ser un proxy que nos redirija el tráfico por nuestro tunel. Para ello yo me valgo de Polipo. Os dejo esta versión configurada para usarlo con la configuración de este tutorial.

Aqui lo tenéis

Lo descomprimís y abris el archivo "launch.bat" y solo tenéis que configurar los programas (y windows si queréis) para usar el proxy con la dirección ip "localhost" y puerto "8880".

(Opcional) Lanzar un servidor VNC

Quizá para algunas cosas sea un poco complicado hacerlas desde la consola, asique para acceder a un entorno gráfico funcional podemos lanzar en casa un servidor VNC y al igual que con el SSH tunelizar la conexión a través de nuestro servidor y en nuestro ordenador detrás del proxy con un cliente VNC conectarnos a casa

Configurar el servidor VNC

De los que he probado el servidor VNC que mejor resultado me ha dado es TigerVNC, lamentablemente es el mas dificil de configurar. Asique os dejo una pequeña guía de como hacerlo en la ultima versión de Raspbian, la cual valdrá también para Debian y Ubuntu.

Lo primero, actualizar repositorios e instalarlo

# apt-get update; apt-get install vnc4server

Ahora pasamos a configurarlo. Lo primero es crear un nuevo tunel para nuestro servidor VNC, para ello crearemos una copia de el script que usamos para nuestro servidor SSH:

# cp /usr/bin/autoReverseSSHTunnel /usr/bin/autoReverseVNCTunnel

y cambiamos solo los siguientes parámetros (os lo marco en azul)

# nano /usr/bin/autoReverseVNCTunnel

#!/bin/bash
### BEGIN INIT INFO
# Provides: autoReverseVNCtunnel
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: autoReverseVNCtunnel
# Description: Enable an a Tunnel from localhost to other machine
### END INIT INFO

# *************Parámetros de configuración******************
logDir=/var/log/autoReverseVNCtunnel #Este será nuestro archivo de logueo para comprobar el estado
tempFile=/tmp/autoReverseVNCtunnel #Este será nuestro puerto local, en nuestro caso 22 para el servicio SSH
localPort=5900 #Este será nuestro puerto local, en nuestro caso 5900 para el servicio VNC
remotePort=9923
#Este será el puerto que redirigiremos en el serivdor

El resto del archivo lo dejamos tal cual está.

Ejecutando simplemente:
# autoReverseVNCTunnel start
 
Ya se nos creará el tunel de nuestra casa al servidor. Ahora es necesario configurar el servidor VNC. Para lanzarlo sólo cuando yo lo necesite, he creado un par de Script, uno para pararlo y otro para arrancarlo.
 
# nano /usr/bin/iniciarVNC
 
vncserver -geometry 1200x800 :0
# nano /usr/bin/pararVNC
 
vncserver -kill :0
vncserver -kill :1
 
Y por  último damos permisos de ejecució na cada script
 
# chmod +x /usr/bin/iniciarVNC
# chmod +x /usr/bin/pararVNC
 
Configuramos una clave de acceso que usaremos mas adelante para conectarnos con el VNC, usaremos el siguiente comando:
 
# vncpasswd ~/.vncpasswd
 
Y ahora por último configuramos nuestra sesión de VNC. Al arrancar nuestro servidor ejecutará las ordenes contenidas en el archivo ~/.vnc/xstartup
 
# nano ~/.vnc/xstartup
 
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#Inciar LXDE
startlxde &
#Iniciar KDE
#startkde &
 
Podéis comentar la linea startlxde & (añadiendo un "#" al inicio) y descomentar #startkde &  (quitando el "#") para que inicie KDE en vez de LXDE como escritorio en la sesión de VNC
 
Si usamos ahora el comando:
 
# iniciarVNC
 
Ya tendremos nuestro VNC en funcionamiento y accesible a través del puerto 9923 de nuestro servidor intermedio.
 

Configurar el ordenador tras el proxy para conectarse a VNC de nuestra casa.

Al igual que en el caso de SSH, lo primero es configurar la conexión del putty de nuestro servidor para crear un tunel al puerto 9923. Para ello, cerramos cualquier sesión de putty que tengamos abierta. Abrimos nuevamente Putty cargamos la configuración de Mi Servidor. Y añadimos en la seccion de tuneles lo siguiente:

Recordad volver a la pantalla inicial y guardar los cambios antes de picar en Open.

Ya tenemos nuestro tunel preparado, ahora necesitamos un cliente con el que conectarnos, para ello podemos usar RealVNCViewer, que es sencillito.

En la ventana añadís una nueva conexión dejándolo del siguiente modo:

Aceptais y ya nos pedirá la contrasña que hemos configurado en el paso anterior. Y listo ya tenemos el escritorio de nuestra casa completamente funcional en nuestro ordenador detrás del proxy.

Añadir nuevo comentario