Archivos Mensuales: abril 2012

[mini-howto] Cómo compartir Internet en GNU/Linux o por fin tengo Internet en Guanare!

Preámbulo

Vivir en una ciudad pequeña de los llanos occidentales como Guanare tiene muchas ventajas, es calmada, al ser pequeña se pueden hacer muchas cosas el mismo día, etc.
Uno de los inconvenientes del conjunto residencial hecho a las afueras de la ciudad, es que aunque tiene más de 5 años de construído, no hay “ni esperanzas” de que haya líneas telefónicas y la cobertura de la telefonía celular es realmente patética, para navegar en Internet tenía que ir “al pueblo” a buscar un cybercafé.

Hace algún tiempo había ideado la posibilidad de adquirir un modem con antena GSM para amplificar la señal y tener una conectividad “más decente” en mi apartamento, de estas experiencias, nace este post.

La conectividad

Luego de probadas las velocidades de las 3 principales operadoras (Movilnet, Movistar y Digitel), y comparado con el hecho que Movilnet suele tener demasiadas desconexiones aún con una señal decente y Digitel solamente conecta en EDGE, nos quedamos con Movistar, que por suerte mía, tengo una línea con plan ilimitado (de las primeras que ofertaron!).

Mi conectividad 3G con movistar en Guanare!

Antena

He adquirido una antena con conector TS9, de 2.5dbi de ganancia (próximamente compraré una de más ganancia) que me permite tener una señal medianamente aceptable en un lugar donde antes no había señal.

Antena 6 bandas 2.5Dbi

Modem 4G

He comprado un modem 4G Sierra USB Connect (AT&T, pero lo liberé, aunque puede adquirirse liberado) y luego de unas pruebas de velocidad, la más decente era una Movistar, que en algunos puntos podía tener 3 rayas UMTS.

Nota: para quien tenga más “dólares” puede adquirir el Momentum 4G de sierra Wireless que es mucho más potente.

Modem USB openConnect Sierra

El Servidor

El equipo que estoy usando como Servidor es un Lemote Fuloong Mini, con su CPU ICT Loongson-2 (arquitectura MIPSEL) y sus 80Gb en disco, es más que suficiente para ejecutar una combinación de actividades:

* Firewall y compartir Internet
* Squid3 como caché de contenido y Filtro
* DNSmasq como caché de DNS y reglas de ads blocking (bloqueo de anuncios)

