Danielside

informática softwarelibre divagaciones música

Router 3G eficiente con Raspberry Pi y pi-hole

Vamos a crear un router con un antiguo modem HSPA, un switch viejuno y una raspberry con el software de bloqueo de publicidad pi-hole, para tener bloqueo en origen y sin ad-blockers de navegador y sacar el máximo partido al ancho de banda de una conexión móvil

Los proyectos con “basurilla” que tengo por ahí guardada son mis favoritos. Raramente tiro algo y menos todavía si funciona. En este caso los actores de esta película son:

Modem Huawei K3765 recuperado de un router que te instalaba Vodafone. Liberado para que funcione con cualquier operador
Switch 10/100 wifi 54Mbps SMC Barricade WBR14-G2 más antiguo que los balcones de palo. Calculo que tiene 12 años mínimo
Mi primera raspberry. La “Model B Rev 1”, que tenía por ahí sin uso

Este proyecto se parece a Internet en casa con modem 4G y raspberry pi pero con algunas salvedades:

  • Ahora el modem no es un “mini router”, es un modem USB, con lo cual hay que establecer una conexión PPP.
  • Para aprovechar a tope el ancho de banda vamos a usar el software Pi Hole, que es un servicio que se queda en medio de internet y tú para bloquear todos los accesos a dominios que son considerados de publicidad y tracking.

El switch

La infraestructura que propone pi-hole se basa en que los clientes (ordenadores, móviles, teles, etc.) se conecten al switch con normalidad (por cable o por wifi) y éste les comunique que su DNS y su enrutador será pi-hole (en la práctica, la IP de la raspberry por ethernet). Esto hubiera funcionado muy bien con un router moderno con LibreCMC (como el Tp Link del proyecto del 4G) pero en este caso el switch es tan antiguo que no permite esa funcionalidad. De manera que he optado por desactivar DHCP (por este y por otros motivos que veremos más tarde). Como de todas formas ni el switch ni la raspberry van a dar para muchas alegrías (como mucho 1 o 2 clientes) podemos tener bien controladas las IPs que configuremos a cada uno.

Muchos switches domésticos tienen un puerto WAN al que se conecta un dispositivo que servirá de enlace hacia internet, pero en este caso no lo vamos a usar. La raspberry se conecta por ethernet como un equipo más.

Yo le he dado al switch la dirección 192.168.1.100, a la raspberry la 192.168.1.102 (estática) y a los clientes les voy dando la 103, 104, etc.

La raspberry

Se instala raspbian limpio y después conviene darse una vuelta por sudo raspi-config. En mi caso he configurado la mínima cantidad posible de memoria para la GPU (16 Mib) y he puesto un overclocking modesto. También hay que habilitar el acceso por SSH.

Dale una dirección estática a la interfaz cableada de la raspberry simplemente añadiendo estas líneas al final de /etc/dhcpcd.conf:

interface eth0
        static ip_address=192.168.1.102
        static domain_name_servers=127.0.0.1

Importante no especificar routers para esa interfaz, de manera que no se terminen añadiendo a la tabla de rutas como rutas por defecto.

La raspberry y el modem

Lo primero que tenemos que conseguir es una conexión a internet usando wvdial. Lo instalamos con sudo apt-get wvdial.

Estos modems solían venir como un dispositivo USB con dos perfiles: almacenamiento masivo y modem. En los kernel más antiguos se detectaban como almacenamiento masivo y ahí se quedaban y había que trastear con usb_modeswitch, pero este kernel ha sido lo suficientemente listo y ha pasado el dispositivo a modo modem. La manera más fácil de saber si esto ha pasado es si tienes creado /dev/ttyUSB0. Si no lo tienes debes averiguar la configuración correcta con usb_modeswitch y tu modelo de modem.

Para establecer los parámetros de marcado modificaremos el archivo /etc/wvdial.conf para que quede de la siguiente manera (estos datos son para una conexión con Simyo, para tu operador podría variar):

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","gprs-service.com"
Modem Type = Analog Modem
Baud = 115200
New PPPD = yes
Modem = /dev/ttyUSB0
ISDN = 0
Phone = *99#
Password = { }
Username = { }

