Servicio Portal Cautivo queda colgado



  • Buenas tardes.
    Tenemos 2 años con nuestro pfsense con portal cautivo y autenticación por FreeRadius
    Tenemos CRON para que se reinicie el servidor una vez por semana y Service Watchdog por si un servicio no levanta.
    El caso es que algunos días el servicio de portal cautivo aun estando ejecutándose se queda colgado y no deja la navegación de los dispositivos que se conectan. Debemos reiniciarlo manualmente y es algo molestoso

    Tenemos alrededor de 130 usuarios y 15 AP

    Que comentarios nos tienen

    Gracias



  • Hola.

    Sin logs y debug seria adivinar la causa del problema.

    Un doc de pfSense de solución de problemas con Captive Portal.

    https://doc.pfsense.org/index.php/Captive_Portal_Troubleshooting

    Mientras averiguan la causa del problema, yo intentaria programar un Cron cada día a una hora, para parar el Captive Portal
    El comando seria, para una zona del captive portal llamada zona1

    /usr/local/sbin/pfSsh.php playback svc stop captiveportal zona1
    
    

    [2.3.2-RELEASE][root@pfSense.localdomain]/scripts: /usr/local/sbin/pfSsh.php playback svc stop captiveportal zona1

    Starting the pfSense developer shell….

    Attempting to issue stop to captiveportal service...

    captiveportal has been stopped.

    Y luego otro cron a la misma hora y un minuto después, iniciar Captive Portal

    /usr/local/sbin/pfSsh.php playback svc start captiveportal zona1
    
    

    [2.3.2-RELEASE][root@pfSense.localdomain]/scripts: /usr/local/sbin/pfSsh.php playback svc start captiveportal zona1

    Starting the pfSense developer shell….

    Attempting to issue start to captiveportal service...

    captiveportal has been started.

    Si tienes más zonas en captive portal, deberás crear un cron de parada y otro de inicio por cada zona.

    También puedes probar con sólo un Cron que reincie el Captive Portal con la opción restart (a veces parar un servicio, dejar pasar un delay de sgs, y volver a lanzarlo es más seguro, todo es probar)

    /usr/local/sbin/pfSsh.php playback svc restart captiveportal zona1
    

    [2.3.2-RELEASE][root@pfSense.localdomain]/scripts: /usr/local/sbin/pfSsh.php playback svc restart captiveportal zona1

    Starting the pfSense developer shell….

    Attempting to issue restart to captiveportal service...

    captiveportal has been restarted.

    Salu2



  • Gracias Javier
    Excelente tu aporte
    No hemos dado cuenta que esto sucede cuando el DHCP leases esta al tope en direcciones IP arrendadas hasta con la sesiones expiradas. Es entonces que sucede esto. El pfSense queda con el servicio portal cautivo colgado.
    Lo que hemos hecho es manualmente borrar las sesiones expiradas.
    Estamos buscando como hacer este proceso automáticamente con el CRON si es posible

    Saludos.



  • Hola

    @COFroot:

    Gracias Javier
    Excelente tu aporte
    No hemos dado cuenta que esto sucede cuando el DHCP leases esta al tope en direcciones IP arrendadas hasta con la sesiones expiradas. Es entonces que sucede esto. El pfSense queda con el servicio portal cautivo colgado.
    Lo que hemos hecho es manualmente borrar las sesiones expiradas.
    Estamos buscando como hacer este proceso automáticamente con el CRON si es posible

    Saludos.

    Un script que acabo de implementar para que borre los dhcp leases con fecha de expiración menor al día de hoy del sistema

    Está en fase beta (es decir que lo he probado y me ha funcionado, pero conviene contrastarlo con más usuarios de pfSense)

    /*
     * release_old_dhcp_leases.php
     * By @Javcasta - Javier Castañon - https://javcasta.com/ 
     */
    
    $leasesfile = "/var/dhcpd/var/db/dhcpd.leases";
    exec("cat /var/dhcpd/var/db/dhcpd.leases", $salida);
    
    //echo "lineas: " . count($salida) . "\n";
    $today = date('Y/m/d');
    
    // Stop DHCPD
    //killbyname("dhcpd");
    echo "Stop dhcpd service... \n";
    exec("/usr/local/sbin/pfSsh.php playback svc stop dhcpd");
    sleep(5);
    
    // Read existing leases
    $newleases_contents = array();
    $i = 0;
    $marca = '}';
    
    while ($i < count($salida)) {
    	if (strpos($salida[$i],"lease ") !== false && strpos($salida[$i], " {") !== false ) {
    		$posendsdate = $i+2;
    		$endsdate = explode(" ", $salida[$posendsdate]);
    		//echo ">>>>> " . $endsdate[4] . "\n";
    		//si la fecha ends es < today NO
    		if ($endsdate[4] > $today || $endsdate[4] == $today) {
    			$newleases_contents[] = $salida[$i];
    			/* Skip to the end of the lease declaration */
    			do {
    				//echo "vamos por $i: $salida[$i] \n";
    				$i++;
    				$newleases_contents[] = $salida[$i];			
    			} while ($i < count($salida) && strpos($salida[$i], $marca) !== true);
    		}
    	} else {
    		//$newleases_contents[] = $salida[$i];
    	}
    	$i++;
    }
    //print_r(array_values($newleases_contents));
    $fd = fopen($leasesfile, 'w');
    fwrite($fd, implode("\n", $newleases_contents));
    fclose($fd);
    echo "Start dhcpd service... \n";
    exec("/usr/local/sbin/pfSsh.php playback svc start dhcpd"); 
    ?>
    
    

    El script release_old_dhcp_leases.php es para ejecutarse vía shell, así que hay que alojarlo en una carpeta (en la raiz o en otra carpeta, yo suelo usar /scripts , pero cada cual que use la que desee).

    El comando para ejecutarlo en un cron (suponiendo que se aloje en la carpeta /scripts )

    /usr/local/bin/php /scripts/release_old_dhcp_leases.php

    Salu2



  • Hola

    Por cierto, como he observado que hay "editores de posts ajenos al autor del post en este foro", ya sea por errores humanos o del sistema … :) , conviene que la fuente de los scripts que publico sean de mi web .

    El script de este post lo tengo en:

    https://www.javcasta.com/pfsense-release_old_dhcp_leases-php-beta/

    Salu2