martes, enero 15, 2013

Acceder desde Internet a tu Raspberry Pi. IPs dinámicas, puertos, DNS y túneles SSH

Una de las ventajas de la RPI es precisamente que su bajo consumo hace que no sea un crimen dejarla encendida todo el día. Eso sí, para que sea realmente útil debes tener la posibilidad de acceder a ella desde cualquier ordenador, no solo desde tu LAN. En esto no se diferencia de cualquier otro ordenador pero demos un repaso a lo que necesitamos.

  • La RPI configurada  y conectada a tu red local
  • Acceso a nuestro router para redireccionar puertos
  • Un ordenador con un cliente SSH: en linux/unix/mac directamente la línea de comandos, desde windows puedes usar Putty.
  • Opcionalmente un servicio de DNS dinámico (en nuestro caso www.dnsexit.com) y una cuenta shell para probar el servicio ssh desde el exterior de nuestra red.

Configurar IP local fija
Comenzamos por fijar la IP de nuestra RPI. Esto es imprescindible para que la cuando habramos el puerto en el router siempre la encuentre en la misma dirección. Para ello editamos el fichero /etc/network/interfaces

pi@raspberrypi ~ $ sudo nano /etc/network/interfaces

...y comentamos la línea del DHCP y/o la sustituimos directamente por este código: 

#iface eth0 inet dhcp
iface eth0 inet static
address   192.168.0.254
netmask   255.255.255.0
network   192.168.0.0
gateway   192.168.0.1
broadcast 192.168.0.255

Podéis ver que he escogido la dirección 192.168.0.254 para mi RPI y que mi red está en el rango 192.168.0.0. Debes adaptar esta configuración a tu red, puede que en tu caso sea la 192.168.1.0 o cualquier otra. Para que los cambios sean efectivos debes reiniciar los dispositivos de red con ifdown y ifup, pero si estás accediendo por red ¡perderás la conectividad! Casi que lo más fácil es que reinicies directamente la RPI.

pi@raspberrypi ~ $ sudo reboot

Aseguramos que podemos acceder por ssh a nuestra RPI. A estas alturas ya debes tener claro como se hace.

Desde otra máquina linux/mac:

ssh pi@192.168.0.254

Por cierto, si no has cambiado la contraseña de tu RPI sería buen momento para hacerlo antes de ponerla a disposición de todo el mundo en Internet.

Accediendo desde internet. Redirección de puertos
Para poder acceder a una máquina de una red local desde internet debes abrir un puerto en tu router y redireccionarlo a la máquina y puerto correspondiente. En nuestro caso debes acceder a tu router y redireccionar el puerto 22 externo de tu router al mismo puerto 22 y a la IP que has escogido para tu RPI. Esta configuración es similar en todos los routers pero a la vez casi siempre el menú es diferente. Busca información al respecto en internet si tienes dudas.

Puede que más adelante quieras que externamente el puerto no sea el 22 o abrir sólo el puerto de web (80) pero como algunos ISP no permiten acceder a todos los puertos lo mejor es que de momento lo pruebes así.

Si has redireccionado correctamente los puertos y configurada correctamente la IP fija ya deberías poder acceder por SSH a tu RPI desde internet. Comienza comprobando que el puerto está correctamente abierto con http://www.yougetsignal.com/tools/open-ports/. La misma página te dice cuál es la dirección ip externa de tu router, selecciona el puerto 22 y comprueba que te indica que el puerto está abierto.


Bien, si todo ha ido bien ya podrías conectar por ssh desde cualquier máquina de internet. Si tienes acceso a una cuenta shell gratuita de las que hay por internet podrías conectarte (usando la cadena pi@ip_externa) para comprobarlo. Yo tengo una cuenta que uso con frecuencia en http://www.cjb.net/shell.html por si te sirve de algo.

Configurando DNS para una IP dinámica
Ya podemos acceder a nuestra RPI desde internet, el problema es que la dirección IP que le asigna nuestro ISP al router suele cambiar cada vez que lo reiniciamos, además no suelen ser precisamente fácil de recordar. Para solventarlo lo mejor es usar un servicio de DNS dinámica gratuito.

Yo he utilizado por recomendación del foro de RPI  el servicio http://www.dnsexit.com/ que te "regala" un dominio del tipo loquesea.com. Una recomendación, si tienes intención de colgar una web no uses un dominio "regalado", como empieces a ser popular rápidamente se apropiarán de él, pero para un servicio personal es ideal.

El caso es que una vez registrados obtendrás un dominio gratuito. Lo que haremos ahora es instalar un servicio en la RPI que periodicamente comprobará nuestra IP externa y la actualizará siempre que sea preciso. ¿Cómo lo hacemos? Pues así de fácil:

wget http://downloads.dnsexit.com/ipUpdate-1.6-2.tar.gz
tar xzvf ipUpdate-1.6-2.tar.gz 
sudo ./setup.pl

Cuando nos pregunte si queremos instalarlo como un daemon responderemos que sí para que se inicie con la RPI. Si te dice algo de que el fichero no existe vete a http://downloads.dnsexit.com/ y comprueba que versión es la que está activa.

Si todo ha ido bien podrás usar usar la dirección cadena pi@tudominio.com para conectarte a tu RPI. Muy cómodo ¿verdad?

Accediendo a otros puertos en la RPI
Tal vez quieras a acceder a otros puertos de tu RPI, típicamente al puerto 80 del servidor web, pues tienes dos opciones.
  1. Abrir otro puerto en tu router. Es la opción si quieres que esté accesible para cualquiera siempre que tu RPI esté encendida. Basta con hacerlo igual que antes con el 22.
  2. Crear un tunel SSH. Así sólo tú podrás acceder en el momento que quieras al puerto que desees. Un túnel ssh tiene la ventaja adicional de que va encriptado y es tremendamente seguro. Crea una conexión transparente entre un puerto de nuestra máquina y otro puerto de una máquina de la red destino, en nuestro caso será la propia RPI. ¿Cómo se configura? Muy sencillo:
Supongamos que tienes el servidor web activo en tu RPI. Desde una máquina externa hacemos la siguiente conexión:

gonzalo@matilda:~$ ssh -L 81:localhost:80 pi@tudominio.com

Así creamos un tunel  entre puerto 81 de la máquina que estamos usando y el puerto 80 de la RPI (localhost).

Ahora desde el ordenador desde el que hemos iniciado la conexión abrimos una ventana del navegador y  visitamos la dirección http://localhost:81. Si todo ha ido bien debería responder el servidor web de tu RPI.

Podrías también abrir otros puertos como el del VNC en el caso de que tuvieras instalado el servicio y quisieras acceder remotamente al escritorio, o al MySQL o a cualquier servicio en general que se cuelgue de un puerto local. Puedes abrir multiples puertos al mismo tiempo con una única cadena de conexión. Como puedes imaginar, este método es muy útil porque permite acceder a tantos puertos como necesites de tu RPI abriendo un único puerto en  tu router.

Accesos ilegales
Haberlos haylos... hay bots que recorren internet buscando puertos ssh abiertos (de ahí la importancia de no usar la contraseña por defecto). Podrías cambiar el puerto abierto en tu router del 22 a cualquier otro para luego indicar que se redirija al puerto 22 en la red interna. Pero si tienes curiosidad y no te preocupa demasiado déjalo un par de días abierto a ver quien intenta acceder ilegalmente. Puedes comprobarlo con el comando:

pi@raspberrypi ~ $ cat /var/log/auth.log* | grep "Invalid user" 
Jan 15 09:04:00 raspberrypi sshd[23921]: Invalid user ____ from 202.77.107.203

En mi caso, en menos de 12h ya tenías varios intentos de acceso :-D. En este post se habla un poco más del tema.

4 comentarios:

  1. Hola he hecho todo lo que indicas en tu tutorial, pero cuando intento crear los puertos en mi router comtrend (jazztel) a través de la página yougetsignal me dice que solo tengo abierto el 22, los demás no. No consigo acceder a mi raspberry desde internet. Si puedo desde todos mis dispositivos. Me puedes ayudar?

    ResponderEliminar
  2. Interesante aportación

    ResponderEliminar
  3. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  4. Me ha venido estupendamente bien tu artículo, estoy comenzando en este mundillo de la raspi y tu lo explicas divinamente, gracias

    ResponderEliminar