OpenWrt: ver cuántos clientes (Wi-Fi, ethernet) se conectaron al router

Actualmente manejo un punto Wi-Fi abierto de la red libre La Otra Red, y suele darme curiosidad cuánta gente se ha conectado. Los routers hotspot tienen OpenWrt instalado, y aprovechando DHCP, mediante la interfaz web podemos ver a los clientes que solicitaron direcciones IP (y por lo tanto, se han conectado a la red).

El problema es éste: los registros sólo duran el tiempo que el servidor DHCP le ha asignado la dirección.

 

Para no perder registros podemos aumentar el TTL de las asignaciones a 12 horas, pero en un evento de uso masivo muchos usuarios se quedaran sin conectarse (dnsmasq reservará por 12 horas una dirección IP aunque el primer usuario sólo la use dos minutos, y si no hay más direcciones disponibles no responderá y la conexión fallará).

Se me ocurrió una idea no tan elaborada: se puede mantener un TTL más bajo (30 minutos) y obtener las combinaciones fecha-hora-IP-MAC desde logread.

Par esto, necesitamos que el tamaño de buffer del registro de sistema sea al menos 64K (OpenWrt suele configurarlo por defecto a 16K). Esta opción esta en el menú Sistema de LuCI.

Obteniendo combinaciones Fecha-IP-MAC-Hostname

logread | grep dnsm | grep ACK | cut -d " " -f 1-6,10-12

Con este comando 1) obtenemos el registro syslog, 2) filtramos los registros no-dnsmasq, 3) obtenemos las direcciones DHCP medianamente bien negociadas, y eliminamos columnas de datos innecesarias.

Al final obtendremos registros parecidos a éste:

Sun Dec  4 10:17:48 2016 172.24.0.163 c8:38:70:6d:xx:xx android-d2c1e0088xxxxxxx
Sun Dec  4 10:20:49 2016 172.24.0.186 38:d4:0b:f9:xx:xx android-12d628c44xxxxxxx
Sun Dec  4 10:39:13 2016 172.24.0.145 20:55:31:d0:xx:xx android-5e4e127c2xxxxxxx
Sun Dec  4 10:44:18 2016 172.24.0.183 3c:bb:fd:b1:xx:xx android-6596fdce1xxxxxxx

Obteniendo combinaciones únicas IP-MAC-Hostname

logread | grep dnsm | grep ACK | cut -d " " -f 10- | sort -n | uniq -u

Con este comando 1) obtenemos el registro syslog, 2) filtramos los registros no-dnsmasq, 3) obtenemos las direcciones DHCP medianamente bien negociadas, 4) eliminamos columnas de datos innecesarias, 5) ordenamos los registros y 6) eliminamos los registros duplicados.

Al final obtendremos registros parecidos a éste:

172.24.0.132 d4:a1:48:cf:xx:xx android-6c2612059xxxxxxx
172.24.0.136 ac:cf:85:d8:xx:xx android-3ed8050aaxxxxxxx
172.24.0.142 1c:cb:99:a4:xx:xx android-aef6895bbxxxxxxx