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 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 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 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 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
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 las variables LAN/WAN por el nombre real de la interfaz que va a usar para LAN de acuerdo con systemd/udev. Por defecto:
## Defines variable for the LAN interface. To find out your network interfaces, run:
## ip -o link | awk '$2 != "lo:" {print $2, $(NF-2)}' | sed 's_: _ _'
wan=enp2s0
lan=enp2s1
- 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 este apartado debe modificar el script según sus necesidades. Debe eliminar o agregar puertos que necesite abrir o cerrar para los clientes del hotspot. Para eso debe determinar el tipo de tráfico que maneja. Por ejemplo, si va a usar 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" (por defecto 8000). Si no tiene nada de lo anterior, simplemente agregue el puerto 443 donde se indica. Por defecto:
# Local ports for authenticated client (Optional)
# Important about localports
# If you use Squid-Cache, you must add the proxy port (e.g. 3128)
# If you don't use proxy, If you don't use proxy, and your traffic is direct, add port 443
# If you use DHCP Option 252 and a published .pac file, you must add the apache2/Nginx port of the .pac
# Edit this variable and remove or add the ports to authorize. By default:
# RFC 2131 DHCP BOOTP protocol (67,68), NETBios (137:139), Microsoft-DS and SMB (445), SNMP (162), Open cups (printing service) udp/tcp for lan users IPP (631), Proxy PAC Apache2 (8000), Squid-Cache (3128), DNS (53) DNS over TLS (853)
# WARNING: Add HTTPS (443) port, in case of transparent proxy or non-proxy
localports="67,68,137:139,445,162,631,8000,3128,53,853"
- 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 al portal 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 (insistimos, 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.
- 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 de este 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Í.
- Se recomienda agregar politicas de Iptables, tales como redireccionamiento NAT forwarding, Masquerade, Global Policies, 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 abrir 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, o la primera vez que se conecte, no abra el Landing Page. Esto es un problema conocido, sin que a la fecha haya una solución (ver issues AQUI y AQUI). Una posible alternativa es cerrar el navegador, desconectarse de la red, esperar un minuto, volverse a conectar y abrir el navegador, pero esto no es garantía (esperar que unifi algún día arregle este problema).
- 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Í.
- Si tiene un proxy, permita el acceso de la URL: http://www.msftconnecttest.com/redirect 
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.