Raspberry Pi como Punto de Acceso con hostapd | Algo de Linux

martes, 20 de mayo de 2014

Raspberry Pi como Punto de Acceso con hostapd

En un post anterior, vimos cómo conectar nuestra Raspberry Pi a la red usando un interfaz wifi. En este post, vamos a ver justo lo contrario: Cómo convertir nuestra Raspberry Pi en un Punto de Acceso que permita a otros clientes conectarse a la red vía wifi.

Lo primero que haremos será conectar el interfaz usb wifi a uno de los puertos de la Raspberry. Una vez conectado, abrimos un shell y ejecutamos el comando lsusb:
pi@raspberrypi:~$ lsusb 
Bus 001 Device 014: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 
Bus 001 Device 015: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 016: ID 046d:c52b Logitech, Inc. Unifying Receiver 
Bus 001 Device 017: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB 
Bus 001 Device 018: ID 048d:1336 Integrated Technology Express, Inc. SD/MMC Cardreader 
Bus 001 Device 019: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter 
Bus 001 Device 020: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge

Con este comando detectaremos todos los dispositivos usb conectados a la Raspberry, y en particular, el interfaz wifi usb que hemos conectado. Como podéis ver, en mi caso es un Ralink con chipset RT5370.

Instalamos el firmware para dispositivos con ralink y realtek. El primero lo instalo porque es el firmware de mi dispositivo y el segundo porque es muy común y me serviría en caso de que conecte un dispositivo Realtek:
pi@raspberrypi:~$ sudo -i root@raspberrypi:~# apt-get install firmware-ralink firmware-realtek
Instalamos también el paquete wireless-tools:
root@raspberrypi:~# apt-get install wireless-tools
A continuación, editamos el fichero /etc/network/interfaces para asignar una dirección IP estática al interfaz wlan0 (nuestro interfaz wifi):
auto lo

iface lo inet loopback
iface eth0 inet dhcp

iface wlan0 inet static
   address 192.168.2.1
   netmask 255.255.255.0

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp
Observad que he comentado la parte de configuración dinámica de la wifi en lugar de borrarla, más que nada para no perderla.

He marcado en negrita las líneas que definen la configuración de IP estática en este fichero. Resaltar que nuestra Raspberry estará conectada en cada interfaz a una red diferente:
  • Interfaz eth0 (conecta la Raspberry a nuestra LAN): 192.168.1.0/24
  • Interfaz wlan0 (hace de interfaz de acceso wifi): 192.168.2.0/24
Si os fijáis en la configuración del fichero /etc/network/interfaces, la asignación de dirección IP en la interfaz eth0 se hace por DHCP y en wlan0 de forma estática.

Una vez configurada la red, vamos a necesitar un servidor dhcp y, para ello, usaremos dnsmasq. No vamos a entrar en muchos detalles de configuración de dnsmasq porque lo trataremos en un artículo más adelante. Así que lo instalamos:
root@raspberrypi:~# apt-get install dnsmasq
Una vez instalado, vamos a configurarlo. Para ello, creamos un fichero en /etc/dnsmasq.d/, como por ejemplo: /etc/dnsmasq.d/mired con la siguiente configuración mínima:
interface=wlan0
dhcp-range=192.168.2.50,192.168.2.254,12h
dhcp-option=3,192.168.2.1
server=8.8.8.8
server=8.8.4.4
Con esta configuración mínima, le estamos indicando a dnsmasq:
  • Que escuche peticiones tan sólo en la interfaz wlan0.
  • Que asigne direcciones IP de forma dinámica en el rango 192.168.2.50 - 192.168.2.254.
  • Que la puerta de enlace es la 192.168.2.1 (la interfaz wlan0 de nuestra Raspberry Pi).
  • Que utilice los servidores DNS de Google: 8.8.8.8 y 8.8.4.4
Una vez realizados los cambios, reiniciamos el servicio:
root@raspberrypi:~# service dnsmasq restart
A continuación, instalamos el paquete hostapd:
root@raspberrypi:~# apt-get install hostapd
El siguiente paso será configurar hostapd. Para ello creamos un archivo de configuración /etc/hostapd/hostapd.conf:
# interface used by access point
interface=wlan0

# firmware driver
driver=nl80211

# access point SSID
ssid=MiWifi

# operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g)
hw_mode=g

# access point channel
channel=6

# options
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0

# key management algorithm
wpa_key_mgmt=WPA-PSK
wpa_passphrase=miclavewpa
wpa=2

# set ciphers
wpa_pairwise=TKIP
rsn_pairwise=CCMP

En este archivo es suficiente con que cambiéis los parámetros que os he marcado en negrita:
  • El nombre de la red: ssid
  • El canal: channel
  • La clave de acceso: wpa_passphrase
