¿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 🙂
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 comandosudo 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
Obtenga su archivo PDF gratuito con todos los comandos que necesita saber sobre Raspberry Pi.
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.
Obtenga su archivo PDF gratuito con todos los comandos que necesita saber sobre Raspberry Pi.
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: