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, 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 Server v8.2.93 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 Server 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 Server
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 Server
Siga las instrucciones de instalación. Se recomienda el script de Glenn para Ubuntu:
# Decargar script de glenn para v8.2.93 y seguir instrucciones de instalación:
wget https://get.glennr.nl/unifi/install/unifi-8.2.93.sh
# al final ejecutar:
sudo update-ca-certificates -f
Si ya tiene configurado su Unifi Network Server 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.
- 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
Más información AQUÍ
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.
No añadir la IP del Hotspot (en el script 192.168.1.2)
Opcional (solo si va a compartir carpetas e impresoras con Hotspot). Ejemplo:
Se añade: 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
Lo siguiente es descargar el script de control:
- Descargar script. Por defecto, este script trae una configuración, la cual deberá reemplazar por las suyas, antes de ejecutarlo, la cual se irá indicando abajo.
wget -c https://raw.githubusercontent.com/maravento/vault/master/scripts/bash/unifihotspot.sh
- Reemplace la variable MAC_LIST el path y archivo donde se guardarán las direcciones MAC de los clientes autenticados. Por defecto:
MAC_LIST="/etc/acl/mac-hotspot.txt"
- Reemplace la variable LAN por el nombre real de la interfaz que va a usar para LAN de acuerdo con systemd/udev. Por defecto:
lan=enp2s0
- Reemplace la IP estática que le asignó a su servidor Linux. Por defecto:
ipserver=192.168.1.2
- Reemplace el rango de direcciones IP que le asignará a los clientes que se autentican. Es importante que este rango coincida con el rango DHCP y con el CIDR de su red LAN. Por defecto:
IP="192.168.1"
RANGE_INI=160
RANGE_END=200
- Modifique el "tiempo de expiración". Este valor es en segundos y debe coincidir con el tiempo asignado en los vouchers emitidos en el Hotspot de Unifi Network Server. Por defecto viene 3600 segundos (24 horas):
expiration_seconds=3600
- En la función "mac_rules" debe determinar el tipo de tráfico que maneja. Si usa Squid-Proxy, debe agregar el puerto del proxy (ej: 3128) y si es intercept, debe agregar el puerto transparente (ej: 8080). Si usa la opción 252 de DHPC y tiene publicado un ".pac" en apache2/Nginx, debe agregar el puerto donde esté publicado el ".pac". Si no tiene nada de lo anterior, simplemente agregue el puerto 443 a la variable "aports"
- Una vez ajustados estos valores, copie el script a la ubicación de su preferencia, dele permisos de ejecución y ejecútelo:
sudo cp unifihotspot.sh /path_to/unifihotspot.sh
sudo chmod +x /path_to/unifihotspot.sh
sudo /path_to/unifihotspot.sh
- Se recomienda programarlo en el cron para que se ejecute cada 5 minutos:
sudo crontab -e
*/5 * * * * /path_to/unifihotspot.sh
Y es todo. 
¿Qué hace este bash script?
El script abrirá los puertos de acceso a Unifi y capturará los strings de autenticación exitosa del cliente en el hotspot con voucher y envía su dirección MAC a la lista blanca "mac-hotspot.txt", no sin antes verificar si ya existe en otras listas blancas de su elección (si existe no se agrega) y también revisa si existe en una lista negra de su elección (si existe se elimina de esa lista). Y finalmente las reglas iptables incluidas le permitirán el acceso a la red local y por ende, a internet. 
Una vez el tiempo asignado en el script, expire (que debe coincidir con el tiempo del voucher asignado al cliente), se eliminará la MAC de la lista blanca.
Importante antes de usarlo
- Tenga en cuenta que el script usa el módulo string de iptables, el cual puede tener un impacto en el rendimiento si se aplica a un gran volumen de tráfico, ya que requiere inspección de contenido. Por tanto úselo con discreción.
- Sepa que Unifi tiene sus propias reglas iptables/ebtables, por tanto el mecanismo de asignación y expiración de los vouchers funcionará, sin importar las reglas del script, así que debe haber una sincronización estricta del timestamp asignado en el voucher y en el script.
- Es posible que se presenten algunos conflictos si tiene Unifi Network Server Self-Hosted (en el mismo servidor linux que hace de gateway). Para más información pulse AQUÍ.
- Si no tiene script de iptables, se recomienda que modifique la función "add_ports" dentro del script de hotspot, ya que permite el acceso a los puertos DNS, NETBios SMB, entre otros esenciales, de su elección. Además, se recomienda agregar politicas de Iptables, tales como redireccionamiento NAT, entre otras reglas básicas de firewall no incluidas. Para mayor información consulte Firewall. Y si ya lo tiene y es "zero trust" o tiene reglas muy restrictivas, se recomienda revisar las configuraciones para que no afecte el funcionamiento. Por defecto, el script del hotspot viene con reglas tipo "Insert" (-I), lo que facilita que las reglas se procesen de primero, sin embargo puede ser necesario integrarlos.
- Sugerimos configurar los APs manualmente, con la IP del servidor Linux en el campo del gateway y DNS, y el script se encarga de activar las reglas DNS para permitir consultas. Esto para evitar conflictos con la configuración automática de los APs y que su DHCP asigne las IPs y DNS de su elección.
- Unifi trabaja con muchos puertos, puede consultarlos AQUÍ (no entendemos para que tantos) y eventualmente puede convertirse en un problema de seguridad.
- Es probable que, en algunos es escenarios, tanto cuando ingrese con su voucher asignado por Unifi como cuando expire, no abra el Landing Page. Esto es un problema recurrente con el hotspot de Unifi, sin que a la fecha haya una solución, ya que depende de muchos factores. Una alternativa es cerrar el navegador, desconectarse de la red, esperar un minuto, volverse a conectar y abrir el navegador. No obstante, si tiene un proxy, asegúrese de excluir la URL de redireccionamiento:  http://www.msftconnecttest.com/redirect 
- Hay un script de glenn que usa fail2ban para prevenir ataques de fuerza bruta a la aplicación Unifi Network, el cual bloqueará cualquier intento de acceso fallido superior a 3 por un período de 15 minutos. Para mayor información consulte AQUÍ.
Disclaimer
Este es un script experimental y depende de que muchos componentes que trabajen de manera sincronizada (dhcp, rsyslog, iptables, unifi network server, etc.), por tanto, no se garantiza su correcto funcionamiento.

Imágenes cortesía de Ubiquiti Unifi
Agradecimientos especiales a Glennn.
Descarga: Github Vault
Con la tecnología de Blogger.