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

    Usar rotas de VPN como backup no pfSense

    Portuguese
    4
    35
    11.2k
    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.
    • F
      fneto
      last edited by

      Então Marcelo, "viajando nas idéias" mais um pouco, imaginei de repente criar um pacote que habilitasse triggers configuráveis no pfSense, por exemplo, uma interface onde pudesse configurar mais ou menos o seguinte:

      se "variável/ação/condição" acontecer execute "ação" para "serviço/regra/fila" e etc…

      Entendeu!! Definitivamente não tenho conhecimentos sobre o esquema de API e programação no pfSense, mas se você puder pelo menos me dar uma direção de onde procurar informações ou de como começar, pode ter certeza que vou me dedicar no assunto. Preciso resolver isso sem falta!!!

      Faz muito tempo que não programo em PHP, mas já desenvolvi um sistema de gestão de provedor totalmente em PHP há alguns anos então acho que não sou tão tapado assim para não conseguir pelo menos fazer uma interface tosca para isso certo!!

      1 Reply Last reply Reply Quote 0
      • marcellocM
        marcelloc
        last edited by

        Excelente noticia.

        A estrutura básica dos pacotes do pfsense sao arquivos xml que que montam as telas da framework do pfsense e um arquivo inc que na verdade é um script php que executa as ações do pacote tais como

        • gerar arquivo de configuração

        • criticar dados digitados na gui

        • iniciar ou parar o serviço

        • sincronizar configurações com outros pfsenses

        Da uma olhada no repositório do pfsense e do pfsense-packages no github.com

        Treinamentos de Elite: http://sys-squad.com

        Help a community developer! ;D

        1 Reply Last reply Reply Quote 0
        • R
          rafael.cardoso
          last edited by

          Talvez viajei na ideia, mas basicamente voce deve ter posto o ipsec como gateway default por isso na os outros pontos usavam a net do ponto A, uma saída simples utilizar o sistema de load balance pra quando o link cair jogar pelo outro ponto, o pf já monitora o link principal mesmo, acho que cabe a mesma solução de load balance já visto em vários tópicos, se viajei mesmo desculpe…  :)

          Respect is Everything!

          1 Reply Last reply Reply Quote 0
          • marcellocM
            marcelloc
            last edited by

            Olhei hoje as opções do Ipsec e aparentemente, so temos a opção de habilitar ou desabilitar o ipsec como um todo.

            Para este caso específico, é melhor deixar a verificacao nas pontas.

            vou fazer uns testes aqui e posto o resultado.

            Treinamentos de Elite: http://sys-squad.com

            Help a community developer! ;D

            1 Reply Last reply Reply Quote 0
            • marcellocM
              marcelloc
              last edited by

              fneto,

              Testa por favor a primeira versão do script.

              require_once("util.inc");
              require_once("functions.inc");
              require_once("pkg-utils.inc");
              require_once("globals.inc");
              require_once("filter.inc");
              require_once("shaper.inc");
              require_once("ipsec.inc");
              require_once("vpn.inc");
              
              $ipsec=$config['ipsec'];
              
              if (! is_ipaddr($argv[1])){
              	print "invalid ip address!\n";
              	exit(1);
              }
              exec("/sbin/ping -c 1 -t 1 $argv[1]",$ret,$exit1);
              if ($exit1 == 0) exec("/sbin/ping -c 1 -t 1 $argv[1]",$ret,$exit2);
              if ($exit2 == 0) exec("/sbin/ping -c 1 -t 1 $argv[1]",$ret,$exit3);
              $exit = ($exit1 + $exit2 + $exit3);
              if ($exit == 0){
              	#link online
              	if (array_key_exists("enable",$ipsec)){
              	 	print "link online, disabling ipsec\n";
              	 	unset ($config['ipsec']['enable']);
              	 	write_config();
              	 	vpn_ipsec_configure();
              	 	vpn_ipsec_refresh_policies();
              	 	filter_configure();
              	}
              	else
              		print "link online\n";
              }
              else{
              	if (! array_key_exists("enable",$ipsec)){
              	 	print "link offline, enabling ipsec\n";
              	 	$config['ipsec']['enable']="";
              	 	write_config();
              	 	vpn_ipsec_configure();
              	 	vpn_ipsec_refresh_policies();
              	 	filter_configure();
              		}
              	else
              		print "link offline\n";
              }
              ?>
              

              salva ele em /var/www/check_mpls.php ou qualquer outro nome que voce preferir.

              Ele pinga o ip passado como argumento, se o ping falhar, ele habilita o ipsec e aplica as configurações.
              Durante o tempo offline ele mantem o ipsec ativo e assim que o ping respoder ele desativa o ipsec.

              Nota:
              Antes de rodar o script, desabilite manualmente o ipsec na gui.
              Rode primeiro na mão php -q ./check_mpls.php 172.16.5.6 e veja o comportamento dele.

              Aguardo o feedback

              att,
              Marcello Coutinho

              Treinamentos de Elite: http://sys-squad.com

              Help a community developer! ;D

              1 Reply Last reply Reply Quote 0
              • F
                fneto
                last edited by

                Marcello, eu mal comecei a entender o esquema de programação do pfSense e você já vem com a solução pronta!!!

                Estou até envergonhado!!

                Vou fazer a instalação remotamente e testar o script. Como estou remoto, vou desabilitar o ipsec e fazer o ping em um ip que está online apenas para ver se o script vai permanecer sem chamar o ipsec.

                Depois vou fazer o teste pingando em um ip off-line para ver se o ipsec sobe.

                Assim que tiver um retorno já te falo. Abraços!

                1 Reply Last reply Reply Quote 0
                • F
                  fneto
                  last edited by

                  Olá Marcello!

                  Acabei de rodar o script e ele funcionou corretamente, porém gostaria de lhe mostrar uma coisa. Com o script up, verifiquei o status do ipsec e ele mostrou um link para iniciar a VPN backup do mpls individualmente. Segue abaixo o screen shot e o link do botão de start.

                  Parece que o primeiro link de vpn sobe automaticamente, mas o secundário pode ser iniciado ou pausado individualmente independente do ipsec já estar ativo!!

                  https://200.x.x.x:8443/diag_ipsec.php?act=connect&remoteid=10.0.16.0&source=172.28.1.1

                  vpnstart.png
                  vpnstart.png_thumb

                  1 Reply Last reply Reply Quote 0
                  • marcellocM
                    marcelloc
                    last edited by

                    Voce acha que a url que Voce colou resolve o problema? Nao entendi direito o resultado do seu teste.

                    Treinamentos de Elite: http://sys-squad.com

                    Help a community developer! ;D

                    1 Reply Last reply Reply Quote 0
                    • F
                      fneto
                      last edited by

                      Veja bem, são 2 coisas diferentes!!

                      1 - O script rodou ok!!!

                      • Desliguei o ipsec na GUI
                      • Rodei o scrip com um ip que estava online e ele reportou que o ip estava on line e não desligou
                      • Rodei o script novamente com um ip que estava offline e dai ele ativou o ipsec na gui!

                      2 - Após ativar o ipsec na gui, percebi que o IPSEC oferece a opção de controle da VPN por vpn, então imaginei que ao invés do script ativer ou desativar todo o ipsec, ele poderia apenas ativar ou desativar apenas a conexão de vpn desejada sem parar todo o ipsec do sistema.
                      Dessa maneira, imagine que 2 links cairam, mas apenas 1 voltou a funcionar, o que já estivesse ok voltaria para o MPLS, o que estivesse ainda com problemas continuaria no VPN.

                      Outra coisa, o script precisa aceitar como parâmetro a interface de rede que você deseja usar para fazer o teste de ping, pois quando  a VPN estiver no ar o ping vai continuar dando ok pois estará indo pela VPN!!

                      Abraços!

                      1 Reply Last reply Reply Quote 0
                      • marcellocM
                        marcelloc
                        last edited by

                        Entendi.

                        Faz este teste para ver se a url individual resolve o problema:

                        Desabilita o script  e o ipsec.

                        Depois roda só a url que você colou com os parametros da sua vpn backup do MPLS e vê se alem dela subir, ela se mantem no ar apos alguns updates ou algumas horas.

                        Treinamentos de Elite: http://sys-squad.com

                        Help a community developer! ;D

                        1 Reply Last reply Reply Quote 0
                        • F
                          fneto
                          last edited by

                          Após dar um paste na URL ele pensa um pouco mas não conecta não!!

                          Chequei a gui e o ipsec continua desligado após clicar no start da conexão de vpn, que continua aparecendo (porem com o x vermelho) no status do ipsec!

                          1 Reply Last reply Reply Quote 0
                          • marcellocM
                            marcelloc
                            last edited by

                            Nesta segunda versao do script, voce coloca qualquer parametro de ping como argumento e por ultimo o ip de destino.

                            require_once("util.inc");
                            require_once("functions.inc");
                            require_once("pkg-utils.inc");
                            require_once("globals.inc");
                            require_once("filter.inc");
                            require_once("shaper.inc");
                            require_once("ipsec.inc");
                            require_once("vpn.inc");
                            
                            $ipsec=$config['ipsec'];
                            $host=array_pop($argv);
                            if (! is_ipaddr($host)){
                                    print "invalid ip address!\n";
                                    exit(1);
                            }
                            array_shift($argv);
                            $args=implode(" ", $argv);
                            exec("/sbin/ping -c 1 -t 1 $args $host",$ret,$exit1);
                            if ($exit1 == 0) exec("/sbin/ping -c 1 -t 1 $args $host",$ret,$exit2);
                            if ($exit2 == 0) exec("/sbin/ping -c 1 -t 1 $args $host",$ret,$exit3);
                            $exit = ($exit1 + $exit2 + $exit3);
                            if ($exit == 0){
                                    #link online
                                    if (array_key_exists("enable",$ipsec)){
                                            print "link online, disabling ipsec\n";
                                            unset ($config['ipsec']['enable']);
                                            write_config();
                                            vpn_ipsec_configure();
                                            vpn_ipsec_refresh_policies();
                                            filter_configure();
                                    }
                                    else
                                            print "link online\n";
                            }
                            else{
                                    if (! array_key_exists("enable",$ipsec)){
                                            print "link offline, enabling ipsec\n";
                                            $config['ipsec']['enable']="";
                                            write_config();
                                            vpn_ipsec_configure();
                                            vpn_ipsec_refresh_policies();
                                            filter_configure();
                                            }
                                    else
                                            print "link offline\n";
                            }
                            ?>
                            
                            

                            ex: php -q ./check_ipsec.php -S 172.16.5.6 172.16.5.7

                            veja se assim voce consegue forçar a interface de saida do ping.

                            Treinamentos de Elite: http://sys-squad.com

                            Help a community developer! ;D

                            1 Reply Last reply Reply Quote 0
                            • marcellocM
                              marcelloc
                              last edited by

                              @rafael.cardoso:

                              Talvez viajei na ideia, mas basicamente voce deve ter posto o ipsec como gateway default por isso na os outros pontos usavam a net do ponto A.

                              Oi Rafael,

                              Onde você altera a prioridade de rota do ipsec e como faríamos neste caso para o pfsense escolher entre dois caminhos para a mesma rede de destino?

                              Treinamentos de Elite: http://sys-squad.com

                              Help a community developer! ;D

                              1 Reply Last reply Reply Quote 0
                              • F
                                fneto
                                last edited by

                                Olá Marcello fiz o teste com a nova versão do script e está funcionando corretamente. vou instalar o pacote cron no pfsense e configurar o script para rodar.

                                Quero ver se começo a estudar os plugins e programação hoje, durante a semana é muito corrido para mim!!

                                Muitíssimo obrigado!!

                                1 Reply Last reply Reply Quote 0
                                • F
                                  fneto
                                  last edited by

                                  Olá Marcelloc, tudo bem?

                                  Rapaz lembra do script check_mpls que você fez para mim, então estou tentando ajustar aquele script para ao invés de desligar toda a estrutura do ipsec desligar apenas os túneis que passei como parâmetro.

                                  Estou apanhando com isso a tarde toda mas até agora não entendi como fazer isso, poderia me dar uma força? Se estiver disponível eu te mando o script com as alterações ok!

                                  Abraços!

                                  1 Reply Last reply Reply Quote 0
                                  • marcellocM
                                    marcelloc
                                    last edited by

                                    fneto,

                                    A opção de desabilitar o ipsec ou não envolve todos os tuneis, por isso o script roda nas pontas, onde só existe um túnel.

                                    para derrubar somente um link, você vai precisar suar os comando do proprio ipsec, racoon-alguma coisa. Não tenho muita experiência com isso.

                                    att,

                                    Marcello Coutinho

                                    Treinamentos de Elite: http://sys-squad.com

                                    Help a community developer! ;D

                                    1 Reply Last reply Reply Quote 0
                                    • F
                                      fneto
                                      last edited by

                                      Então Marcello, na verdade não, o que quero é apenas habilitar a opção  "Disable this phase1" e "Disable this phase 2" na interface do pfsense, feito isso salvo a configuração e ele mata somente o túnel que eu passar o id como parâmetro entendeu!!

                                      Não quero mexer com racoon nem nada disso, como você desabilitou o ipsec todo na interface achei que talvez pudesse me ajudar a encontrar a opção de desabilitar apenas os túneis.

                                      Na verdade eu já identifiquei as variáveis nos array estudando os arquivos do pfSense, o que não estou conseguindo fazer é gravar as configurações!

                                      1 Reply Last reply Reply Quote 0
                                      • marcellocM
                                        marcelloc
                                        last edited by

                                        as funções que gravam a configuração e aplicam os filtros estão todas juntas

                                        write_config();
                                        e as demais.
                                        Dá uma olhada neste pedaço de código do dansguardian.
                                        Nele eu vefico os valores do array e salvo caso haja alterações

                                        $count=0;	
                                        	if (is_array($config['installedpackages']['dansguardianphraseacl']['config']))
                                        		foreach($config['installedpackages']['dansguardianphraseacl']['config'] as $dansguardian_phrase){
                                        			#bannedphraselist
                                        			if($dansguardian_phrase['banned_phraselist'] == "" && file_exists ($dansguardian_dir.'/lists/bannedphraselist.sample')){
                                        				$config['installedpackages']['dansguardianphraseacl']['config'][$count]['banned_phraselist']=base64_encode(file_get_contents($dansguardian_dir.'/lists/bannedphraselist.sample'));
                                        				$load_samples++;
                                        			}
                                        			$includes=preg_replace($match,$replace,$dansguardian_phrase['banned_includes']);	
                                        			file_put_contents($dansguardian_dir."/lists/bannedphraselist.".$dansguardian_phrase['name'],($dansguardian_phrase['banned_enabled']?dg_text_area_decode($config['installedpackages']['dansguardianphraseacl']['config'][$count]['banned_phraselist']).$includes:""),LOCK_EX);
                                        
                                        			#weightedphraselist
                                        			if($dansguardian_phrase['weighted_phraselist'] == "" && file_exists ($dansguardian_dir.'/lists/weightedphraselist.sample')){
                                        				$config['installedpackages']['dansguardianphraseacl']['config'][$count]['weighted_phraselist']=base64_encode(file_get_contents($dansguardian_dir.'/lists/weightedphraselist.sample'));
                                        				$load_samples++;
                                        			}
                                        			$includes=preg_replace($match,$replace,$dansguardian_phrase['weighted_includes']);	
                                        			file_put_contents($dansguardian_dir."/lists/weightedphraselist.".$dansguardian_phrase['name'],($dansguardian_phrase['weighted_enabled']?dg_text_area_decode($config['installedpackages']['dansguardianphraseacl']['config'][$count]['weighted_phraselist']).$includes:""),LOCK_EX);
                                        
                                        			#exceptionphraselist
                                        			if($dansguardian_phrase['exception_phraselist'] == "" && file_exists ($dansguardian_dir.'/lists/exceptionphraselist.sample')){
                                        				$config['installedpackages']['dansguardianphraseacl']['config'][$count]['exception_phraselist']=base64_encode(file_get_contents($dansguardian_dir.'/lists/exceptionphraselist.sample'));
                                        				$load_samples++;
                                        			}
                                        			file_put_contents($dansguardian_dir."/lists/exceptionphraselist.".$dansguardian_phrase['name'],($dansguardian_phrase['exception_enabled']?dg_text_area_decode($config['installedpackages']['dansguardianphraseacl']['config'][$count]['exception_phraselist']):""),LOCK_EX);
                                        		$count++;	
                                        		}
                                        if($load_samples > 0)
                                           write_config();
                                        
                                        

                                        Treinamentos de Elite: http://sys-squad.com

                                        Help a community developer! ;D

                                        1 Reply Last reply Reply Quote 0
                                        • F
                                          fneto
                                          last edited by

                                          Meu código não está muito diferente na verdade está bem simples veja!

                                          ```
                                            print "link online, disabling Tunnel\n";
                                                         //unset ($config['ipsec']['enable']);
                                                         $a_phase1 = $config['ipsec']['phase1'];
                                                         $p1index = $VPN_ID;
                                                         $a_phase1[$p1index]['disabled']=true;
                                                         //print "\nVPNID: ".$VPN_ID;
                                                         //print "\nHOST: ".$host;
                                                         //print "\nPhase1: ".$ph1ent['disabled'];
                                                         //print "\nPhase2: ".$ph2ent['disabled'];
                                                         write_config();
                                                         vpn_ipsec_configure();
                                                         vpn_ipsec_refresh_policies();
                                                         filter_configure();

                                          1 Reply Last reply Reply Quote 0
                                          • F
                                            fneto
                                            last edited by

                                            Esse código executa sem dar erro nenhum, mas também não faz nada!

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