CentOS7: (1/2) Hotspot con portal captivo usando VirtualBox, Wifi USB , FreeRadius, Coovachilli, HostAPd, MySQL y auto-registro.
Situación Presentada
Ya hace tiempo un amigo puso una tienda
de café y pues como todo local pequeño maneja su wifi sin aislarla de su red
local, lo cual presentaba muchos problemas, sobretodo al momento de su
facturación que requería el internet (por lo de los POS para tarjetas), y
también el riesgo de que alguien se ponga a tocar más de lo que debe en la red.
También mi amigo deseaba algo parecido a lo que tienen restaurantes en los que recaban correo electrónico y otros datos.
También mi amigo deseaba algo parecido a lo que tienen restaurantes en los que recaban correo electrónico y otros datos.
Y qué hago entonces?
Para reducirle los costos al mínimo a
mi amigo, y de paso hacer gala de lo que se puede hacer usando open source ,
algo de tiempo y dedicación, le dije que
íbamos a usar su PC de Caja con un Linux virtualizado, que solo comprara el
adaptador Wifi USB, que funciona en modo AP.
Entrando más a detalle lo que se hará
es convertir la computadora de escritorio disponible en un hotspot inalambrico
donde los clientes se podrán autenticar usando una pagina del portal captivo.
Se va a usar una pieza de software llamado
Hostapd para crear el access point con el USB wifi, se va a instalar Freeradius
para autenticar en red, CoovaChilli para montar el DHCP y redireccionar al
portal captivo.Componentes del articulo
Parte 1
2.Configuración Virtualbox
3.Freeradius, autenticacion para clientes en red
4.Hostapd, Access Point con USB Wifi
5.Modificar intensidad de señal (dBm)
Parte 2 (ir)
7.Probar portal captivo
8.Administración de usuarios
9.Autoregistro y otras personalizaciones del portal
1. Pre-requisitos para instalación
- Una computadora que pueda virtualizar por lo menos con 10GB libres y 1GB RAM.
- Un adaptador USB, en este caso se usó una TP-Link WN7200nd (chipset rt3070/rt2800) también funciona con otras como la WN722n (chipset rtl8188eus) pero deben actualizar el kernel del Linux a 4.4+.
Si
no se usan estos dos, usar cualquiera que soporte modo AP, se puede verificar esto usando el siguiente
comando:
sudo iw phy | grep -A4 -i 'Supported interface modes'
- Un Linux, en este articulo estaré usando CentOS 7, deben tener el repositorio instalado tambien.
yum install epel-release
- Todos los paquetes que vamos a instalar (y librerias de desarrollo a veces, todo esta aquí)
- Una instancia de MariaDB (o mysql), si no la tienen instalenla, el default pass para root está en blanco.
- Una conexión de red a internet (cableada preferiblemente)
- Conocimiento intermedio de manejo del shell en Linux, Virtualbox y MariaDB (MySQL) ,
2. Configuración Virtualbox (para detectar USB Wifi)
Como mencioné en los pre-requisitos,
ya deberían saber como montar una VM en esta herramienta de Oracle, así que
solo explicaré qué hay que hacer
para que mapee la USB Wifi a tu VM como que estuviera conectada directamente.
Eso se hace en las opciones de la
maquina (settings), luego en el
apartado USB , y finalmente le dan
click (con la VM apagada) en el plug/conector USB con el signo + y les
aparecerá el dispositivo, y luego le dan OK
**NOTA: Para que la VM lo detecte, tendrán
que desconectar el USB, con el filtro USB ya creado, encenderla y una vez dentro , conectar el USB
y lo encontraran.
Para confirmar que si detectó el
dispositivo, pueden correr el siguiente comando que mostrará los dispositivos
USB conectados, y deberá aparecer el que agregamos al filtro USB.
lsusb
3. Freeradius
Freeradius es un servidor de Raiuds
open source, está disponible para todas las distribuciones,
sirve para autenticar los clientes
antes que salgan a internet.
Se necesitan instalar tanto el servidor
como el plugin para mysql
yum install freeradius freeradius-mysql
freeradius-utils -y
Configurar Freeradius
MariaDB debe estar corriendo, como
mencione en los pre-requisitos ya deben tener conocimientos de eso para
llevarlo a cabo.
-Crear la base de datos para radius:
echo
“create database radius” | mysql -u [usuario_mysql] -p[password_mysql]
-Generar tablas
en la bd de radius con el esquema
que ya trae el plugin de radius:
mysql -uroot -p
radius < /etc/raddb/mods-config/sql/main/mysql/schema.sql
Crear usuario mysql para los privilegios en la bd radius, dentro de
mysql:
GRANT ALL PRIVILEGES ON radius.* to ‘usuariodb_radius’@’localhost’
IDENTIFIED by 'usuariodb_radius_password';
-Configurar
modulo sql de Radius:
**Nota: Pueden usar nano
o Emacs si no les gusta vim
sudo
vim /etc/raddb/mods-available/sql
Descomentar o cambiar los siguientes
valores:
driver = "rlm_sql_mysql"
dialect = ”mysql”
server = "localhost"
port = 3306
login = "”usuariodb_radius"
password = "usuariodb_radius_password"
read_clients = yes
dialect = ”mysql”
server = "localhost"
port = 3306
login = "”usuariodb_radius"
password = "usuariodb_radius_password"
read_clients = yes
-Contadores sql para chillispot :
sudo vim /etc/raddb/mods-available/sqlcounter
agregar al final del archivo :
$INCLUDE
${modconfdir}/sql/counter/${modules.sql.dialect}/chillispot.conf
-Agregar los link simbolicos para el modulo sqlcounter:
sudo ln -s /etc/raddb/mods-available/sql /etc/raddb/mods-enabled/sql
sudo ln -s /etc/raddb/mods-available/sqlcounter /etc/raddb/mods-enabled/sqlcounter
sudo ln -s /etc/raddb/mods-available/sqlcounter /etc/raddb/mods-enabled/sqlcounter
-Configurar servidor radius:
sudo
vim /etc/raddb/radiusd.conf
Bajo la sección seguridad, cambiar
el usuario y gripo creados durante la instalación:
user
= radiusd
group = radiusd
allow_vulnerable_openssl = yes
**Nota: No hacer esto realmente en producción, lo mejor es actualizar la versión del openSSL
group = radiusd
allow_vulnerable_openssl = yes
**Nota: No hacer esto realmente en producción, lo mejor es actualizar la versión del openSSL
Bajo la sección “ instantiate “ por
la linea 728, agregar los siguientes modulos de contador:
chillispot_max_bytes
noresetcounter
noresetcounter
-Configurar el servidor virtual default en sites-available:
sudo
vim /etc/raddb/sites-available/default
Bajo la sección “ authorize “:
Comentar lo siguiente:
Comentar lo siguiente:
#filter_username
Des-comentar lo siguiente:
auth_log
unix
unix
Cambiar lo siguiente:
'-sql'
a sql
Agregar lo siguiente al final de la
sección “ authorize “ por la línea 273:
chillispot_max_bytes
noresetcounter
noresetcounter
Bajo la sección ” accounting “, descomentar:
radutmp
Cambiar:
'-sql' a sql
Bajo la sección ” session “ , descomentar:
radutmp
sql
sql
Bajo la sección ” post-auth “, descomentar:
reply_log
Cambiar lo siguiente:
'-sql' a sql
-Configurar las solicitudes del servidor virtual para el inner tunnel:
sudo vim /etc/raddb/sites-available/inner-tunnel
Bajo la sección ” authorize “, cambiar:
'-sql'
a sql
Agregar lo siguiente al final de la
seccion “ authorize “:
chillispot_max_bytes
noresetcounter
noresetcounter
Bajo la sección ” session “, descomentar:
sql
Bajo la sección ” post-auth “, descomentar:
reply_log
Cambiar:
'-sql'
a sql
-Configurar clients del radius
sudo
vim /etc/raddb/clients.conf
Poner el password usado para acceder
a verificación de clientes a la base de datos de FreeRadius (mínimo 8
caracteres):
secret
= probando123
-Agregar los siguientes contadores para Chillispot:
sudo vim /etc/raddb/mods-config/sql/counter/mysql/chillispot.conf
sqlcounter chillispot_max_bytes {
counter_name = Max-Total-Octets
check_name = ChilliSpot-Max-Total-Octets
reply_name = ChilliSpot-Max-Total-Octets
reply_message = "You have reached your bandwidth limit"
sql_module_instance = sql
key = User-Name
reset = never
query = "SELECT IFNULL((SUM(AcctInputOctets + AcctOutputOctets)),0) FROM radacct WHERE username = '%{${key}}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%%b'"
}
counter_name = Max-Total-Octets
check_name = ChilliSpot-Max-Total-Octets
reply_name = ChilliSpot-Max-Total-Octets
reply_message = "You have reached your bandwidth limit"
sql_module_instance = sql
key = User-Name
reset = never
query = "SELECT IFNULL((SUM(AcctInputOctets + AcctOutputOctets)),0) FROM radacct WHERE username = '%{${key}}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%%b'"
}
-Cambiar permisos de logs y archivos de configuración:
sudo touch /var/log/radius/radutmp
sudo chown -R radiusd:radiusd /etc/raddb
sudo chown -R radiusd:radiusd /var/log/radius
sudo chown -R radiusd:radiusd /etc/raddb
sudo chown -R radiusd:radiusd /var/log/radius
-Crear usuario Admin de Radius en db de mariadb:
mysql -u usuariodb_radius -p -e "INSERT INTO radius.radcheck
(UserName, Attribute, Op,Value) VALUES ('usuario_admin', 'Cleartext-Password', ':=',
'password_admin');"
Deberia quedar algo así
:
**Nota: Nota que el
valor del password debe ser fuerte, no de diccionario.
-Iniciar Radius para realizar prueba
sudo systemctl start radiusd
Abrir nueva terminal y ejecutar lo
siguiente:
radtest usuario_admin password_admin 127.0.0.1 1645 probando123
Tendria que salir algo así, y al
final recibir un mensaje Access-Accept:
4. Hostapd
hostapd es un excelente software que
permite convertir un Linux en un punto de acceso wifi (AP) WPA/WPA2 totalmente
configurable
Para instalarlo, ejecutar
yum
install hostapd -y
Para verificar que fue instalado
ejecutar:
hostapd -v
-Configurar hostapd
Abrir archivo de configuración:
sudo
vim /etc/hostapd/hostapd.conf
Cambiar lo siguiente en este archivo:
driver=nl80211 # el driver interface entre las operaciones
wifi y el kernel
interface=wlan0 # cambiar este a tu dispositivo wifi (ver con comando ip a )
ssid=MiRedPlecaEtece # cambiar para que sea tu SSID
hw_mode=g # modo de wireless
channel=6 # canal
ieee80211n=1 # habilita el Wireless N
interface=wlan0 # cambiar este a tu dispositivo wifi (ver con comando ip a )
ssid=MiRedPlecaEtece # cambiar para que sea tu SSID
hw_mode=g # modo de wireless
channel=6 # canal
ieee80211n=1 # habilita el Wireless N
wpa=1
wpa_passphrase=password_wpa
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP
wpa_passphrase=password_wpa
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP
o si quieren con la red abierta, para
utilizar la autenticación Radius (portal) únicamente, cambiar
wpa=0
-Iniciar y probar hostapd:
Hay que poner el estado del cliente
Wifi en off, y luego quitar el modo avión(desbloquearlo):
sudo nmcli radio wifi off
sudo rfkill unblock wifi
Iniciar servicio
sudo systemctl start hostapd
Si todo esta bien, debería iniciar
el servicio y con cualquier dispositivo deberían ver la red disponible CON los parámetros
que le dimos (tipo de red, contraseña, si es abierta, etc)
5. Modificar intensidad de wifi (dBm)
Para esto, primero debemos identificar cuanto
es el máximo que soporta en dBm nuestra tarjeta wifi, ejecutando este comando.
sudo iw list | grep
dBm
Nos muestra que para todos los canales
disponibes, el máximo son 20 dBm.
-Cambiar
potencia de transmisión.
Esto se hace en unidades mBm , donde
cada 1dBm = 100 mBm, es decir
20 dBm = 2000 mBm máximo, y el mínimo pues,
hay que ir probando hasta encontrarlo.
En el caso de la USB wifi usada para
este articulo, lo mínimo son 900 mBm ó 9dBm, que equivale como a 5 metros a la
redonda.
sudo iw dev wlp0s6u1
set txpower limit 900
No hay comentarios:
Publicar un comentario