He instalado Debian Wheezy (según guía adjunta: https://phenobarbital.wordpress.com/2011/07/13/instalar-gnulinux-debian-wheezy-en-una-lemote-fuloong/) en el equipo, una instalación estándar, para luego proceder a instalar el resto de paquetes.

Nota: hay un beneficio adicional de usar este equipo y es su extremadamente bajo consumo de energía, además de que es muy silencioso (está en mi cuarto y ni lo escucho encendido) por lo que es ideal para este tipo de servicios.

Conectando a Internet

Para conectar a Internet he instalado pppconfig:

aptitude install pppconfig

Luego, configuro una conexión para Movistar con los siguientes valores:
– número de llamada: *99#
– Modo de autenticación: CHAP
– Puerto: /dev/ttyUSB2

Para el chatscript, hay que modificarlo de la siguiente manera:

archivo: /etc/chatscripts/movistar

# This chatfile was generated by pppconfig 2.3.18.
# Please do not delete any of the comments. Pppconfig needs them.
#
# ispauth CHAP
# abortstring
ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED
# modeminit
'' ATZ
# pasar el pin de la conexion (si tiene)
#'' ATZ+CPIN="0000"
OK "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
OK 'AT+CGDCONT=1,"IP","internet.movistar.ve"'
# ispnumber
OK-AT-OK "ATDT*99#"
# ispconnect
CONNECT \d\c
# prelogin
# ispname
# isppassword
# postlogin
# end of pppconfig stuff

Esta línea es importante:

OK ‘AT+CGDCONT=1,”IP”,”internet.movistar.ve“‘

Esta representa el APN de tu carrier (en mi caso Movistar).

Para conectarnos, simplemente ejecuto:

$pon movistar

Y la conexión se realiza.

(Nota: ejecutar “$poff movistar” para cerrar la conexión).

Un script para conectar a Internet

Como la electricidad acá fluctua demasiado (al igual que el agua y otros servicios xD), hice un simple script que conecta a Internet y ejecuta las reglas de firewall para dejar el sistema completamente listo.

archivo: /usr/local/bin/conectar_internet.sh

#!/bin/bash
/usr/bin/pon movistar
sleep 5
/usr/local/bin/firewall.sh apply

Y este script lo llamo en la opción UP de la interfaz eth0 (la que está conectada a mi Access Point inalámbrico y a mi red local):

archivo: /etc/network/interfaces

allow-hotplug eth0
iface eth0 inet static
 address 192.168.1.1
 network 192.168.1.0
 netmask 255.255.255.0
 broadcast 192.168.1.255
 up /usr/local/bin/conectar_internet.sh

Esto me permite saber que las reglas de firewall, la redirección al proxy Squid y la conexión UMTS estarán activas cuando se encienda la interfaz eth0.

Nota: podría dedicarme más tiempo a por ejemplo, hacer “tunning” de parámetros del kernel en sysctl para mejorar el performance de la conectividad IPv4, etc, pero eso sería un próximo artículo.

Ya estamos conectados!, ahora viene el Squid y el DNSmasq.

Un sencillo ping-alive

La conexión por falta de actividad a veces se cae, entonces, hice un sencillo ping-alive que ejecuta un ping regularmente y cada 30 minutos a una lista de hosts pre-definidos.

* Creamos el script:

archivo: /usr/local/bin/ping_alive

#!/bin/bash
HOSTS="google.co.ve ftp.us.debian.org"
COUNT=4
for myHost in $HOSTS
do
 count=$(ping -w $COUNT -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
 if [ $count -eq 0 ]; then
 # 100% failed
 echo "Host : $myHost is down (ping failed) at $(date)"
 fi
done

* Lo convertimos en ejecutable:

chmod +x /usr/local/bin/ping_alive

* En orden para ejecutar cada 30 minutos, lo agregamos a crontab:

crontab -e

* Y agregamos:

# Monitorizar cada 30 minutos
30 * * * * /usr/local/bin/ping_alive

Y listo!, esto hará ping y chequeará si hay conexión cada 30 minutos.

Squid3

Squid es un software de proxy de contenido, content-filtering y caché para servicios web, ¿por qué montaría un squid en una red local?, la conexión por lo general es lenta, sobre todo en el día (con los miles de blackberrys de mis vecinos enviando pines para Canadá), y como mi esposa por lo general usa el Internet para visitar sus sitios web favoritos (pinterest, facebook, twitter, flickr, tumblr) entonces tener un servidor Squid es una gran ventaja.

Para instalar:

aptitude install squid3

Y he utilizado este archivo de configuración:

Anexo: Archivo squid.conf

Es común, no tuneado, salvo por los siguientes cambios:

  • Proxy transparente
  • he denegado vía URL_REGEX muchas direcciones a sitios web de estadísticas o banners
  • He incorporado varias reglas de refresh_pattern para conservar ancho de banda de diversos tipos de archivos comunes en Internet

Reiniciamos el squid y ya simplemente debemos aplicar el firewall

Capitulo extra: Firewall

Aplico un firewall sencillo, ya le tengo cariño a este script (lleva conmigo mucho tiempo, son suscesivas modificaciones a un script original hecho por mi amiga Nerissa Aguilera) y pues cumple su función (bloquear algunas cosas, compartir el Internet y re-dirigir todo al Proxy).

Anexo: archivo firewall.sh

El firewall tiene 3 opciones: apply (aplicar), clean (limpiar) y test (probar si será posible aplicar este script), ejemplo:

/usr/local/bin/firewall.sh apply

Aplica las reglas iptables.

DNS masq (DNS Caché)

Para mejorar la resolución DNS, colocaremos un servidor DNS que permite proveer DNS cache a la red local.

* instalar:

aptitude install dnsmasq

* editamos /etc/default/dnsmasq para definir ENABLED=1

# Whether or not to run the dnsmasq daemon; set to 0 to disable.
ENABLED=1

* Agregamos un archivo de configuración para nuestra red en /etc/dnsmasq.d y editamos este archivo:

archivo: /etc/dnsmasq.d/intranet.conf

# listen address:
listen-address=192.168.1.1
# Never forward plain names (without a dot or domain part)
domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv

Nota: agreguen “log-queries” durante las pruebas para verificar la correcta resolución de direcciones.

* Editamos el /etc/resolv.conf para agregar DNS con una resolución más rápida que el de nuestros ISP:

# google
nameserver 8.8.8.8
# opendns
nameserver 208.67.222.222
# ISP
nameserver 200.35.65.5
nameserver 200.35.65.4

Nota: el Firewall ya aplica los DNS personalizados.

* Y reiniciamos el dnsmasq:

/etc/init.d/dnsmasq restart

Recordemos además modificar DNSmasq para utilizarlo como DHCP que nos permita entregar como puerta de enlace (gateway) este equipo.

Con el DHCP, DNS, Squid3 y todo configurado, ya ponemos a funcionar todo y feliz conexión!.

Extra: Bloquear anuncios (advertisements) con DNS masq

¿Saben qué es fastidioso?, saber que teniendo un ancho de banda extremadamente limitado,  que haya páginas full de publicidad y anuncios (cual vallas de carretera) que se coman mi preciado ancho de banda descargando banners Flash y textos que son inútiles para mí.

Para ello utilizaremos un proyecto de la gente de yoyo.org, que llevan una lista de sitios conocidos de publicidad y marketing, al indicarle a dnsmasq que responda con una URL nula estas solicitudes, nuestras páginas web se verán limpias de contenido.

* Necesitamos crear un archivo, que nos permitirá crear la lista de bloqueo:

archivo: /usr/local/bin/get-ad-block-list.sh

#!/bin/sh
# Down the DNSmasq formatted ad block list
curl "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=dnsmasq&showintro=0&mimetype=plaintext" | sed "s/127\.0\.0\.1/192.168.1.1/" > /etc/dnsmasq.d/adblock.conf

* Y lo volvemos ejecutable:

chmod 755 /usr/local/bin/get-ad-block-list.sh

* Agregamos un cron-job que lo ejecute semanalmente:

ln -s /usr/local/bin/get-ad-block-list.sh /etc/cron.weekly/get-ad-block-list

* Y Lo ejecutamos por primera vez (para descargar la lista):

root@fuloong:~# /usr/local/bin/get-ad-block-list.sh
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 98305 0 98305 0 0 1364 0 --:--:-- 0:01:12 --:--:-- 10236

El archivo queda más o menos así:

address=/101com.com/192.168.1.1
address=/101order.com/192.168.1.1
address=/103bees.com/192.168.1.1
address=/1100i.com/192.168.1.1
address=/123banners.com/192.168.1.1
address=/123found.com/192.168.1.1
address=/123pagerank.com/192.168.1.1
… 

Esto indica, que para cualquier solicitud de un dominio en ESA lista  (/etc/dnsmasq.d/adblock.conf) entonces DNSMASQ responderá con un servidor local (en 192.168.1.1). ¿y qué servidor web responderá esa solicitud?, ahí entra el pixelserver.

* Creación de un pixelserver:

Un pixelserver es un super-minimo web-server, su única finalidad es servir un gif de 1×1 transparente (sólo mide 43 bytes), este servidor responderá toda solicitud HTTP con un pixel.

* descargamos:

wget http://proxytunnel.sourceforge.net/files/pixelserv.pl.txt -O /usr/local/bin/pixelserv.pl

* hacemos ejecutable:

chmod 755 /usr/local/bin/pixelserv.pl

* Incorporamos un script de init.d para pixelserv (compatible con Debian)

archivo: /etc/init.d/pixelserv

#!/bin/sh
## BEGIN INIT INFO
# Provides: pixelserv
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: minimal Web Server
### END INIT INFO
set -e
. /lib/lsb/init-functions
case "$1" in
 start)
 echo "Starting pixelserv "
 /usr/local/bin/pixelserv.pl &
 ;;
 stop)
 echo "Stopping script pixelserv"
 killall pixelserv.pl
 ;;
 *)
 echo "Usage: /etc/init.d/pixelserv {start|stop}"
 exit 1
 ;;
