domingo, 3 de agosto de 2014

Raspberry Pi como hotspot con servidor proxy

Como ya hemos dicho anteriormente, la principal cualidad de nuestra Raspberry Pi no es precisamente su potencia de cálculo sino su bajo consumo lo que hace que pueda llevarse horas y horas de funcionamiento continuado haciendo operaciones relativalemente sencillas por lo que se puede utilizar perfectamente como punto de acceso inalámbrico de alto rendimiento.
La idea general de nuestro proyecto sería tal que esta:



Antes que nada tendremos que definir un par de términos:

Hotspot: Es un punto de acceso inalámbrico, es decir, vamos a crear una red wifi mediante la cuál podremos conectarnos a internet. Vendría a ser como un router wifi pero totalmente configurable.

Servidor proxy: Un servidor proxy es un sistema que proporciona internet a los demás equipos de tal manera que un ordenador se conecta al servidor proxy para que este acceda a internet en su nombre. En principio parece algo complicado y que no tiene mucha utilidad porque podríamos conectar directamente todos los ordenadores a internet sin necesidad de un punto intermedio pero el proxy presenta unas ventajas:

-hace un caché de las direcciones y contenidos a los que se ha tenido por lo  que la velocidad de internet a la hora de cargar una página que ya hayamos visitado (nosotros o cualquiera de los componentes de la red) aumente considerablemente al leer no de la web sino de su memoria interna mientras que estamos ahorrando tráfico en internet

-podemos bloquear páginas a las que no se deben de tener acceso

-si disponemos de un proxy conseguiremos ahorrar tráfico lo que nos da la oportunidad de conectar un mayor número de equipos a internet de los que se podrían conectar si hiciéramos una conexión directa.

-existe la posibilidad de balanceo de velocidad entre equipos

-podemos incluirle un antivirus para que filtre todo lo que entra por internet sin necesidad de que ralentice a los demás equipos 



Instalación y puesta en marcha de Hotspot:
Instalamos elementos necesarios:
sudo aptitude install hostapd hostap-utils iw bridge-utils

Modificamos lo siquiente para hacer que se cargue siempre al encender el raspberry:
sudo nano /etc/init.d/hostapd
Añadimos en la última línea:DAEMON_CONF=/etc/hostapd/hostapd.conf


Configuramos hotsapd:
sudo nano /etc/hostapd/hostapd.conf

Nos debe de salir esto:
ctrl_interface=/var/run/hostapd
###############################
# Basic Config
###############################
macaddr_acl=0 auth_algs=1
# Most modern wireless drivers in the kernel need driver=nl80211
driver=nl80211
##########################
# Local configuration...
##########################
interface=wlan0
bridge=br0
hw_mode=g
#es un driver muy utilizado por las tarjetas inalámbricas, tomar este como por defecto#

ieee80211n=1
country_code=ES 
#elegimos un canal que no esté ocupado por las demás wifis#channel=1
#ponemos el nombre de la red wifi a crear#
ssid=nombrewifi
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
#contraseña de la red wifi#

wpa_passphrase=mi contraseña
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP


Creamos la conexión puente:
sudo nano /etc/network/interfaces

auto lo

iface lo inet loopback
auto br0
iface br0 inet static
address 192.168.1.100
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge-ports eth0 wlan0


Reiniciamos el sistema y ya tenemos hecho nuestro punto de acceso wifi


  Servidor proxy:

Vamos a instalar Squid ya que es un referente del software libre en cuanto a eficiencia. La misión de este programa es el de almacenar en caché direcciones web, contenidos de las mismas y DNS con el fin de acelerar las conexiones recurrentes
  


Si nos ponemos a pensar, cuando nos conectamos a internet, quitando cuando estamos buscando algo nuevo, no solemos salirnos de un grupo de webs que serían unas 5 o 10 a las que siempre visitamos. Squid va a hacer que la velicidad de internet se duplique almacenando estas páginas en su memoria, porque aunque hayan cambiado parte del contenido, vamos a seguir utilizando datos anteriormente guardados como por ejemplo su IP de acceso y sus "templates"
o estilos de letra, fondo,...ect

Instalamos squid:
sudo apt-get install squid

Configuramos el proxy:  
sudo nano /etc/squid/squid.conf

Buscamos y modificamos las siguientes lineas:
Cantidad de memoria asignada a caché:
cache_mem 170 MB

Modicicamos el rango de almacenamiento en memoria:
minimum_object_size 0 KB
maximum_object_size 100000 KB

Optimizamos utilización de memoria:
cache_swap_low 95
cache_swap_high 98


Lugar y dimensión del almacenamiento en disco:
Vamos a utilizar como caché en disco la unidad de disco externo llamada SSD con una capacidad de 10Gb utilizando 16 directorios con 256 subniveles
cache_dir ufs /var/spool/squid 100 16 256
Cambiamos:
cache_dir ufs /mnt/SSD/squid 10000 16 256

Nota: debemos de configurar el sistema para que monte automaticamente el disco duro externo cada vez que arranque. Véase
owncloud-en-raspberry en donde se explica.

Fijamos origen de conexiones:
La IP de nuestra red empieza por la 192.168.1.0 hasta la 192.168.1.255
#Recommended minimum configuration:
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl nuestrared src 192.168.1.0/255.255.255.0


Seguidamente buscamos:
Donde en  squid-block.acl vamos a colocar una lista de todas las páginas web a la que vamos a prohibir el acceso.

 INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
# block sites
acl blocksites url_regex "/etc/squid/squid-block.acl"
http_access deny blocksites
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
http_access allow nuestrared
http_access deny all
# And finally deny all other access to this proxy


Ajustamos DNS:
En mi caso he utilizado los DNS de Jazztel, pero dependiendo de la compañía contratada elegimos unos u otros:

#       Example: dns_nameservers 10.0.0.1 192.172.0.4
dns_nameservers 87.216.1.65 87.216.1.66


Memoria caché para IP:
#Default:
ipcache_size 1024
ipcache_low 90
ipcache_high 95

#  TAG: fqdncache_size  (number of entries)
#       Maximum number of FQDN cache entries.
#
#Default:
fqdncache_size 1024



Hay veces en que cuando cargamos una página web, esta no avisa al proxy que ha cambiado y en vez de cargar la página actualizada, accedemos a la antigua que tenemos en memoria, si sucede esto, hacemos una lista de las páginas en que nos ocurre y las colocamos en un fichero no_cache.txt diciéndole a nuestro proxy que no las almacene en memoria y que siempre vaya a buscarlas directamente a internet.
#Default:
        acl no_cachear dstdomain "/etc/squid/no_cachear.txt"
        no_cache deny no_cachear
        always_direct allow no_cachear
# none


Para redireccionar todas las direcciones al puerto proxy 3128 ponemos el servidor en modo transparente:
# Squid normally listens to port 3128
http_port 3128 transparent


Convencemos a iptables para que nos permita redireccionar el tráfico desde el puerto 80 de las páginas web hasta el 3128 que es el del proxy:
sudo nano /etc/init.d/proxy-rules.sh

Y añadimos en la última fila:
iptables -t nat -A PREROUTING -i br0 -p tcp -m tcp --dport 80 -j REDIRECT --to-port 3128

Le damos permiso de ejecución:
sudo chmod +x /etc/init.d/proxy-rules.sh

Sólo nos quedaría reiniciar el sistema y ya tendríamos nuestro punto de acceso optimizado :)

Para ver la actividad del proxy tecleamos:
sudo tail -f /var/log/squid/access.log

Nota: el servidor proxy trabaja con el puerto 3128 por lo que tendríamos que abrirlo del router