El siguiente paso será editar el archivo /etc/default/hostapd para añadir una línea que indique a hostapd cual es el fichero de configuración:
root@raspberrypi:~# echo 'DAEMON_CONF="/etc/hostapd/hostapd.conf"' >> /etc/default/hostapd 
A continuación reiniciamos el sistema para aplicar los cambios realizados en la configuración de red:
root@raspberrypi:~# reboot
Reinicio el sistema y no solo el servicio de red porque estoy conectado vía ssh y voy a perder la conexión al reiniciar el servicio.
Cuando vuelva a arrancar de nuevo, activo el IP Forwarding:
root@raspberrypi:~# nano /etc/sysctl.conf
Añadiendo la siguiente línea:
net.ipv4.ip_forward=1
Y aplico las reglas IPTABLES que me van a permitir redirigir el tráfico entre las dos interfaces:
root@raspberrypi:~# iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 
root@raspberrypi:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
root@raspberrypi:~# iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Si os conectáis ahora a la red Wifi que hemos creado, comprobaréis que ya podéis navegar. No obstante, las reglas de IPTABLES aplicadas se perderán cuando apaguemos el sistema. Para que se apliquen cada vez que se encienda el sistema vamos a hacer una cosa: 

Guardaremos las reglas aplicadas en este momento en un fichero:
root@raspberrypi:~# iptables-save > /etc/network/iptables.default
Y modificaremos el archivo /etc/network/interfaces para que se activen cada vez que se levante el interfaz de red, añadiendo la línea que os marco en negrita al archivo:

auto lo

iface lo inet loopback
iface eth0 inet dhcp

iface wlan0 inet static
   address 192.168.2.1
   netmask 255.255.255.0
   up iptables-restore < /etc/network/iptables.default

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

Y eso es todo. A partir de este momento, ya podéis utilizar vuestra Raspberry Pi como punto de acceso de cualquier red a la que la conectéis mediante ethernet.
Publicado por primera vez en http://enavas.blogspot.com.es

6 comentarios:

Marwuin dijo...

Muy bien explicado, gracias por compartir esta información. Tengo algunas dudas.
1) Que alcance logró obtener (distancia de conexión)?.
2) La conexión es estable?
3) El RPi suministra la corriente suficiente para funcionar o sería recomendable usar alimentación externa?.
4) Cuantos usuarios concurrentes se pueden conectar?.

Esteban M. Navas Martín dijo...

Buenas tardes. Lo siento, pero realicé este montaje ya hace más de un año y no hice un análisis tan exhaustivo como para proporcionarte los datos que me pides, aunque me parece muy interesante.
Si te animas a probarlo y a realizar el análisis tú mismo, te agradezco que me lo comentes.

Anónimo dijo...

Bueno dias

Muchas gracias por el tuto!
sabrias decirme si podría crear dos wlan, una para recibir los datos del router y así poder ocn la otra crear el AP,para evitar que la Raspberry esté conectada por ethernet al router? tengo un tp link wl722n que tiene modo AP y la quería usar como repetidor para dar mayor cobertura a la red de casa!

Muchas gracias!

Anónimo dijo...

auto lo

iface lo inet loopback
iface eth0 inet dhcp


# para que me funcionara a mi faltaba: auto wlan0
auto wlan0
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0
up iptables-restore < /etc/network/iptables.default

#De resto todo muy bien
#

Rait Loredo Lucas dijo...

Saludos!, gracias por el aporte, el servidor dhcp lo hice con isc-dhcp-server. Una ayuda por favor soy alguien que esta queriendo adentrarse en el campo de linux y mas aun con el raspberry. Mi problema es el siguiente, quiero ver el registro de todos los dispositivos conectados al punto de acceso (en este caso el raspberry) con sus respectivos nombres y respectivas IP's asignadas, posterior a esto rescatar ese registro, podria ser en un archivo con extension .txt para que posteriormente la guarde en una base de datos. Una ayuda porfavor, lo mas importante es ver el registro de los dispositivos conectados con sus respectivas IP's.

Rait Loredo Lucas dijo...

Saludos!, gracias por el aporte, el servidor dhcp lo hice con isc-dhcp-server. Una ayuda por favor soy alguien que esta queriendo adentrarse en el campo de linux y mas aun con el raspberry. Mi problema es el siguiente, quiero ver el registro de todos los dispositivos conectados al punto de acceso (en este caso el raspberry) con sus respectivos nombres y respectivas IP's asignadas, posterior a esto rescatar ese registro, podria ser en un archivo con extension .txt para que posteriormente la guarde en una base de datos. Una ayuda porfavor, lo mas importante es ver el registro de los dispositivos conectados con sus respectivas IP's.