Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Squid autenticado no Captive Portal pfSense 2.3

    Scheduled Pinned Locked Moved Portuguese
    47 Posts 16 Posters 13.1k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      jonathanalves
      last edited by

      Legal!

      Essa funcionalidade realmente estava fazendo falta.
      Tomara que na próxima versão o pfSense já integre essa solução!

      Valeu, Augusto!

      1 Reply Last reply Reply Quote 0
      • J
        joaoheytor
        last edited by

        Grande Augusto!
        Ótima dica! Muito obrigado!

        1 Reply Last reply Reply Quote 0
        • D
          didonsom
          last edited by

          @joaoheytor:

          Grande Augusto!
          Ótima dica! Muito obrigado!

          Muito bom amigo!

          quando migrar para o pfsense 2.3 vou testar :)

          Abraços,

          Diego

          1 Reply Last reply Reply Quote 0
          • R
            rlrobs
            last edited by

            Legal cara.. tava procurando isso também, porém ta dando esse erro aqui:

            Squid Cache (Version 3.5.16): Terminated abnormally.
            CPU Usage: 0.150 seconds = 0.047 user + 0.103 sys
            Maximum Resident Size: 88176 KB
            Page faults with physical i/o: 0
            Error: file is encrypted or is not a database
            Error: file is encrypted or is not a database
            2016/05/13 11:40:47 kid1| Starting Squid Cache version 3.5.16 for amd64-portbld-freebsd10.3…
            2016/05/13 11:40:47 kid1| Service Name: squid
            2016/05/13 11:40:47| pinger: Initialising ICMP pinger ...
            Error: file is encrypted or is not a database
            Error: file is encrypted or is not a database
            Error: file is encrypted or is not a database
            2016/05/13 11:41:47 kid1| WARNING: check_cp #Hlpr9 exited
            Error: file is encrypted or is not a database
            2016/05/13 11:41:47 kid1| WARNING: check_cp #Hlpr10 exited
            FATAL: The check_cp helpers are crashing too rapidly, need help!

            1 Reply Last reply Reply Quote 0
            • A
              augusto_pereira
              last edited by

              Quantas instâncias do Captive Portal você tem?

              Pelo erro, tem alguma coisa de errado com o banco de dados do captive portal. O script deve ler mais de um banco pois cada instância cria um banco diferente.

              Um teste válido seria verificar se o script está fazendo sua função. Para isso:

              1º - Autentique com pelo menos um usuário em cada instância do Captive Portal;
              2º - logue via SSH no pfSense;
              3º - Execute o script de autenticação (check_ip.php) apenas com o comando /usr/local/bin/check_ip.php. Nesse momento o script ficará esperando sua ação, o que ele deseja nesse momento é que você insira um ip, ou seja, se esse ip inserido estiver autenticado ele retorna OK=usuario, senão deve retornar ERR.

              Atenciosamente,

              Augusto P. dos Santos
              Suporte Técnico

              Telefones: (11) 2365-4013 / 2365-4014

              Al. Joaquim Eugênio de Lima Nº 187 4º Andar
              Jd.Paulista,São Paulo/SP - CEP: 01403-001

              1 Reply Last reply Reply Quote 0
              • R
                rlrobs
                last edited by

                Só uma instância. Mas acho q sei o motivo. Estou usando radius na autenticação do  CP. Não usuário local. Será q é isso?

                1 Reply Last reply Reply Quote 0
                • A
                  augusto_pereira
                  last edited by

                  Exatamente, fiz um teste utilizando Radius também e a verificação dos bancos das instâncias do captive que faço na linha 10 ("/var/db/captiveportal*.db") acaba incluindo o banco de dados do radius também. Nesse caso tem que fazer uma verificação para não incluir esses bancos. Vou dar uma revisada no script e posto novamente.

                  Por hora para corrigir esse erro basta trocar o * pelo nome completo do seu banco de dados de sua instância do Captive.

                  Atenciosamente,

                  Augusto P. dos Santos
                  Suporte Técnico

                  Telefones: (11) 2365-4013 / 2365-4014

                  Al. Joaquim Eugênio de Lima Nº 187 4º Andar
                  Jd.Paulista,São Paulo/SP - CEP: 01403-001

                  1 Reply Last reply Reply Quote 0
                  • C
                    claupers
                    last edited by

                    Muito bom. Estou tentando implementar isso já faz uns 60 dias. Uso apenas Squid atualmente em minha rede. Vou testar e ver no que dá e posto aqui.

                    Cordialmente;

                    Claudir P. Santos

                    1 Reply Last reply Reply Quote 0
                    • R
                      rlrobs
                      last edited by

                      Realmente pra usuários locais funciona bem e ainda registra os usuários no access.log do squid. Muito bom…

                      Pena que pra autenticação RADIUS ainda nao funciona.

                      1 Reply Last reply Reply Quote 0
                      • A
                        augusto_pereira
                        last edited by

                        Boa tarde,

                        Segue o script corrigido para funcionar com Radius.

                        #!/usr/local/bin/php-cgi -q
                        if(!defined(STDIN)){
                        define("STDIN", fopen("php://stdin", "r"));
                        }
                        if(!defined(STDOUT)){
                        define("STDOUT", fopen("php://stdout", "r"));
                        }

                        while (!feof(STDIN)) {

                        $check_ip = trim(fgets(STDIN));
                        $dbs = glob("/var/db/captiveportal*.db");

                        foreach($dbs as $db){
                        if(!strpos($db, "_radius")){
                        $status = check_ip($db, $check_ip);
                        break;
                        }
                        }
                        if(isset($status)){
                        fwrite(STDOUT, "OK user={$status}\n");
                        }
                        else{
                        fwrite(STDOUT, "ERR\n");
                        }

                        } // end While

                        function check_ip($db, $check_ip){
                        exec("sqlite3 {$db} "SELECT ip FROM captiveportal WHERE ip='{$check_ip}'"", $ip);
                        if($check_ip == $ip[0]){
                        exec("sqlite3 {$db} "SELECT username FROM captiveportal WHERE ip='{$check_ip}'"", $user);
                        return $user[0];
                        }
                        }

                        ?>

                        Atenciosamente,

                        Augusto P. dos Santos
                        Suporte Técnico

                        Telefones: (11) 2365-4013 / 2365-4014

                        Al. Joaquim Eugênio de Lima Nº 187 4º Andar
                        Jd.Paulista,São Paulo/SP - CEP: 01403-001

                        1 Reply Last reply Reply Quote 0
                        • R
                          rlrobs
                          last edited by

                          Putz cara!! Valeu demais!! Funcionou 100%

                          Vou adicionar essa solução aqui –> https://forum.pfsense.org/index.php?topic=103745.new;topicseen#new Tem algumas pessoas querendo essa solução também.

                          abç

                          1 Reply Last reply Reply Quote 0
                          • M
                            mfaridi
                            last edited by

                            @augusto_pereira:

                            Olá pessoal,

                            Há tempos estou buscando a solução para Squid (transparente) autenticado no Captive Portal em desde a versão 2.2.x. Nos debugs encontrei problemas com o script PHP que faziam o processo do Squid parar.

                            A solução foi recriar o script em php. Para aplicar a correção basta trocar o conteúdo do arquivo /usr/local/bin/check_ip.php pelo o conteúdo abaixo e salvar as configurações do Squid e do Captive Portal:

                            #!/usr/local/bin/php-cgi -q
                            if(!defined(STDIN)){
                            define("STDIN", fopen("php://stdin", "r"));
                            }
                            if(!defined(STDOUT)){
                            define("STDOUT", fopen("php://stdout", "r"));
                            }
                            $check_ip = trim(fgets(STDIN));
                            $dbs = glob("/var/db/captiveportal*.db");
                            foreach($dbs as $db){
                            $status = check_ip($db, $check_ip);
                            break;
                            }
                            if(isset($status)){
                            fwrite(STDOUT, "OK user={$status}\n");
                            }
                            else{
                            fwrite(STDOUT, "ERR\n");
                            }

                            function check_ip($db, $check_ip){
                            exec("sqlite3 {$db} "SELECT ip FROM captiveportal WHERE ip='{$check_ip}'"", $ip);
                            if($check_ip == $ip[0]){
                            exec("sqlite3 {$db} "SELECT username FROM captiveportal WHERE ip='{$check_ip}'"", $user);
                            return $user[0];
                            }
                            }
                            ?>

                            OBS: Não foi testado em outras versões anteriores a 2.3;

                            OBS2: Deixar um site de redirecionamento após a autenticação (configuração After authentication Redirection URL do Captive Portal) ajuda a retornar a página mais rápido. Porém se a página estiver em cache também será rapido o login, se a página não estiver em cache o retorno pode demorar.

                            Abs!

                            Augusto

                            Thanks ,
                            I put this code and set squid use captiveportal for Authentication , and reboot system , but nothing happen and light squid show me IP and show not username .
                            I have radius too , do I need another code ?

                            when I set authentication method captiveportal squid work but and I see captive portal login page , but after login user see error about access denied , and this error make by squid .

                            1 Reply Last reply Reply Quote 0
                            • C
                              claupers
                              last edited by

                              Usei o segundo script em um ambiente onde o portal captive pega as informações dos usuário em um servidor Radius com Windows Server 2012. Funcionou perfeitamente.
                              Muito obrigado. Faz um tempo que estava tentando implementar isso para migrar do squid puro para o pfsense.

                              Cordialmente;

                              Claudir Pereira dos Santos

                              1 Reply Last reply Reply Quote 0
                              • R
                                rlrobs
                                last edited by

                                Dear mfaridi,

                                use this code on check_ip.php

                                Note: After replace code, edit captive portal and squid configuration. Click Save.

                                
                                #!/usr/local/bin/php-cgi -q
                                if(!defined(STDIN)){
                                   define("STDIN", fopen("php://stdin", "r"));
                                }
                                if(!defined(STDOUT)){
                                   define("STDOUT", fopen("php://stdout", "r"));
                                }
                                
                                while (!feof(STDIN)) {
                                
                                $check_ip = trim(fgets(STDIN));
                                $dbs = glob("/var/db/captiveportal*.db");
                                
                                foreach($dbs as $db){
                                   if(!strpos($db, "_radius")){
                                      $status = check_ip($db, $check_ip);
                                      break;   
                                   }   
                                }
                                if(isset($status)){
                                   fwrite(STDOUT, "OK user={$status}\n");
                                }
                                else{
                                   fwrite(STDOUT, "ERR\n");
                                }
                                
                                } // end While
                                
                                function check_ip($db, $check_ip){
                                   exec("sqlite3 {$db} \"SELECT ip FROM captiveportal WHERE ip='{$check_ip}'\"", $ip);
                                   if($check_ip == $ip[0]){
                                      exec("sqlite3 {$db} \"SELECT username FROM captiveportal WHERE ip='{$check_ip}'\"", $user);
                                      return $user[0];
                                   }
                                }
                                
                                ?>
                                
                                
                                1 Reply Last reply Reply Quote 0
                                • M
                                  mfaridi
                                  last edited by

                                  @rlrobs:

                                  Dear mfaridi,

                                  use this code on check_ip.php

                                  Note: After replace code, edit captive portal and squid configuration. Click Save.

                                  
                                  #!/usr/local/bin/php-cgi -q
                                  if(!defined(STDIN)){
                                     define("STDIN", fopen("php://stdin", "r"));
                                  }
                                  if(!defined(STDOUT)){
                                     define("STDOUT", fopen("php://stdout", "r"));
                                  }
                                  
                                  while (!feof(STDIN)) {
                                  
                                  $check_ip = trim(fgets(STDIN));
                                  $dbs = glob("/var/db/captiveportal*.db");
                                  
                                  foreach($dbs as $db){
                                     if(!strpos($db, "_radius")){
                                        $status = check_ip($db, $check_ip);
                                        break;   
                                     }   
                                  }
                                  if(isset($status)){
                                     fwrite(STDOUT, "OK user={$status}\n");
                                  }
                                  else{
                                     fwrite(STDOUT, "ERR\n");
                                  }
                                  
                                  } // end While
                                  
                                  function check_ip($db, $check_ip){
                                     exec("sqlite3 {$db} \"SELECT ip FROM captiveportal WHERE ip='{$check_ip}'\"", $ip);
                                     if($check_ip == $ip[0]){
                                        exec("sqlite3 {$db} \"SELECT username FROM captiveportal WHERE ip='{$check_ip}'\"", $user);
                                        return $user[0];
                                     }
                                  }
                                  
                                  ?>
                                  
                                  

                                  Thanks when I use that code and go to squid setting and choose Authentication Method Captive portal and save captive portal too and reset system , user see captive portal login page and they enter password and username , but after login they see error about access denied and they see this

                                  Screenshot_2016-06-01-14-23-25.png
                                  Screenshot_2016-06-01-14-23-25.png_thumb

                                  1 Reply Last reply Reply Quote 0
                                  • R
                                    rlrobs
                                    last edited by

                                    mfaridi,

                                    follow print screen of my configurations.
                                    Note: pfsense 2.3

                                    Squid-General.png
                                    Squid-General.png_thumb
                                    squid-Gerneral2.png
                                    squid-Gerneral2.png_thumb
                                    squid-ACLs.png
                                    squid-ACLs.png_thumb
                                    squid-Authentication.png
                                    squid-Authentication.png_thumb
                                    captive-configuration.png
                                    captive-configuration.png_thumb

                                    1 Reply Last reply Reply Quote 0
                                    • M
                                      mfaridi
                                      last edited by

                                      @rlrobs:

                                      mfaridi,

                                      follow print screen of my configurations.
                                      Note: pfsense 2.3

                                      Thanks , Thanks
                                      After your guide every thing work good , but I have these problems ;

                                      1- Captive portal sometimes need paas and some time no
                                      2- I think PFsense system is heavy and config with GUI take time , I have 2 GB of RAM and Dual core CPU
                                      3- lightsquid make report , I see IP too , light squid show username and some IPs

                                      1 Reply Last reply Reply Quote 0
                                      • D
                                        denicio
                                        last edited by

                                        Muito interessante isso. Quando migrar para versão 2.3 vou implementar na rede aqui.
                                        Parabéns ao colega Augusto.

                                        ;D

                                        Denicio.

                                        1 Reply Last reply Reply Quote 0
                                        • R
                                          rlrobs
                                          last edited by

                                          Augusto,

                                          abusando da sua boa vontade.. Fiz um teste aqui cadastrando dois captive portal com radius e um deles não funcionou. Fiz também com duas instâncias com usuŕios locais e o resultado foi o mesmo. Ele só funciona com uma das instancias.. Veja o print:

                                          captive.png
                                          captive.png_thumb

                                          1 Reply Last reply Reply Quote 0
                                          • A
                                            augusto_pereira
                                            last edited by

                                            Boa tarde rlrobs,

                                            Realmente precisamos fazer uma mudança no script,tente com esse:

                                            #!/usr/local/bin/php-cgi -q
                                            if(!defined(STDIN)){
                                              define("STDIN", fopen("php://stdin", "r"));
                                            }
                                            if(!defined(STDOUT)){
                                              define("STDOUT", fopen("php://stdout", "r"));
                                            }

                                            while (!feof(STDIN)) {

                                            $check_ip = trim(fgets(STDIN));
                                            $dbs = glob("/var/db/captiveportal*.db");
                                            //print_r($dbs);

                                            foreach($dbs as $i => $db){
                                              if(!strpos($db, "_radius")){
                                                  $status = check_ip($db, $check_ip);
                                            if(isset($status)){
                                              $return = "OK user={$status}\n";
                                            break;
                                            }
                                            else{
                                              $return = "ERR\n";
                                            }
                                              } 
                                            }
                                            fwrite(STDOUT, "{$return}");
                                            } // end While

                                            function check_ip($db, $check_ip){
                                              exec("sqlite3 {$db} "SELECT ip FROM captiveportal WHERE ip='{$check_ip}'"", $ip);
                                              if($check_ip == $ip[0]){
                                                  exec("sqlite3 {$db} "SELECT username FROM captiveportal WHERE ip='{$check_ip}'"", $user);
                                                  return $user[0];
                                              }
                                            }

                                            ?>

                                            Atenciosamente,

                                            Augusto P. dos Santos
                                            Suporte Técnico

                                            Telefones: (11) 2365-4013 / 2365-4014

                                            Al. Joaquim Eugênio de Lima Nº 187 4º Andar
                                            Jd.Paulista,São Paulo/SP - CEP: 01403-001

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.