Header Ads

Unifi Hotspot con Iptables


La tecnología UniFi de Ubiquiti ofrece una gestión centralizada y escalable, ideal para todo tipo de redes, desde pequeñas oficinas hasta grandes empresas. Con hardware avanzado, proporciona un rendimiento robusto y roaming sin interrupciones. Su interfaz amigable, tanto en el panel web como en la aplicación móvil, facilita la gestión y el monitoreo de la red. Además, ofrece características de seguridad avanzadas y actualizaciones regulares, garantizando una red segura y actualizada. En resumen, UniFi combina rendimiento, facilidad de uso y seguridad en una solución de gestión de redes eficiente y económica.
Sin embargo, a pesar de estas bondades y de que su hardware vale cada centavo, la adquisición de estos equipos puede estar fuera del alcance de muchos. Es por eso que hoy vamos a combinar la tecnología UniFi hotspot con administración Linux, en un intento por abaratar costos.
El objetivo de este post no es reemplazar los UDM (UniFi Dream Machine), Gateway, Cloud Key, o cualquiera de los productos UniFi para administrar redes. Si ya tiene uno, bien por ti. Sin embargo, no todos pueden darse ese lujo, y la idea es ofrecer una alternativa al sysadmin que escasamente le alcanzó para comprar un Access Point UniFi y nada más, y necesita administrar su red local con el Hotspot de Unifi, pero aplicando restricciones (iptables, squid, etc.), Si ese es su caso, ha llegado al lugar indicado.
Descripción del hardware y software usado en la prueba
Topología Unifi
- AP Unifi U6-pro wifi 6, conectado al switch vía cable UTP Cat 6a y conector blindado.
- Switch Ubiquiti USW-PRO-24-POE (o también un USW-LITE-8-POE), elegidos porque son switch de PoE activo, que manejan 802.3af, que es el estándar del AP U6-Pro usado en la prueba. Pero si tiene otro AP Unifi sin su inyector PoE, consulte el post Unifi which devices use active poe and passive poe, para determinar qué estándar PoE maneja su AP y así pueda elegir el switch adecuado. Si su AP ya tiene su inyector PoE y tiene un switch de Unifi o de otra marca, ignore la anterior recomendación, ya que igualmente sirve.
- Script interactivo de Glennr, que instala y configura todas las dependencias de Unifi Network en Ubuntu. Para mayor información, pulse AQUÍ.
- Servidor HP Proliant ML110 G9, con Ubuntu 22.04.4, iptables v1.8.7, isc-dhcp-server v4.4.1, rsyslogd v8.2112.0 y Unifi Network v8.2.93, dos interfaces de red Ethernet; una para WAN (proveedor de internet) y otra LAN (para los clientes), conectada al switch vía cable UTP Cat 6a. Pero no necesariamente debe ser un "servidor". Según el sitio oficial, los requerimientos de esta app son:
Requisitos mínimos de Unifi Network
Software:
- SO Linux: Ubuntu Desktop / Server 22.04; Debian 11 "Bullseye" / Windows: Windows 10; Windows Server 2016, macOS: Mavericks 10.9, 10.10 Yosemite, 10.11 El Capitan, 10.12 Sierra, 10.13 High Sierra, 10.14 Mojave, 10.15 Catalina.
- Java is no longer required as of UniFi Network 7.5
- Web Browser: Google Chrome
- MongoDB: version 3.6 or later. Mongo is offered bundled: default is 3.6 (for macOS and Windows only).
Hardware:
- CPU: x86-64 Processor (Intel / AMD x64 Processors)
- RAM: 2GB
- Network: 100Mbps Wired Ethernet
- HDD: Minimum 10GB free (20GB or more preferred)
Por tanto, un PC estándar es más que suficiente.
Configuración en Unifi Network
Siga las instrucciones de instalación. Se recomienda el script de Glenn para Ubuntu:
# Decargar script de glenn y seguir instrucciones de instalación:
wget -c https://get.glennr.nl/unifi/update/unifi-update.sh
chmod +x unifi-update.sh
sudo ./unifi-update.sh
# al final ejecutar:
sudo update-ca-certificates -f
Si ya tiene configurado su Unifi Network y su Hotspot, vaya a la página de inicio de Hotspot, sección "Configuración (settings)" y haga lo siguiente:
Activar mensaje de Bienvenida (Success Message)
- En "Página de inicio de éxito (Success Landing Page)", seleccione "Mensaje de éxito (Success Message)" en lugar de usar una URL de redirección (Custom URL). Esto es para permitirle a iptables la captura de la cadena de autenticación de los clientes. Sin embargo, si no quiere hacerlo, también puede poner una URL. De igual manera el script capturará el tráfico autenticado, solo que con la primera opción tiene un porcentaje de exito mayor del algoritmo usado en iptables.
- Desactivar en APs la opción meshing (si están conectados por cable al switch), ya que puede causar conflictos en la adopción.
- En Restricciones post-autorización (Post-Authorization Restrictions) deberá revisar los rangos bloqueados, ya que eventualmente puede afectar la conexión de los clientes. Por defecto, nuestro script trabaja con 192.168.1.0/24, por lo tanto, si no tiene pensado cambiarlo, se sugiere eliminar el rango 192.168.0.0/16 de esta sección o bloquear los demás rangos de clase C, excluyendo 192.168.1.0/24 LAN y el rango WAN.
- En "Asignaciones de autorización previa (Pre-Authorization Allowances)", no se debe agregar la IP del hotspot, ya que si lo hace puede desencadenar conflictos.
- Como tiene dos interfaces (WAN para el proveedor de internet y LAN para la red local) es necesario que edite el archivo system.properties y agregue la IP del servidor al final del archivo. Ejemplo:
su
nano /var/lib/unifi/system.properties
system_ip=192.168.1.10
Y reinicie unifi:
sudo systemctl restart unifi
# o
sudo service unifi restart
Más información  AQUÍ
A partir de ahora, la url de acceso al portal será:
https://192.168.1.10:8843/guest/s/default/
Nota: No podrá iniciar por http porque le saldrá en el navegador el siguiente mensaje:
Bad Request
This combination of host and port requires TLS.
Compartición de impresoras y carpetas
Tambien en "Asignaciones de autorización previa (Pre-Authorization Allowances)", puede agregar las direcciones IPs de impresoras de red (solo si va a compartirlas con clientes de hotspot) y por último, poner un nombre de host, por ejemplo, de una carpeta compartida por Samba (solo si va a compartir carpetas con clientes de hotspot). 
Tenga en cuenta que si habilita un host para compartición de carpetas, también debe habilitar NetBIOS y puertos en smb.conf e iptables, lo cual no es muy seguro, por tanto, se sugiere acceder a carpetas compartidas por la IP del equipo donde se encuentre, en lugar del nombre del host.
Ejemplo: IP del switch 191.168.1.1 e impresoras 191.168.1.240/28
 y se elimina 192.168.0.0/16 para evitar conflictos
Adicionalmente, si va a compartir impresoras de red o carpetas compartidas de Samba con clientes de hotspot, vaya a la sección Wifi / Seleccionar Red Wifi (aplica a las configuraciones de los AP asociados al Hotspot) y desmarque la casilla "Aislamiento de dispositivo cliente (Client Device Isolation)". Para mayor información, consulte Security and Isolation.
Marcar UAPSD, Desmarcar Multicast and Broadcast Control y Client Device Isolation
También se recomienda desmarcar la casilla "Control de multidifusión y transmisión (Multicast and Broadcast Control)" y marcar la casilla de verificación UAPSD. Por defecto vienen de esa manera.
Manos a la obra (Update 2026)
En las primeras versiones de este proyecto se utilizaba un enfoque basado en reglas de firewall con iptables, específicamente reglas tipo string, para detectar cuándo un cliente completaba la autenticación en el portal cautivo.
Aunque funcionaba, este método tenía un problema importante: las reglas string requieren inspeccionar el tráfico, lo que las hace lentas e ineficientes, especialmente a medida que aumenta la cantidad de clientes. Además, dependían de comportamientos internos del portal que podían cambiar entre versiones de UniFi.
En la versión actual, el enfoque cambió completamente. En lugar de analizar tráfico, el script consulta directamente el estado de los clientes en UniFi, permitiendo una gestión más precisa, ligera y estable.
Instalación del script
Descargue el script, dele permisos y cópielo al path deseado:
wget -c https://raw.githubusercontent.com/maravento/vault/master/scripts/bash/unhotspot.sh
sudo chmod +x unhotspot.sh
sudo cp unhotspot.sh /etc/scr/unhotspot.sh
Configuración básica
Antes de ejecutarlo, asegúrese de conocer sus interfaces de red, la IP del servidor donde está UniFi Self-Hosted, el rango de red que asignará a los clientes del portal y los datos de autenticación (debe ser una cuenta local, ya que no soporta 2FA). El script le hará una serie de preguntas y guardará esta información en texto plano en:
/etc/unhotspot/config.conf
Nota: Como las credenciales de acceso a la administración de UniFi Network están en este archivo, asegúrese de protegerlo con permisos de acceso solo root (el script así lo establece, pero no sobra verificarlo).
Ejecución
Se puede ejecutar manualmente, pero lo recomendado es programarlo en cron tab cada minuto o menos, si tiene alto tráfico:
sudo crontab -e
* * * * * /etc/scr/unhotspot.sh
¿Cómo funciona el script?
El script se ejecuta periódicamente y mantiene el control de los clientes del hotspot en tres estados:
- Pendientes: clientes conectados pero sin autenticación (/etc/unhotspot/guest-pending.txt).
- Activos: clientes autenticados con tiempo válido (/etc/unhotspot/mac-hotspot.txt).
- Expirados: clientes cuyo acceso ha finalizado y regresan a estado pendiente (/etc/unhotspot/guest-pending.txt).
En cada ejecución, el script realiza un ciclo automático:
1. Limpia inconsistencias entre listas.
2. Detecta clientes expirados.
3. Detecta nuevos clientes conectados.
4. Detecta clientes autenticados mediante vouchers.
5. Aplica cambios en red solo si hay modificaciones.
Este enfoque evita la inspección de tráfico y se basa completamente en el estado real reportado por UniFi.
Flujo Real
El script verifica el estado de los clientes con la API de UniFi y pueden ocurrir los siguientes escenarios:
1. El cliente se conecta a la red de Invitados (Hotspot), se abre el landing page, pero no ingresa porque no tiene voucher válido: En este caso, se mantiene en guest-pending.txt (con una IP disponible dentro del rango establecido en config.conf, que el usuario determino al momento de las preguntas iniciales del script). Y permanece en esta ACL hasta que se desconecte del punto de acceso WiFi Hotspot y la API de UniFi lo reporte y el script elimina la MAC de esa ACL.
2. El cliente se conecta a la red de Invitados (Hotspot), se abre el landing page e introduce un voucher válido: En este caso el script lo saca de guest-pending.txt y lo pasa para mac-hotspot.txt y el cliente debe desconectarse del AP y volver a conectarse para poder navegar con normalidad, ya que la IP asignada inicialmente por DHCP puede no coincidir con el rango definido. Si quiere que esto no suceda, asigne en su servidor DHCP el mismo rango de IPs que eligió dentro de config.conf.
3. Expiró el voucher para el cliente: En este caso, la API reporta el estado, pasa de la lista mac-hotspot.txt a guest-pending.txt. En este escenario, si el cliente no le extienden el voucher y se desconecta físicamente del AP del Hotspot, sale de las listas.
Consideraciones finales
1. Este script depende de la correcta sincronización entre UniFi Network, DHCP y las reglas de firewall, por tanto no se garantiza que funcione en todos los sistemas linux.
2. El script está actualmente siendo probado en Ubuntu Mate 24.04.4 LTS con UniFi OS Server 5.0.6 con Network 10.3.58 y con las dependencias iptables v1.8.10, ipset v7.19, DHCP Server 4.4.3-P1, y con Third-Party Gateway (ya que es controlado por el script+iptables+dhcp), por tanto no garantizamos que funcione en otros sistemas. Sugerimos que lea el header del script, donde se detalla el flujo.
3. Los clientes gestionados por ambas listas deben estar definidos en dhcp.conf, y solo mac-hotspot.txt debe ser permitido por iptables, por tanto ajuste sus parámetros. Para el caso de guest-pending.txt solo se le permitirá el acceso al portal, con unas reglas similares a las siguientes:
sudo crontab -e
# UniFi
# Cambie estas variables a sus interfaces reales:
wan=eth0
lan=eth1
# Permitir tráfico HTTPS desde UniFi hacia UniFi Servers (cambie 192.168.1.204 por la IP de UniFi que viaja por la WAN)
iptables -A INPUT -i $wan -p tcp -s 66.203.125.0/24 --sport 443 -d 192.168.1.204 -j ACCEPT
# STUN
iptables -A INPUT -i $wan -p udp -m multiport --sports 3478,19302 -j ACCEPT
# Lan UniFi (Importante: no autorice el 443/853 a clientes nuevos entrantes)
UniFi_tcp="53,8080,8443,8880:8882,8843,8444,27117,11443"
UniFi_udp="53,3478,123,10001,1900"
for chain in INPUT FORWARD; do
    iptables -I $chain 1 -i $lan -p tcp -m multiport --dports $UniFi_tcp -j ACCEPT
    iptables -I $chain 2 -i $lan -p udp -m multiport --dports $UniFi_udp -j ACCEPT
