22 diciembre 2012

Haciendo un "puente wireless" para la Raspberry PI

Si han estado revisando mi últimos videos, notarán como me toca trabajar literalmente "en la cocina". Sucede que junto a la cocina tenemos un pequeño comedor que es una mesita de vidrio templado que me parece maravillosa para trabajar con la Raspberry PI y el Arduino ya que tiene espacio y puedo estar cortando cosas sin miedo a rayar nada.

El problema es que mi módem se encuentra en una sala de la casa que no tiene mucho espacio para trabajar así que necesitaba encontrar una forma de conectar la RasPI sin tener que sacar cableado UTP ya que primero no tengo y segundo tenía mucha pereza de comprar un dongle Wireless.

Voy a explicar en esta entrada mi configuración de red por si a alguien es útil, aunque lo más probable es que termine comprando un dongle Wireless para la RasPI.

Esta configuración les puede servir adicionalmente por si tienen un servidor web en otro segmento de red que no está conectado directamente al módem de Internet (en este caso mi RasPI).


Mi Problema


Para trabajar en los "prototipos" de las últimas entradas tengo que tener mi laptop cerca de la Raspberry. Mi laptop tiene dual boot con Windows 7 y Slackware 14 corriendo XFCE. La mayoría del tiempo trabajo en Windows pero es muchísimo más cómodo programar en Linux.


La Raspberry se encuentra conectada directamente a la laptop por medio de un sencillo cable UTP. En Windows activo la conexión compartida a internet y comparto la conexión Wireless.

En Linux tengo aun mas posibilidades de configuración, incluso puedo crear una sub-red completa con todo y servidor DHCP para que la RasPI obtenga su dirección IP.

Conectandose al Internet


Luego de un sin fín de problemas con la conexión a Internet decidí comprar mi propio módem ADSL en eBay. Elegí el Netgear DG834G por varias razones: Primero es muy barato, pueden encontrar uno usado en eBay por menos de $25, lo segundo es que las opciones de configuración son bastante personalizables y lo último y más importante: Está basado en Linux.

Para ser más específicos, este modelo de módem utiliza BusyBox Linux, que es una versión de Linux específicamente diseñada para aplicaciones "empotradas" y que requieren un mínimo consumo de memoria.

Mi configuración actual de red es la siguiente:


Si hacen clic a la imagen verán como mi laptop se conecta al módem vía Wireless y el RasPI con conexión cableada ya sea conectándose a la laptop o directamente al módem.

En el resto de la entrada vamos a explicar como configurar el primer caso (recuadro azul) que en otras circunstancias podría servirles para darle acceso a una red que se encuentra físicamente separada del módem conectada vía Wireless o en otras palabras construir un "puente Wireless".

Configurando Slackware 14


Para hacer funcionar la configuración anterior primero tenemos que hacer algunos cambios en la configuración de Slackware que nos facilitaran enormemente la vida.

Antes de seguir: Todos los comandos que trabajen con la terminal deberán de ejecutarse desde con el usuario "root".

Lo primero que debemos hacer es habilitar el servicio "networkmanager", en Slackware esto lo hacemos escribiendo el siguiente comando:

$ chmod 755 /etc/rc.d/rc.networkmanager

Luego iniciamos el servicio:
$ /etc/rc.d/rc.networkmanager start

Este servicio nos ayudará a configurar fácilmente nuestras interfaces de red desde el escritorio, además activando este servicio podremos utilizar el widget de configuración de Wireless que se incluye en el XFCE.

Nota: Con el networkmanager activado se ignorarán las configuraciones de red manuales especificadas en "rc.inet1.conf" y "rc.wireless.conf".

Lo siguiente que tenemos que hacer es configurar la red interna, en este caso la red a donde se conecta la RasPI.

Usando XFCE abrimos el menú de aplicaciones y luego en Settings abrimos "Network Connections".

Una vez dentro de la ventana elegimos "Wired" hacemos click a donde dice "Wired connection 1"; en esta nueva ventana nos vamos a la pestaña de configuración IPV4, seleccionamos "Manual" y hacemos clic en "+Add".

La idea en este punto es agregar una dirección IP estática que funcionara como "router" para la conexión de la RasPI.
En mi caso utilizaré la siguiente configuración IP: 192.168.137.1/255.255.255.0. Esta conexión no se conectará a Internet así que pueden dejar el valor de gateway en blanco.

Una vez establecida la configuración solo cerramos todas las ventanas y esta se aplicará automáticamente al sistema.

Configurando el servidor DHCP


El Dynamic Host Configuration Protocol (DHCP) es un protocolo que nos sirve para asignar direcciones IP de manera dinámica sin intervencion del usuario. Windows incluye un pequeño servidor DHCP cuando habilitamos la conexión compartida a Internet, el problema es que es sumamente limitado y no hay manera de configurar a detalle las IPs que se asignan a menos que estemos trabajando con una versión del Windows Server.

Por suerte Linux incluye todos los servidores que por defecto, así que el siguiente paso es habilitar el servico DHCP, para ello tenemos que modificar el archivo "/etc/dhcpd.conf" con nuestro editor favorito.

Una configuración sencilla puede ser la siguiente:

subnet 192.168.137.0 netmask 255.255.255.0 {
  default-lease-time 3600;
  option routers 192.168.137.1;
  option domain-name-servers 8.8.8.8,8.8.4.4;
  range 192.168.137.100 192.168.137.254;
}