Averiguar la velocidad en baudios es cuestión de ir probando, aunque también se puede tirar de los programas para Windows que estos cacharros suelen traer dentro de su memoria interna.

Esa es la máxima que he probado hasta ahora y me ha ido bien. Esto depende de tu propio hardware.

Normalmente estas conexiones no llevan usuario y contraseña por lo cual se les mandan unas “dummy” poniendo esas llaves. Lo más importante es el número a marcar y el establecimiento del APN en la línea Init3. Este archivo es válido si la SIM está sin PIN, pero si no, también hay comandos AT disponibles para desbloquear la tarjeta.

La conexión debe realizarse al inicio para no tener que entrar a la raspberry cada vez que quieras conectar. Vamos a aprovecharnos de la simplicidad de SystemD para arrancar servicios. SystemD ha estado rodeado de una gran polémica, pero la verdad es que definir servicios es muy fácil. Ponemos este contenido en /etc/systemd/system/pppdhuawei.service:

[Unit]
Description=Conexion pppd con wvdial modem huawei
After=remote-fs.target
After=syslog.target

[Service]
Type=simple
PIDFile=/run/ppdhuawei.pid
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/bin/wvdial -C /etc/wvdial.conf
TimeoutSec=180

[Install]
WantedBy=multi-user.target

Para habilitarlo al inicio se hace systemctl enable pppdhuawei.service. Para arrancarlo que levante la conexión systemctl start pppdhuawei.service y para pararlo systemctl stop pppdhuawei.service. Para ver problemas que puedan surgir journalctl -xef --unit pppdhuawei.service.

En otros ordenadores que he usado wvdial ha sido suficiente con esto, pero esta raspberry no tenía conectividad al levantar ppp0. El problema es que al terminar de hacer la conexión el sistema establece la ruta por defecto hacia la interfaz wwan0 (la crea el kernel al detectar el modem) pero yo necesito que el tráfico de internet se enrute por ppp0 (la crea wvdial al conectar). Para esto, creamos un script en /etc/ppp/ip-up.d/001route con el siguiente contenido:

#!/bin/sh
#
# Establecer la ruta por defecto por ppp0 y quitar la de wwan0
# Al finalizar ppp la ruta por defecto queda en la interfaz wwan0 y hay que cambiarla
#


[ -x /sbin/resolvconf ] || exit 0

[ "$USEPEERDNS" ] || exit 0