done
iptables -t mangle -I PREROUTING 1 -i $lan -p tcp -m multiport --dports $UniFi_tcp -j ACCEPT
iptables -t mangle -I PREROUTING 2 -i $lan -p udp -m multiport --dports $UniFi_udp -j ACCEPT
Landing Page
4. Se recomienda configurar el Landing Page como aparece en la imagen superior, para evitar problemas de redirección https al acceder al portal. Cambie 192.168.10.0/24 por el rango de su red local.
Pre-autorizaciones Apple y Android (opcional)
5. Para el caso clientes Apple (macOS/iOS) es un drama. Es necesario agregar los dominios de Apple en las pre-autorizaciones; aun así, el portal cautivo puede no abrir automáticamente. El soporte de WPAD es limitado e inconsistente (especialmente a nivel de sistema y aplicaciones), por lo que no se debe confiar demasiado en la autodetección. Este comportamiento es normal en estos sistemas cerrados y no corresponde a un fallo del hotspot, por lo que no se garantiza el funcionamiento del script en todos los casos. Como alternativa, se puede abrir manualmente el navegador y acceder a http://neverssl.com para forzar la redirección al portal.
6. En Linux y Windows el funcionamiento es normal. En Android, si se utiliza proxy, este debe configurarse manualmente, ya que no soporta autodetección WPAD; se recomienda configuración manual o uso de archivo PAC cuando aplique, siempre y cuando lo haga después de introducir el voucher y no antes.
7. El portal cautivo utiliza la URL http://IP_Unifi_Self-Hosted:8880/guest/s/default/; por tanto, no active "HTTPS Redirection Support", "Encrypted URL" ni "Secure Portal" en el Landing Page, ya que pueden comprometer el funcionamiento del script (el acceso al portal debe ser por HTTP y no por HTTPS).
8. El registro tiene el formato a;MAC;IP;HOSTNAME;END_TIME_EPOCH y el hostname se construye como guest{numero_consecutivo}-{codigo_voucher}, donde el número consecutivo aumenta por cada cliente y el código del voucher es el número de 10 dígitos usado para la autenticación.
9. También hemos publicado otro script para auditar las conexiones y revocar vouchers, limpiar historial, etc. Consulte el enlace abajo.
10. Pruebe siempre en un entorno antes de llevarlo a producción. 
Con la tecnología de Blogger.