Esta configuración sencilla le dirá al DHCPD que asigne las IPs 100-254 en la red 192.168.137.0. Además establecemos el gateway por defecto de los clientes que se conecten a esta red con la opción "routers" y los dns que se asignaran a estas máquinas, que para este ejemplo usamos los servidores DNS de Google.

Luego simplemente levantamos nuestro servidor dhcpd escribiendo como root:
$ sudo dhcpd

Si quieren configurar el servicio DHCPD para que arranque al iniciar descarguen el siguiente script y copienlo en la carpeta "/etc/rc.d":

Cambien los permisos a ejecutable con el siguiente comando:
$ chmod 755 /etc/rc.d/rc.dhcpd

Y agreguen estas línea al archivo "/etc/rc.d/rc.inet2":
# Start DHCPD (the DHCP Daemon):
if [ -x /etc/rc.d/rc.dhcpd ]; then
  /etc/rc.d/rc.dhcpd start
fi

Habilitando la redirección de paquetes

Hasta este punto nuestra configuración de red esta "casi" lista. Si bien podemos conectar nuestra Raspberry PI a nuestra laptop y esta asigna correctamente la dirección IP, el gateway y los DNS esta no podrá navegar en Internet. Para que ello funcione debemos de activar el servicio de re dirección de paquetes en Linux.

Para activar el servicio de redirección de paquetes al arranque en Slackware ejecutamos el siguiente comando:

sudo chmod 755 /etc/rc.d/rc.ip_forward

Luego ejecutamos el siguiente comando para habilitar la redirección de paquetes:

sudo /etc/rc.d/rc.ip_forward start

Configurando el router Netgear


Lo primero que tenemos que hacer es agregar una ruta estática a nuestra red interna. Esto lo hacemos desde la configuración del modem en la sección de "Rutas estáticas". Dependiendo del modem que tengan deberán de buscar una opción similar:


La configuración que uso utiliza la red 192.168.137.0 como "destino" y el gateway es la IP que tiene asignada la laptop en la interfaz Wireless.

Lo último es permitir que nuestra RasPI sea accesible por el mundo. El router Netgear permite abrir fácilmente puertos para servicios que tengamos en nuestra red interna, lastimosamente solo puede abrir puertos para la red que está directamente conectada al router. Si intentamos agregar una IP que no está en la red interna configurada en la sección de LAN nos dará un error.

Aquí es donde se vuelve de gran importancia que el router sea Linux. Primero tenemos que habilitar el puerto telnet para administración remota, esto lo hacemos accediendo a la siguiente dirección de nuestro modem.

http://192.168.0.1/setup.cgi?todo=debug

Luego abrimos una consola usando Telne:

$telnet 192.168.0.1
Trying 192.168.0.1...
Connected to 192.168.0.1.
Escape character is '^]'.
BusyBox v1.00 (2009.06.09-07:57+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
#

En la consola tenemos que escribir el siguiente comando:

$ iptables -t nat \
  -A PREROUTING \
  -p tcp \
  --in-interface ppp0 \
  --dport 80 \
  -j DNAT \
  --to-destination 192.168.137.121

¿Qué es lo que hace este comando?

Traduciendo al español le estamos diciendo al modem que haga lo siguiente:

"En la tabla de Traducción de Direcciones de Red (-t nat), agregar una regla antes de rutear el paquete (-A PREROUTING) con las siguientes condiciones: Si el protocolo es TCP (-p TCP), el paquete se recibe por la interfaz de conexión de punto a punto (--in-interface ppp0) y va dirigido al puerto 80 (--dport 80). Realizar NAT de Destino (-j DNAT) a la dirección IP 192.168.137.121 (--to-destination 192.168.137.121)."

Como nuestro módem tiene una IP pública podemos redirigir todas las peticiones web a nuestro Arduino que se encuentra en una red interna y accederlo desde fuera.

No es necesario que agregemos mas configuraciones al módem ya nuestra RasPI es accesible gracias a la ruta estática que agregamos.

Probando todo


Actualmente utilizo el servicio de no-ip.com para actualizar el DNS dinámico al que apunta raspi.teubi.co en otra entrada les explicaré como utilizar este muy útil servicio para que puedan utilizar un nombre DNS en una conexión que no tiene una IP pública fija como el servicio de Turbonett.

¿Quieren ver el resultado? He colocado una pequeña página de prueba a la que pueden acceder desde la siguiente dirección:


Voy a intentar dejar conectada permanentemende la RasPI a internet. Si no pueden acceder simplemente significa que no está conectada.

Una propuesta final


Notarán que en este post he utilizado 3 sabores deLinux diferentes. Primero mi router Netgear con BusyBox Linux, luego mi Laptop que hace las veces de repetidor con Slackware Linux y por último la Raspberry PI que utiliza Raspbian.

¿Que tal si creamos un "puente Wifi" con la Raspberry PI?

Imaginen que tienen una red cableada que está separada de su red principal y quieren conectar a a un modem de Internet con Wireless. Si unimos un dongle Wifi + estas configuraciones en la Raspberry tenemos un punto de acceso cableado vía Wifi por menos de $50.

Esto es bastante barato considerando que un router wireless que podamos configurar como conexión puente muchas veces no baja de $100 en el mercado local.

No habiendo más que decir y dejando la puerta abierta a otras ideas solo me queda decirles... ¡¡Hasta la próxima!!

No hay comentarios: