lunes, 28 de enero de 2013

Pfsense 2: Captive Portal+FreeRadius2 Manejo de Tiempo.

Hemos estado trabajando con otros usuarios de Pfsense en un problema que para muchos como yo es importante en un software como pFsense, como controlar los usuarios inhalambricos atraves de un CaptivePortal.

Como sabran, Pfsense tiene su propio CaptivePortal(CP de aqui en adelante) y asu vez tiene en su paqueteria a FreeRadius tanto 1 como 2, pero nos vamos a enfocar en la versión 2(FR2 de aqui en adelante).

Uniendo estos 2 paquetes tenemos algo que encontramos en productos como Mikrotik, Ruckus, etc. Ya podemos controlar nuestros usuarios en base a tiempos de navegación, por ejemplo:

usr1 2 minutos
usr2 4 minutos
usr3 8 minutos
etc.

La logica dice que CP estara autenticando los usuarios cada 60 segundos y con esto FR2 validara si a el usuario aun le queda tiempo de navegacion atraves del modulo "Counter" que es parte de FR2 y el llevara a cabo la funcion de estar llevando los contadores de tiempo de cada usuario.

Asi podriamos tener un sistema de cobro por tiempo por ejemplo, un usuario llega y paga 1 hora por adelantado, le damos su usuario+contraseña y listo.

Esto es como deberia funcionar, pero CP tiene ciertos problemas los cuales un usuario que lo veran en este link da un parche para atacar el problema que les voy a explicar enseguida:

Parche CP.

Problema de CP.

Resulta ser que CP no esta enviando los paquetes de Start/Stop cada 60 segundos, algo que yo he notado en mis pruebas es que no importa el tiempo que se le asigne a el usuario, siempre lo saca a los 5 minutos, y este asunto otros tambien lo han notado.

No es problema de FR2 si no del codigo de CP, por ello aqui plasmo  las indicaciones del parche que nos dan para este problema, quiero aclarar que ese parche es para versiones anteriores a la 2.0.2, ya que este ultima cambio algo no mucho pero si algo, no hay problema yo estoy con la ultima version(2.0.2) y aplique los cambios y al momento me esta funcionado.

Lo 1ro que vamos hacer es configurar FR2 en Pfsense, que es lo que sigue para probar, la instalacion no tiene ciencia ya que Pfsense se encarga de todo, asi que antes de seguir instalen el paquete FreeRadius2.

Caracteristicas de Instalacion:
Pfsense 2.0.2
3 NIC's:
  1. WAN
  2. Lan DHCP
  3. Wifi DHCP
La interface WiFi tiene conectado un access point Cisco WRT54G2 v1.5, no autentifica nada esta abierta, recuerden que todo lo controla CP asi que no hay problema ya que confio plenamente que aunque reciban IP los que no pertecen a mi red no podran navegar.


Configurando FreeRadius 2

Figura 1: Configuracion Incial de FR2.


Figura 2: Configuracion de la interface y puertos  necesarios.




Figura 3: Configuracion de NAS/Clientes.

Figura 4: Configuración de 1 usuario.
Figura 5: Configuración de Captive Portal.
Basados en la figura-4 pueden agregar mas usuarios solo modificando el parametro de "Amount of Time" para cada uno asi podran entender esta configuración.

Reglas de Firewall

Antes de seguir recordar que Pfsense por default la interface opt1 en adelante no tiene reglas asi que nada puede cruzar por ahi asi que yo solo deseo ofrecer lo siguiente:
Figura 6: Reglas de la red Inhalambrica.
 Por ultimo debemos aseguranos que ambos servicios esten operando
Figura 7: Servicios en linea.
Aplicación de Parche

Si ya llegaron aqui es momento de llevar a cabo la aplicación del parche, aqui les recomiendo que abran su shell o consola via ssh ya que ahi que ensuciarse las manos con nuestro editor "ee", no soy hacker asi que no logre crear al parche y darselos, si alguien sabe de favor agreguenlo con los pasos necesarios para aplicarlo :-).

Vamos a editar el archivo que controla a CP este se localiza en:

/etc/inc/captiveportal.inc