case "$6" in
  nm-pptp-service-*|nm-l2tp-service-*|/org/freedesktop/NetworkManager/PPP/*)
	# NetworkManager handles it
	exit 0
	;;
esac

/sbin/route del default
/sbin/route add default ppp0

En realidad lo interesante son las dos últimas líneas. El resto de líneas es porque he copiado el script desde 000resolvonf y me pareció interesante dejarlas.

Este script y los demás que están en ese directorio se invocarán cuando se levante la conexión ppp, de manera que se cargará la ruta por defecto y establecerá la que necesito. A partir de ese momento se debe comprobar que ya hay conectividad desde la raspberry (navegando con links, por ejemplo).

La raspberry y pihole

Hay que seguir los pasos de instalación de pi-hole y no habrá mayor problema. Este software está pensado para conectar la raspberry a tu switch principal, de manera que normalmente se configurará como gateway para pi-hole ese router principal. Esto fue el gran escollo que me encontré con el asistente de instalación. Cuando te pide qué IP y gateway quieres seleccionar para el servicio debes poner la IP de la interfaz eth0 y como gateway simplemente 0.0.0.0. Esto es un pequeño truco que se me ocurrió porque la conexión ppp0 tiene el problema de que no tengo ni idea de cual es su gateway 😒. Así que hacemos que pi-hole se aproveche de la tabla de enrutamiento por defecto, que debe haber quedado así:

pi@raspberrypi:~ $ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         0.0.0.0         0.0.0.0         U     0      0        0 ppp0
10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
link-local      0.0.0.0         255.255.0.0     U     203    0        0 wwan0
192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0

De esta manera conseguimos que pi-hole enrute todo el tráfico hacia internet por ppp0. Algunas instrucciones útiles para pihole son sudo pihole -r para reiniciar todo el proceso de instalación y sudo pihole -a -p para establecer la contraseña de la consola web. Es muy recomendable instalarla, es una aplicación web sobre lighthttpd y php7 y la verdad es que pese a la modestia de esta raspberry funciona rápido.

Mucho tráfico bloqueado después de tan solo un par de horas de navegación web

Finalmente una nota importante que no vendrá en la documentación de pi-hole, ya que presupone que solo hay una red. Pero en este caso la raspi hace de enrutador (ya sabes, teoría de redes, un enrutador es un dispositivo que une redes diferentes al nivel 3), por eso es preciso indicarle al kernel que tiene que hacer forward para ipv4, descomentando la línea net.ipv4.ip_forward=1 en /etc/sysctl.conf. Luego un sudo sysctl -p te aplicará ese cambio.

También hay que añadir una regla iptables para que no bloquee el enrutamiento entre interfaces con sudo iptables -t nat -A POSTROUTING -j MASQUERADE. Luego instala iptables-persistent para que resista reinicios.

Configurar los clientes

Dependerá bastante de si has optado por DHCP o no. En mi caso he puesto direcciones estáticas, con lo cual tendrás que conectar tu PC, móvil, tablet, tele, etc. bien por ethernet o por wifi al switch, pero indicando una dirección estática (pilla una libre) y que el DNS será 192.168.1.102 y el gateway (“puerta de enlace” en terminología windows) será también 192.168.1.102. Con eso estaría listo.

Monstruo de la pantalla final

Conclusiones

Ha sido una pasada ver como con un modem HSPA muy antiguo con el que nunca había llegado a los 2Mib de ancho de banda efectivo de bajada (speedtest.net) he llegado a más de 6Mib. Bloqueando toda la basura que viene con una navegación normal, doblamos la velocidad efectiva.

Otra ventaja es que no tienes que instalar ad-blockers en los clientes, y lo que es más importante, podrás tener ad-blocking en aquellos terminales que no lo soportan (como las teles listillas). Desde que mi único internet va por 4G me he dado cuenta del enorme tráfico que consumimos para nada, hasta el punto de que tuve que desconectar la tv samsung permanentemente de internet porque agotaba rápidamente el plan de datos.

Otra ventaja añadida: se puede navegar por páginas que hayan decidido detectar los ad-blockers de navegador y que rechazan cargarse. Con esto conseguimos engañarles. De todas formas, hay páginas que te piden amablemente desactivarlos para que tengan algo de soporte financiero. Si la página en cuestión te cae simpática, seguramente habrá una manera de exceptuar el dominio en pi-hole. Ya lo seguiré investigando.

Finalmente te muestro la lista de los dominios más bloqueados durante un par de horas de navegación. Me ha sorprendido que en los primeros puestos no aparecen los sospechosos habituales ¡vaya tela con la telemetría de mozilla!

La mayoría son, efectivamente, de publicidad y seguimiento. Pero la telemetría de Mozilla gana por goleada.

Probando al día siguiente con Firefox en Debian, sacando el informe del día, la telemetría de Mozilla había desaparecido. La conclusión es que en ubuntu (donde estaba haciendo las primeras pruebas, concretamente Pop!OS) tiene activada la telemetría por defecto y Debian no.

Actualización 14/05/2020

El servicio que propongo para arrancar la conexión no funciona casi nunca, porque cuando se ejecuta el dispositivo /dev/ttyUSB0 no está disponible. Cuando mis conocimientos de SystemD mejoren lo podré solucionar, pero mientras aquí va un parche:

[Unit] 
Description=Fuerza la conexión 1m después de iniciar el sistema

[Timer] 
OnBootSec=1 m 
Unit=pppdhuawei.service 

[Install] 
WantedBy=basic.target

Este timer se encarga de levantar el servicio 1 minuto después de que finalize el arranque.


Archivado en categoría(s) GNU/Linux, Internet, Raspberry Pi, Software Libre

Enlace permanente



Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.