esac
exit 0

* Y le indicamos a Debian que lo ejecute en cada inicio:

update-rc.d pixelserv defaults

* Como la lista de ad-block está incorporada al dnsmasq en:

archivo: /etc/dnsmasq.d/adblock.conf

* Entonces reiniciamos el dnsmasq:

/etc/init.d/dnsmasq restart

Verificamos que cualquier solicitud de un Dominio en esa lista, responde adblock:

dig @192.168.1.1 doubleclick.com
;; QUESTION SECTION:
;doubleclick.com. IN A
;; ANSWER SECTION:
doubleclick.com. 0 IN A 192.168.1.1

* Ya se puede navegar por cualquier página web y desaparecerán los anuncios (ejemplo: youtube.com)

Conclusiones

Este caso mio es un frikismo puro, ganas de tener un Internet decente en mi casa, un lugar cualquiera de Venezuela olvidado por el centralismo, pero es muy útil para aquellos centros, educativos, culturales, indígenas y de cualquier índole, que deseen una comunicación decente con el mundo a través de Internet; como conclusión puedo indicar que mis costos fueron supremamente bajos (los equipos para conectividad comprados por ebay usando dólares electrónicos no superaron los 150US$) y para cualquier persona que desee conectividad en una finca, granja y/o poblado rural, una solución así, compacta, segura, barata y en software libre puede ser de gran beneficio.

¿Trucos para personas más diestras?, podrían plantearse un trunking de conexiones, conectando dos o más conexiones GSM (o de diversos tipos) para balancear el Internet y hacer que vaya mucho más rápido, podría comprar una antena de 12Db y 5Dbi de ganancia externa y conectar toda la solución en exteriores en una caja Nema con muy pequeños equipos (beagleboards o raspberry-pi corriendo una mini-distribución sobre un disco SSD), la capacidad de crear “pequeñas cajas con Internet” para comunidades remotas crea ilimitadas posibilidades.

¿Qué otras cosas se les ocurrirán a mis lectores?

¡Happy Hacking!

A %d blogueros les gusta esto: