¿Cómo utilizar la Raspberry Pi como un Router Inalámbrico con Firewall?

Quería construir un firewall y router con la Raspberry Pi durante mucho tiempo. Primero probé Pfsense y OpenWRT sin éxito, y en un Raspberry Pi OS fresco me faltaba información. Pero ahora finalmente encontré cómo hacerlo, y voy a compartir esto contigo.

La Raspberry Pi sólo tiene una toma Ethernet, por lo que no es posible crear un cortafuegos con dos interfaces RJ45.
Pero hay una interfaz Wi-Fi que se puede utilizar para un lado (LAN, por ejemplo).
Una forma de construir un cortafuegos es utilizar los servicios hostapd e iptables.

Y te mostraré cómo. Es un gran tema con muchos servicios y nociones de red que entender.
Empezaré con la teoría y luego explicaré cómo instalar cada software.

Empezar con el fin en mente

Router

Un router es un dispositivo de red que conecta dos redes.
Si tienes dos puertos de Ethernet en un ordenador, con diferentes redes en cada puerto, tu ordenador puede convertirse en un router.

En este esquema, tenemos dos redes diferentes, conectadas con un router: 1.0 y 2.0.
Si el router está bien configurado, permite que A y B se vean mutuamente, aunque estén en una red diferente.

Las Raspberry Pi sólo tienen una tarjeta Ethernet, pero podemos utilizar la tarjeta Wi-Fi para crear una segunda red.
Así, la parte del router en este tutorial nos permitirá conectar la red Wi-Fi a la red Ethernet.

Cortafuegos

Un firewall es un software. Nos permite añadir políticas de seguridad en el router.
Por ejemplo, en el ejemplo anterior, podemos configurar que A pueda hacer ping a B, pero no acceder al servidor HTTP de B.
Yo utilizaré un software llamado «iptables» para esto, pero puedes utilizar cualquier otro software de firewall si lo prefieres.

Mi objetivo

Si utilizas tu Raspberry Pi en casa, probablemente no necesites conectar dos redes.
Pero mi objetivo es crear un nuevo punto de acceso inalámbrico con un cortafuegos y otro software interesante para supervisar la red y filtrar algún tipo de tráfico.

Aquí está mi red actual:

Y quiero girarlo así:

Por lo tanto, aquí están los pasos que debes seguir para hacer lo mismo:

  • Instalar la Raspberry Pi en la red
  • Habilitar el punto de acceso Wi-Fi con una subred de red diferente
  • Crear un puente entre las dos redes
  • Crear reglas de firewall
  • Instalar otros programas interesantes

Te explicaré cada paso en detalle.
Pasemos al primer paso de este proceso 🙂

¡Hola!
Inscríbete para recibir mis últimos tutoriales cada semana.

Instala tu Raspberry Pi

Lo primero que hay que hacer es instalar tu Raspberry Pi en la red:

  • Instalar Raspberry Pi OS siguiendo este tutorial
    No necesitas la versión de escritorio, excepto si quieres usar la Raspberry Pi para otras cosas también
  • Conecte la Raspberry Pi a la red con un cable RJ45
    Usaremos el Wi-Fi más tarde, así que tienes que dejarlo disponible
  • Una dirección IP estática no es obligatoria pero puede ayudar
    Puedes consultar el final de este artículo para saber cómo configurarlo
  • Una vez hecho esto, actualiza el sistema haciendo:
    sudo apt update
    sudo apt upgrade
    sudo reboot
  •  Habilitar SSH en raspi-config > Interfacing options
    sudo raspi-config
    Lo usarás en este tutorial, para copiar/pegar el comando de esta página.
    Puede encontrar más detalles sobre cómo usar SSH en este tutorial si es necesario.

Ya está, has hecho el paso de preparación, podemos empezar con la instalación del router.

Instalar un router inalámbrico

En Stretch (Debian 9), había un script para hacer todo automáticamente, pero no había sido actualizado y ya no funciona.
Entonces, lo haremos manualmente, no es tan complejo.

Configurar el país Wi-Fi

Si estás usando un nuevo Raspberry Pi OS, es necesario establecer un país Wi-Fi en primer lugar.
El Wi-Fi está desactivado hasta entonces.

  • Abrir raspi-config
    sudo raspi-config
  • Ir a Localisation Options > Change WLAN country
  • Selecciona tu país en la lista
  • Confirmar y salir

Instalar los servicios

Utilizaremos principalmente dos nuevos servicios en nuestro router:

  • Hostapd: para crear el punto de acceso inalámbrico
  • DNSmasq: para reenviar las peticiones DNS a otro servidor DNS

Comienza por instalar los paquetes necesarios:
sudo apt install hostapd dnsmasq

Eso es todo, ahora podemos pasar a la parte de configuración.

Configurar Hostapd

En el archivo de configuración de Hostapd, añadiremos la configuración de nuestra nueva red inalámbrica:

  • Abre el archivo de configuración:
    sudo nano /etc/hostapd/hostapd.conf
  • Pegua estas líneas (el archivo probablemente esté vacío):
    interface=wlan0
    driver=nl80211
    ssid=RaspberryTips-Wifi
    hw_mode=g
    channel=6
    wmm_enabled=0
    macaddr_acl=0
    auth_algs=1
    ignore_broadcast_ssid=0
    wpa=2
    wpa_passphrase=<YOURPASSWORD>
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP

    No olvides establecer una contraseña, y puedes editar la línea que quieras (por ejemplo, para utilizar otro canal, nivel de seguridad o SSID)
  • Guardar y salir (CTRL+O, CTRL+X)

Hostapd no se inicia automáticamente en el arranque, hay dos cambios que hacer para habilitarlo:

  • Edita el archivo de configuración por defecto:
    sudo nano /etc/default/hostapd
  • Añade esta línea al final:
    DAEMON_CONF="/etc/hostapd/hostapd.conf"
  • Guardar y salir
  • Luego, habilita el servicio con:
    sudo systemctl unmask hostapd
    sudo systemctl enable hostapd

Configurar DNSmasq

El siguiente paso es configurar DNSmasq:

  • Abre el archivo de configuración:
    sudo nano /etc/dnsmasq.conf
  • Pegua estas líneas al final:
    interface=wlan0
    bind-dynamic
    domain-needed
    bogus-priv
    dhcp-range=192.168.42.100,192.168.42.200,255.255.255.0,12h

    No hay nada que cambiar aquí, excepto si quieres cambiar la subred.
  • Guardar y salir (CTRL+O, CTRL+X)

Configurar el servidor DHCP

El último archivo de configuración que hay que cambiar es el del servidor DHCP, configurándolo en la misma subred:

  • Abre el archivo de configuración:
    sudo nano /etc/dhcpcd.conf
  • Desplázate hasta el final del archivo y pega estas líneas:
    nohook wpa_supplicant
    interface wlan0
    static ip_address=192.168.42.10/24
    static routers=192.168.42.1
  • Guardar y salir

Estamos casi listos para la primera prueba.

Activar el reenvío de IP

Si tienes varias tarjetas de red, el comportamiento por defecto en Linux es aislarlas.
En nuestro caso, queremos habilitar la comunicación entre la LAN y el Wi-Fi.
Así que tenemos que cambiar esto:

  • Abre este archivo:
    sudo nano /etc/sysctl.conf
  • Encuentra esta línea (primera página):
    #net.ipv4.ip_forward=1
  • Y descomentarla:
    net.ipv4.ip_forward=1
  • Guardar y salir

Ahora puedes reiniciar para un primer intento:
sudo reboot
Nota: Tuve que hacer esto dos veces en mis dos pruebas porque no obtenía una dirección IP en el primer reinicio. Ni idea de por qué…

Una vez que esto se haya completado, deberías ser capaz de ver tu punto de acceso Raspberry Pi en la lista de redes
En tu lista de redes Wi-Fi, deberías ver algo así:

Puedes conectarte a él y comprobar que todo funciona como se espera.
Deberías obtener una IP en la subred 192.168.42.0/24, el script creó esta red para ti.
Por ahora no tendrás conexión a Internet, ya que necesitamos configurar el firewall para permitir el tráfico de Internet.

Comprender los conceptos de cortafuegos

Empezaré con una introducción sobre la teoría de la configuración del cortafuegos.
Si ya tienes soltura con esto, puede pasar a la siguiente sección.

Introducción

La función de un cortafuegos es bloquear o permitir el acceso de una IP específica a otra.
Y a menudo también utilizamos un puerto para establecer el permiso exacto.

Ej: Denegamos el puerto 22 a todos, excepto al ordenador A que puede acceder al ordenador B con el puerto 22.

Blanco o negro

En una configuración de cortafuegos, se puede elegir entre dos reglas por defecto:

  • Blacklist: Permitir que todos, excepto …
  • Whitelist: Negar todo excepto…

Dependiendo de lo que quieras hacer con tu router Raspberry Pi, es tu elección coger el que quieras.
La primera opción probablemente esté bien si la usas en casa. Es posible que quieras bloquear sólo ciertas cosas como el protocolo torrent o direcciones IP específicas.
Pero en el trabajo es más bien lo segundo. La buena práctica es bloquear todo excepto lo que está permitido.

In, Out y Forward

Este es más fácil.
En el cortafuegos, puede crear reglas en tres direcciones:

  • Input: Paquetes de red que entran en el cortafuegos
  • Output: Paquetes que salen del cortafuegos
  • Forward: Paquetes que atraviesan el cortafuegos

En un servidor web alojado, puede bloquear cualquier cosa en la entrada excepto HTTP y HTTPS.
Pero en la salida no es un gran problema lo que su servidor está haciendo en Internet.

En nuestro caso, utilizaremos principalmente las reglas FORWARD ya que no hay nada en la Raspberry Pi.
No hay necesidad de protegerlo más que eso.

Configurar el servicio de firewall

Si quieres, puedes añadir un firewall en tu router para filtrar el tráfico.
Quizá en casa no sea obligatorio, pero para una empresa o un lugar público lo necesitas.

IPTables

Hay varios paquetes de cortafuegos disponibles en Raspberry Pi OS: iptables o ufw, por ejemplo.
También existe OpenWRT, una distribución compatible con Raspberry Pi, para crear un cortafuegos en el router.

En este post, utilizaré iptables, el más utilizado.
Ya está instalado en tu Raspberry Pi, así que no hay nada más que hacer.

Ver la configuración actual

Antes de añadir reglas, es necesario comprobar la configuración actual.
Para ello, utilice el comando
sudo iptables -L

Deberías conseguir algo así:

Encontramos las partes de entrada, salida y avance de las que hablé anteriormente.
Para cada uno vemos que la política por defecto es ACCEPT, por lo que todo está permitido excepto lo que añadimos (modo lista negra).

Puedes utilizar este comando más tarde para comprobar si las nuevas reglas que añades se corresponden con lo que quieres.

Activar el reenvío a Internet

Antes de entrar en más detalles, sólo añadiremos algunas reglas básicas para permitir el tráfico de Internet:

  • Escribe estos 3 comandos:
    sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
  • No es necesario que los entiendas ahora, lo explicaré todo en las próximas partes.
    Pero una vez hecho esto, deberías tener un acceso a Internet funcionando en tu punto de acceso.
  • Estas son las reglas que tiene ahora, con iptables -L

Añadir una regla FORWARD

Usaremos el comando iptables para añadir nuevas reglas en el firewall.
Cada red es diferente, por lo que cada tabla de reglas de firewall es diferente.
Empezaré con un ejemplo, y luego te daré toda la sintaxis para añadir reglas específicas en tu entorno.

  • Comience por restablecer la configuración de iptables
    sudo iptables -F
    El orden es importante en la lista de reglas, y como el router ya acepta todo en la sección de reenvío, no podemos bloquear conexiones específicas.
  • Añadir una regla DROP
    sudo iptables -A FORWARD -p tcp --dport 80 -j DROP
    Este comando especifica que:
    – añadimos una nueva regla (-A)
    – en la parte delantera (FORWARD)
    – para el protocolo tcp (-p tcp)
    – para el puerto HTTP (–dport 80)
    – y la acción es DROP todo (tiempo de espera de la conexión)
  • Utiliza los 3 comandos que te di en la parte anterior para permitir el otro tráfico de Internet
  • Después de eso, no deberías poder acceder a un sitio web como este, por ejemplo (pero los sitios en HTTPS siguen funcionando)

Está bien, la primera regla es operativa.
Puede utilizar iptables -F para eliminar todas las reglas y empezar de nuevo.
O puede utilizar el mismo comando con el operador -D en lugar de -A.
sudo iptables -D FORWARD -p tcp --dport 80 -j DROP

Este comando permite eliminar una regla específica y no todas como con el -F.

Sintaxis del comando Iptables

Como ya deberías entender, ahora puedes utilizar la misma plantilla de comandos para crear las reglas del cortafuegos que necesita.

La plantilla de comandos es:
iptables -<operation> <direction> -p <protocol> --dport <port> -j <action>

  • operation:
    • -F: flush, eliminar todas las reglas, no requiere ningún otro parámetro
    • -A: añadir, añadir una nueva regla
    • -D: borrar, eliminar una regla existente
  • direction: INPUT, OUTPUT o FORWARD (véase la sección anterior)
  • protocol: principalmente TCP o UDP
  • port: el número de puerto para el que desea crear su regla
    Puede encontrar una lista de puertos comunes aquí
  • action: Definir la elección a realizar para el tráfico correspondiente
    • ACCEPT: Permitir el acceso (en modo de lista blanca)
    • REJECT: Denegar el acceso y decirle al remitente que no está permitido
    • DROP: Denegar el acceso pero no informar al remitente

Esta es la breve introducción a lo que se utilizará principalmente.
Si necesita más información, utilice «man iptables» o consulte esta página para conocer todos los parámetros.

Pasar a la lista blanca

Como puedes ver con «iptables -L», estamos en modo lista negra: ACCEPT todo excepto las reglas que añadimos.

Si quieres un entorno más estricto, cambia al modo de lista blanca.
Por ejemplo, si estás creando un Wi-Fi gratuito en un hotel u otro negocio, probablemente quieras permitir sólo unos pocos puertos (como el de la web y el del correo).

Para ello, debes crear una lista de todos los puertos que deseas permitir.
Si haces todos los comandos manualmente, perderás el acceso después del primero 🙂
Por lo tanto, la forma más fácil es crear un script que ejecute todos los comandos a la vez.

Crear el script del cortafuegos

  • Crear un nuevo archivo con nano
    sudo nano /usr/local/bin/firewall.sh
  • Pega estas líneas dentro de
    #!/bin/sh
    #Clear all rules
    iptables -F

    #Whitelist mode
    iptables -P INPUT ACCEPT
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT

    #Allow PING for everyone
    iptables -A FORWARD -p icmp -j ACCEPT

    #Allow HTTP/HTTPS for WiFi clients
    iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
    iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

    #Allow POP/IMAP/SMTP for WiFi clients
    iptables -A FORWARD -p tcp --dport 25 -j ACCEPT
    iptables -A FORWARD -p tcp --dport 110 -j ACCEPT
    iptables -A FORWARD -p tcp --dport 993 -j ACCEPT

    #Allow PING for WiFi clients
    iptables -A FORWARD -p icmp -j ACCEPT

    #Allow NAT
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  • Puedes adaptar estas líneas a tus necesidades
    Esto es sólo un ejemplo
    En este script de ejemplo no se ha dejado caer sobre INPUT y OUTPUT, pero puedes hacerlo si quieres un mejor control sobre el uso de tu red
  • Guardar y salir (CTRL+O, CTRL+X)
  • Añadir derecho de ejecución a este script
    sudo chmod +x firewall.sh
  • Ejecútalo
    sudo /usr/local/bin/firewall.sh
  • Comprueba si todo funciona bien
    Si algo va mal, reinicia la Raspberry Pi para recuperar todo el acceso
    Entonces encuentra lo que te falta en tu guión

Cuando esté bien, puedes añadirlo en la pestaña init para que se inicie en el arranque

Haz que tu configuración sea persistente

El script de GitHub que instalamos antes utiliza el archivo /etc/iptables.ipv4.nat para guardar la configuración
Así que una vez que esté funcionando, puedes guardar tu configuración actual dentro de :

sudo iptables-save > /etc/iptables.ipv4.nat

Esto cargará el archivo de configuración en la carga y aplicará directamente los cambios

Supervisar la red

Ahora que el router está funcionando (con un firewall o no), podemos añadir otros paquetes para mejorar las capacidades de la Raspberry Pi
En esta parte, sugiero añadir una interfaz web para supervisar lo que sucede en la Raspberry Pi (y en la red)

¿Qué es esta herramienta?

La herramienta que he elegido es Webmin
Es una interfaz web, fácil de instalar, que muestra toda la configuración actual, y varias estadísticas y gráficos sobre el uso del sistema
Incluso puedes cambiar la configuración desde esta interfaz

Si conoces otras cuéntame en los comentarios
Es una herramienta que existe desde hace mucho tiempo, pero no conozco una más reciente para hacer esto

Instalación de Webmin

  • Comprueba la última versión de Webmin desde esta página (archivo fuente)
  • Descarga el archivo así:
    wget https://prdownloads.sourceforge.net/webadmin/webmin-1.941.tar.gz
  • Extrae el archivo y muévelo a la nueva carpeta
    tar -zxvf webmin-1.941.tar.gz cd webmin-1.941
  • Ejecutar la configuración
    sudo ./setup.sh /usr/local/webmin
    Mantener todos los valores por defecto
    Establece una contraseña y elije si quieres usar SSL o no
    Espera unos segundos a que termine la instalación
  • La herramienta ya está disponible en http://:10000
    Inicie sesión con el nombre de usuario y la contraseña que acabas de crear

Interfaz Webmin

Te dejo descubrir la interfaz web y navegar por el menú
Hay MUCHAS herramientas dentro, no necesitamos todo esto
Los utilizaremos principalmente en la parte de «Networking».

Por ejemplo, puede activar la supervisión del ancho de banda o gestionar la configuración del cortafuegos desde aquí

Volveremos más tarde a esta interfaz, para la configuración del proxy por ejemplo
Es la siguiente parte

Añadir un Proxy y un filtro web

¿Qué es un Proxy?

Un Proxy tiene tres funciones principales:

  • Creación de una caché de todas las páginas de Internet, para aumentar la velocidad de navegación web
  • Registrar todas las páginas, para generar informes (top dominio, top tráfico, …)
  • Y podemos añadir un bloqueador de sitios web, para denegar el acceso a algunos tipos de contenido

Para ello, instalaremos Squid (el proxy) y SquidGuard (el filtro) en la Raspberry Pi

Instalación Squid

  • Squid está disponible en el repositorio. Instálalo con:
    sudo apt install squid
  • Haz una copia de seguridad del archivo de configuración:
    cd /etc/squid
    sudo mv squid.conf squid.conf.old
  • Cambia al usuario root unos segundos y elimina todos los comentarios rápidamente
    sudo su
    cat squid.conf.old | egrep -v -e '^[[:blank:]]*#' | grep "\S" > squid.conf
    exit

    A continuación, edita el archivo de configuración:
    sudo nano squid.conf
  • Y añade estas líneas al principio
    acl LocalNet src 192.168.42.0/24
    http_access allow LocalNet

    Squid sólo funciona en HTTP para la red Wi-Fi (42.X)
  • Reinicia Squid para aplicar los cambios
    sudo systemctl restart squid

Una vez configurado Squid, tienes dos opciones para utilizarlo:

  • Configura tu navegador web para utilizar la Raspberry Pi como proxy HTTP
    Depende de tu navegador, pero deberías encontrar esta opción en Options > Network settings
  • Configurar iptables para redirigir automáticamente todo el tráfico HTTP a squid
    Debería ser algo así:  
    iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 80 -j DNAT --to 192.168.42.1:3128
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

A continuación, comprueba que los sitios web HTTP funcionan correctamente
Puede ver todos los sitios web visitados en el archivo de registro de Squid:

sudo tail -f /var/log/squid/access.log

Complemento de Webmin

Hay un complemento de Webmin llamado «calamaris» que puedes instalar para monitorizar la eficiencia del proxy
Instálalo con apt:

sudo apt install calamaris

Y luego volver a webmin, en los módulos no utilizados para encontrar nuevas herramientas para el monitoreo de squid

Instalación de SquidGuard

Ahora podemos pasar a la instalación de SquidGuard:

  • Instalar el paquete squidguard
    sudo apt install squidguard
  • Descargar una lista de sitios web por categoría
    wget http://squidguard.mesd.k12.or.us/blacklists.tgz
  • Extraer ficheros del archivo
    tar -zxvf blacklists.tgz
    Mientras se extrae, verás que aparecen algunas categorías de la lista negra en tu pantalla
    Puedes elegir uno y utilizarlo para la configuración de SquidGuard más adelante
    Puedes abrir los archivos para obtener algunos ejemplos de sitios web
  • Mover los archivos a la carpeta SquidGuard
    sudo mv blacklists /var/lib/squidguard/db
  • Archivar el archivo de configuración original de SquidGuard
    cd /etc/squiguard
    mv squidGuard.conf squidGuard.conf.old
  • Crear un nuevo archivo de configuración
    sudo nano squidGuard.conf
  • Pega estas líneas
    dbhome /var/lib/squidguard/db logdir /var/log/squidguard dest violence {
    domainlist blacklists/violence/domains
    urllist blacklists/violence/urls
    log violenceaccess
    }
    acl {
    default
    {
    pass !violence
    redirect http://localhost/block.html
    } }

    Este es un archivo de ejemplo, puedes bloquear lo que quieras
    También puedes añadir más categorías creando más secciones dest
  • Guardar y salir (CTRL+O, CTRL+X)
  • Construir la base de datos de SquidGuard
    sudo squidGuard -C all -d
    Esto puede llevar mucho tiempo. Si es demasiado largo, elimina los archivos que no necesita de la carpeta de listas negras
    Utiliza una pantalla si no te quedas delante del ordenador (pantalla -S build)
    Así que si la conexión SSH con su ordenador se pierde, esto no detendrá el proceso de construcción
  • Reinicia Squid para aplicar los cambios
    sudo service squid restart

Ahora debería estar bien, intenta acceder a una URL de la lista de dominios y compruebe que está bloqueado por squidGuard

Preguntas relacionadas

¿Es posible añadir un Ad Blocker en este router? Sí, puedes utilizar Pi-Hole para hacerlo, es fácil de instalar y sólo tienes que configurar la Raspberry Pi como tu servidor DNS (manualmente o en el archivo de configuración DHCP, ver Firewall > DNS issues for more information)

¿Es posible utilizar una Raspberry para construir un router «full Ethernet»? Sí, puedes añadir un HAT Ethernet a tu Raspberry Pi como este HAT de expansión (más detalles en Amazon). Es perfecto para un firewall.

Conclusión

Eso es todo, ahora deberías tener un mejor conocimiento sobre cómo construir un completo router firewall con proxy en una Raspberry Pi

Espero que te funcione.
Me ha llevado mucho tiempo escribir este post con muchas pruebas que no he incluido aquí, pero tienes lo más importante, con las mejores herramientas
Si tienes algún problema, haz tu pregunta en los comentarios, intentaremos ayudarte

Además, estas herramientas son básicamente cosas de Linux y puedes encontrar mucha ayuda en Internet para ir más allá

Te doy todos los enlaces de documentación aquí si lo necesitas:

Publicaciones Similares