Recomendacion: Antes de modificar el archivo saquen un respaldo del archivo y tengalo a la mano por si algo les falla.

Vamos a usar a nuestro amigo "diff" para que nos muestre nuestras diferencias y hacer la  tarea mas sencilla:

diff  /etc/inc/captiveportal.inc /root/captiveportal.inc
730,731c730
<               $stop_time - 60,
<               //$cpentry[0], // start time
---
>               $cpentry[0], // start time
735,739c734,735
<               //10); // NAS Request
<               10, // NAS Request
<               false, //Not interim update
<               $stop_time);
<               exec("/sbin/ipfw table 1 entryzerostats {$cpentry[2]}");
---
>               10); // NAS Request
>               exec("/sbin/ipfw table 1 entryzerostats {$cpentry[2]}");
741,742c737
<               exec("sleep 1");
<               RADIUS_ACCOUNTING_START($cpentry[1], // ruleno
---
>               RADIUS_ACCOUNTING_START($cpentry[1], // ruleno
799d793
<               $stop_time - 60,
872d865
<               $stop_time = time();
878d870
<               $stop_time - 60,
883,885c875
<               //7); // Admin Reboot
<               7, // Admin Reboot
<               false, $stop_time);
---
>               7); // Admin Reboot

Aproximadamente en la linea 730 nuestro codigo queda asi:

                /* do periodic RADIUS reauthentication? */
                if (!$timedout && !empty($radiusservers)) {
                        if (isset($config['captiveportal']['radacct_enable'])) {
                                if ($config['captiveportal']['reauthenticateacct'] == "stopstart") {
                                        /* stop and restart accounting */
                                        RADIUS_ACCOUNTING_STOP($cpentry[1], // ruleno
                                                $cpentry[4], // username
                                                $cpentry[5], // sessionid
                                                $stop_time - 60,
                                                //$cpentry[0], // start time
                                                $radiusservers,
                                                $cpentry[2], // clientip
                                                $cpentry[3], // clientmac
                                                //10); // NAS Request
                                                10, // NAS Request
                                                false, //Not interim update
                                                $stop_time);
                                        exec("/sbin/ipfw table 1 entryzerostats {$cpentry[2]}");
                                        exec("/sbin/ipfw table 2 entryzerostats {$cpentry[2]}");
                                        exec("sleep 1");

Luego nos brincamos a la linea 799 vamos a dejar asi el codigo:

function captiveportal_disconnect($dbent, $radiusservers,$term_cause = 1,$stop_time = null) {
        global $g, $config;

        $stop_time = (empty($stop_time)) ? time() : $stop_time;

        /* this client needs to be deleted - remove ipfw rules */
        if (isset($config['captiveportal']['radacct_enable']) && !empty($radiusservers)) {
                RADIUS_ACCOUNTING_STOP($dbent[1], // ruleno
                        $dbent[4], // username
                        $dbent[5], // sessionid
                        $stop_time - 60,
                        $dbent[0], // start time
                        $radiusservers,
                        $dbent[2], // clientip
                        $dbent[3], // clientmac
                        $term_cause, // Acct-Terminate-Cause
                        false,
                        $stop_time);
        }

Y aproximadamente en la linea 872 dejamos asi el codigo:

/* send RADIUS acct stop for all current clients */
function captiveportal_radius_stop_all() {
        global $config;

        if (!isset($config['captiveportal']['radacct_enable']))
                return;

        $radiusservers = captiveportal_get_radius_servers();
        if (!empty($radiusservers)) {
                $stop_time = time();
                $cpdb = captiveportal_read_db();
                foreach ($cpdb as $cpentry) {
                        RADIUS_ACCOUNTING_STOP($cpentry[1], // ruleno
                                $cpentry[4], // username
                                $cpentry[5], // sessionid
                                $stop_time - 60,
                                $cpentry[0], // start time
                                $radiusservers,
                                $cpentry[2], // clientip
                                $cpentry[3], // clientmac
                                //7); // Admin Reboot
                                7, // Admin Reboot
                                false, $stop_time);
                }
        }
}

Revisen muy bien sus cambios, si creen que ya hicieron todo acorde, les recomiendo ampliamente reiniciar su equipo y revisar si no les marca algun error el archivo, lo van a ver en el GUI cuando le digan si a el boton de reboot.

Pruebas

Ya con su equipo en linea, sin errores y sobre todo ambos servicios operando, conecten su "access point" y prendan su PC, tableta o lo que tengan inhalambrico para empezar las pruebas, se conectan a su red y les debe aparecer la pagina de CP.

Metan su usuario de prueba y empiecen a navegar, se van a su pfsense y abran la pagina de Status-CaptivePortal y vean la hora que inicio su usuario:

Figura 8: Estatus de CP.
Un detalle es que una vez que el usuario termina si sesión el GUI no muestra su historial, pero por ello entra en funcion el log atraves de la consola, abran su shell y vean como van evolucionando el usuario:

Figura 9: Log de fr2.
Como podran ver cada cierto tiempo NAS esta enviando paquetes a FR2 y este asu vez los valida y si el usuario aun esta dentro del tiempo asignado le es permitido seguir navegando.

Cuando llega a su fin tenemos esto:

Figura 10: Usuario llego a su limite.
El contador no es exacto, aun estan haciendo ajustes que estos dias voy a probar, si sacamos la diferencia el usuario navego:
Figura 11: Tiempo que duro usuario navegando.
Pero aqui lo importante es que ya CP puede ser usado para controlar los tiempos de navegacion, ya podemos cobrar x tiempo, espero puedan llevar a cabo sus pruebas y regresen con sus resultados, mientras mas informacion de pruebas haya mejor, y si hay errores para informacion y seguir mejorando el codigo, saludos.

2013-01-30

Detalles
Sesion abierta y cambio de dia: Supongamos que el usuario8, tiene 1 hora diario ejemplo arranca su sesion el dia 30/01/2013, pero el entra a las 23:30PM, que pasa?

Bien CP le va a dar 2 horas de navegacion, por que?

CP/FR2 validan la duracion de la sesion pero no controlan estos cambios de dia, ya que ellos validan que durante el dia X el usuario haya consumido su tiempo asignado, y al brincarse a el dia Y es otro dia, por lo tanto reinicia el contador en 0, por ello el usuario tendra su hora del dia X+Y siempre y cuando en el dia X le quede menos de lo asignado cuando el inicio su navegacion.

Esto les puede pasar, entonces si tienen usuarios nocturnos y les reclaman por que ya no puede navegar en Y dia por la noche, digales que dice radius.log no miente sale, saludos!!!

43 comentarios:

ProFx dijo...

Hola, he leído bastente en tu blog y sabes mucho de pfsense. Tengo una pregunta espero me ayudes a resolverla.

He configurado el captive portal de pfsense y funciona perfectamente a través de vouchers o tikets. Pero he notado que las peticiones que inician con "https://" pfsense no las responde. he googleado mucho y al parecer es un problema que viene desde m0n0Wall(distro en la que esta basado pFsense) ¿Sabes algun metodo o forma de redireccionar a los clientes del puerto 443 al 80?

Pedro Moreno dijo...

He leido del problema de pfsense CP con https, dejame le doy una revisada, o sea cuando ingresa el cliente https://gmail.com no hace nada? Saludos.

Unknown dijo...

creo que eso lo solucionas con los certificados, cada conexion https debe de estar acompañado del certificado del cervidor... verifica que los certificados que crees en pfsense esten correcto y que los entrege correctos

Unknown dijo...

Hola Pedro, es muy bueno tu blog, te felicito, la intención de mis líneas era la de pedirte el favor de subir otra vez las fotos, lo que pasa es que en algún paso estoy fallando y no distingo en cuál porque se ven muy pequeñas las fotos, si intento agrandarlas se pixelean...

O si pudieras enviármelas a mi correo (principalmente las primeras)te lo agradecería mucho...
bto377@gmail.com

Muchas gracias de antemano... un saludo hasta la hermosa Baja Caliornia

Pedro Moreno dijo...

Hola Beto, ya te envie las imagenes, saludos!!!

Admin dijo...

Me podrias enviar las reglas del firewal, ya que en las capturas de pantalla no se ve muy claras.

Admin dijo...

Me podrias enviar las pantallas de las reglas de firewall, ya que no se ven claramente

Anónimo dijo...

Estimado Pheriko leo constantemente sus comentarios y me sorprende lo mucho que conoce este sistema (pfsense), soy muy nuevo en esto y poseo una pequeña empresa proveedora de Internet y quisiera saber (lenta y detalladamente) como dejarlo listo al pfsense en caso de superar las 254 ip's y digamos dejarlo como para 500 clientes.
La persona que me instalo se borró (como decimos acá en Argentina) y luego de cobrar sus honorarios por un sistema gratuito me dejó en banda.
Desde ya muchas gracias y lo felicito por su sapiencia.
Carlos Bechara, Resistencia, Chaco, Argentina

Pedro Moreno dijo...

Creo que por ahi te vi en el foro de Pfsense, y vi que te explicaron, te quedo clara la info o aun tienes dudas al respecto, las imagenes, no veo tu correo para enviarte las imagenes por alguien las solicito, saludos!!!

Julian dijo...

Saludos desde Venezuela un placer, queria saber si me podrias enviar las capturas de configuracion que no se ven muy claras, estoy actualmente desarrollando una zona Wifi con unos equipos que en teoria soportan Handover y el control lo hare con un PFsense a ver como nos va. saludos y gracias. julian.deachurra@gmail.com

Pedro Moreno dijo...

Enviadas, saludos.

Enigmahernandez - EnigmaGirl dijo...

Te doy las gracias por publicar este tutorial.

Quiero vender internet por tiempo y me gustaría mucho aplicarlo.

Existirá una forma de agregar o quitar usuarios, dar de baja o de alta a los usuarios por medio de alguna base de datos externa como MySQL o similar?

Lo que si te voy a pedir es que me puedas mandar las imágenes porque efectivamente son muy pequeñas.

a mi correo:
enigmahernandez
(es de Gmail, no lo puse completo por cuestión de evitar SPAM)

te lo agradeceré si me lo mandas.

Otra cosa, puedes hacer algun tutorial de optimizar un pfSense desde cero? Creo que sería mucho pedir (pero los milagros existen jajajaj) Saludos y espero tu correo. Besos nos vemos

Enigmahernandez - EnigmaGirl dijo...

espero que mi correo se entienda :D

Pedro Moreno dijo...

Claro que si puede FR2 accesar a MySQL solo tienes que crear la BD, tablas y todo ese rollo y darle los parametros a PF.

Hacerte un tutorial desde 0, mmm es mucho pedir...tiempo cuesta.

Te mando las fotos, saludos.

Julian dijo...

Saludos Pedro gracias por las imagenes exelentes, te comento que tengo configurado el portal con el freeRadius y todo funciona sin problemas, el unico detalle es que si el usuario tiene como homepage una pagina https el pfsense no redirecciona a la pagina de login, he buscado soluciones pero nada, sabes algo al respecto?? Gracias

Pedro Moreno dijo...

https atraves de CP es un problema que aun no se ha resuelto, te lo digo por que segun los post ni en la 2.1, aqui es que los usuarios pongan otra pagina que no sea HTTPS y listo.

No pasa nada que tengan que dar unos clicks mas para llegar a su pagina, no ahi que chiquearlos tanto, no todo es perfecto en la vida.

Saludos.

Unknown dijo...

Hola, Pedro, primeramente me disculpo por la molestia que pueda llegar a darte pero pienso puedes ayudarme. Tengo un problema con el FreeRadius 2 de pfsense, (si checo en la pestaña "servicios" FreeRadius 2 está parado, no corre si se le inicia y cuando se está iniciando pfsense, en la pantalla conectada a la máquina que aloja el sistema SÍ carga el paquete (...done)) por ahí me dijeron sobre una posible solución mediante un test básico pero no me funcionó, ¿qué otra solución podría existir?... si pudieras ser explícito te lo agradecería mucho...

De antemano, gracias, saludos desde Veracruz.

Enigmahernandez - EnigmaGirl dijo...

Gracias por las fotos, por el tutorial no hay quilombo todo bien, se entiende y debo poner mi esfuerzo. Gracias

Pedro Moreno dijo...

De nada enigma.
Beto, revisa los logs de pfsense, muchos de los motivos por los cuales FR2 no arranca son a veces por algun parametro mal y en los logs me ha tocado verlos, saludos.

Pedro Moreno dijo...

De nada enigma.
Beto, revisa los logs de pfsense, muchos de los motivos por los cuales FR2 no arranca son a veces por algun parametro mal y en los logs me ha tocado verlos, saludos.

Anónimo dijo...

Beto debes desistalar o detener el servicio de squid y ahí si instalar el freeradius crear tus usuarios y las interfaces a escuchar y enseguida iniciar el squid o instalarlo de seguro le va a funcionar

Anónimo dijo...

Hola:
ME puedes enviar las fotos así como las reglas del firewall? ME es imposible verlas.
Gracias por utilizar tu tiempo en hacer este magnifico tutorial.
Mi mail es joanmic@gmail.com

Un saludo y gracias.

Anónimo dijo...

Hola ente nada darte las gracias por tu tiempo y tu ayuda para los que no sabemos como yo
si me puedes mandar las fotos pues estoy aprendiendo en pfsense y quisiera configurarlo bien
mi nambre Antonio

tonicab40@hotmail.com
desde lla muchas grasias

Pedro Moreno dijo...

Revisen su correo, saludos.

Rafa dijo...

Hola serias tan amable de colocar algunas plantillas para descargar en html para el portal captivo quiero colocar unas imagenes

Rafa dijo...

bueno la idea es colocar una pagina donde muestre mi publicidad al entrar al portal donde los usuarios llamen tengo varias paginas web pero no se como insertar el login y el password para que se conecten

grab27@hotmail.com

Jefferson dijo...

Saludos Cordiales, excelente tutorial estoy nuevo en la instalación y uso de Pfsense, me podrías enviar las imágenes y una copia del archivo captiveportal.inc por que no entendí mucho los cambios que hay que hacer al archivo y asi comparar el que me envias con el que tengo en mi pfesense, muchas gracias de antemano

jefferson.camacho@gmail.com, gracias

Pedro Moreno dijo...

Hola.

Si eres bueno en programacion HTML es todo lo que requieres para hacer una pagina que llame la atencion de tus clientes, la carretera esta puesta, ahora que tipo de construccion vas a poner para atraer a gente?

Jefferson, dejame vuevlo a sacar esta configuracion, estoy en otras cosas y esa no la he tocado o sea la reinstale por que estoy de lleno en la 2.1, espero darme tiempo de mandarte eso, saludos.

jmercado dijo...

periko a ver si me das una mano tengo que configurar pfsense para 500 usuarios y no logro hacer que el dhcp me de las direcciones hasta los 500 usuarios como le hago te agradezco de antemano mi correo jljl2204@gmail.com

Anónimo dijo...

Buenas noches compañero podrías enviarme las imágenes ya que no se ven bien soy muy pequeña y no puedo seguir la configuración.//// manaricuto16@hotmail.com

Pedro Moreno dijo...

Jmercado, disculpa pot la tardanza.
Para 500 usuarios debes abrir tu mascara de red.

/24 te da 254 IP's hay calculadores en linea para buscar la mascara que te va a servir a ti, saludos.

Anónimo dijo...

esta bueno tus indicaciones, pero yo tengo un problema resulta que algunas pc se pueden conectar otras no pasan de la pagina de bienvenida
aunque ponen la contraseña.
cual puede ser el problema, el portal me trabjo bien todo el año pero ahora tengo este problema.
cualquier sugerencia sera bienvenida. gracias.
fidel_asitel@hotmail.com

Anónimo dijo...

hola su post esta perfecto solo que las imagenes son tan pequeños que no se entiende nada si tan amable puede enviar de nuevo pata aplicar su conocimiento
tambien le comento yo tngo pfsense 2.2.2 con freeradius2 + captive portal
tengo problema que los usuarios creados en FR cuando se les termina el tiempo definido se desconecta pero ellos se pueden volver a conectar aunque en FR tengo definido daily (ejemplo 1 hora) al parecer funcion de FR time period no funciona no se en que parte tengo falta configuracion si me da un manito le agredeceria antemano muchas gracias
saludos desde Ecuador
Aytac DEDE (aytacdede@gmail.com)

Anónimo dijo...

hola su post esta perfecto solo que las imagenes son tan pequeños que no se entiende nada si tan amable puede enviar de nuevo pata aplicar su conocimiento
tambien le comento yo tngo pfsense 2.2.2 con freeradius2 + captive portal
tengo problema que los usuarios creados en FR cuando se les termina el tiempo definido se desconecta pero ellos se pueden volver a conectar aunque en FR tengo definido daily (ejemplo 1 hora) al parecer funcion de FR time period no funciona no se en que parte tengo falta configuracion si me da un manito le agredeceria antemano muchas gracias
saludos desde Ecuador
Aytac DEDE (aytacdede@gmail.com)

Ezequiel D.R dijo...

Hola gente. Alguien ha logrado el logueo de portal cautivo mediante el puerto 443 (https)? Se que activando los certificados de seguridad es posible lograrlo pero solo utilizando la autenticación a nivel local no mediante freeradius2. Cualquier novedad aporten? Saludos desde Argentina

Unknown dijo...

excelente post. existe la opción para que cada usuario pueda modificar la clave por defecto otorgada por el administrador. para el acceso al portal cautivo
gracias

Pedro Moreno dijo...

Hola Alex, tienes todo el codigo a la mano, si no sabes programar buscate un amigo programador y metanse al codigo y lo podran hacer eee, no hay limites aqui, saludos.

Unknown dijo...

Muy bueno el post se que el post es de hace algun tiempo pero me encantaria probarlo y las imagenes no se ven muy bien a ver si me podrias enviar las imagenes por correo rusocuba@gmail.com gracias de antemano.
Saludos

prueba dijo...

Saludos Pedro

Apenas conozco de PFsense, y estoy emplementandolo para controlar el acceso y tener estadisticas de las conexiones realizadas en la empresa.

Muy bueno tu tutorial, me podrias porfa enviar las fotos porqu eno se ven bien y sabes si ya se ha solucionado el acceso al portal por htmls.

mi correo es luesato882@yahoo.com

Muchas gracias por la colaboracion

Luis Saavedra
Colombia

Carlos Javier Molina dijo...

Muchas gracias amigo, de verdad que me ayudo mucho este tuto, ... tambien soy nuevo en este tema y esta pasando algo que no se la razon y me gustaria saber si me pueden ayudar!
Mis clientes cuando entran al portal y se logean, el navegador en vez de redireccionarlos a la pagina de google, que fue la que indique para "After authentication Redirection URL" los manda a la pagina que indique para fin de session! y aunque si logra navegar despues de logear, resulta algo confuso que el navegador les diga q su session finalizo!! a que se debe esto? como puedo solucionarlo!? de ante mano muchas gracias!!

ovc dijo...
Este comentario ha sido eliminado por el autor.
ovc dijo...

Saludos Sr. Pedro esta fabuloso el tuto, tambien soy nuevo en esto del pfsense y estoy atorado en la parte de las reglas del firewall o se si me podria facilitar las imagenes para dar los permisos a mi interfas..!! ^^Saludos desde veracruz, mex.

overa06@gmail.com

Carlos Javier Molina dijo...

Saludos amigo! muchas gracias por su aporte! tengo una pregunta respecto a los vaucher, ya lo instale y me funciona bien, pero yo quisiera que los vauchers trabajaran mas o menos asi: un vauche que 120 minutos pero que el cliente pueda consumirlos por partes, es decir, navego 15 minutos hoy en la mañana y se desconecto, y 30min en la tarde y al dia siguiente 15 minutos mas! se puede configurar asi? es que hasta ahora en las pruebas que he realizado, una vez que el usuario intruduce el vaucher se consume el tiempo continuo! se puede dela forma que planteo? de nte manos muchas gracias. esperare con entusiasmo su respuesta! feliz dia!