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

    Script PHP para ativar/desativar a VPN IPSEC dependendo do status do link Ponto a Ponto.

    Scheduled Pinned Locked Moved Portuguese
    1 Posts 1 Posters 373 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.
    • F
      fvalim
      last edited by

      Boa tarde.

      A release que estou trabalhando do pfsense é a 2.4.4-RELEASE-p3 (amd64)

      Fiz algumas adaptações no script php criado no tópico abaixo.

      https://forum.netgate.com/topic/38142/usar-rotas-de-vpn-como-backup-no-pfsense

      O problema que eu estou passando é que quando o script desabilita a VPN os processo de SPD's e SAD's ainda permanecem ativos.

      Dentro do script original a função vpn_ipsec_refresh_policies(); gera o erro abaixo pra mim e por isso tive de remove-la. E esta função é a que faz o processo de encerrar os processos SPD's e SAD's

      Error :
      Link offline, Enabling Tunnel!

      Fatal error: Uncaught Error: Call to undefined function vpn_ipsec_refresh_policies() in /usr/local/www/check_pap_v2.php:83
      Stack trace:
      #0 {main}
      thrown in /usr/local/www/check_pap_v2.php on line 83
      PHP ERROR: Type: 1, File: /usr/local/www/check_pap_v2.php, Line: 83, Message: Uncaught Error: Call to undefined function vpn_ipsec_refresh_policies() in /usr/local/www/check_pap_v2.php:83
      Stack trace:
      #0 {main}

      Segue o script que estou usando no momento:

      
      
      <?php
      
      /*
          Este script tem como funcao habilitar ou desabilitar tuneis de VPN para serem usados
          como backup em caso de falhas em linhas dedicadas ou links ponto-a-ponto.
          Este script deve ser instalado no diretorio /usr/local/www, ter permisao de
          execucao e devera ser chamado atraves do cron na peridiocidade desejada.
          O script recebe como parametro o IP de origem para determinar a interface pela
          qual o teste sera realizado, o IP de destino que sera verificado se esta
          on-line ou n## e o nummero da VPN.
          No caso o numero da VPN e obtido contando-se apenas os itens de Fase 1 na 
          configuracao do IPSec do pfSense de cima para baixo comecando do 0.
          Exemplos:
          php -q /usr/local/www/check_pap.php <ip de="" origem=""><ip a="" ser="" testado=""><numero da="" vpn="" ipsec=""> 
          /usr/local/bin/php -q /usr/local/www/check_pap.php 10.22.245.30 10.22.245.40 0
      */
      
      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");
      
      $VPN_ID=array_pop($argv);
      $a_phase1 = &$config['ipsec']['phase1'];
      $a_phase2 = &$config['ipsec']['phase2']; 
      $ikeid = $a_phase1[$VPN_ID]['ikeid'];
      
      $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 -S $args $host",$ret,$exit1);
      if ($exit1 == 0) exec("/sbin/ping -c 1 -t 1 -S $args $host",$ret,$exit2);
      if ($exit2 == 0) exec("/sbin/ping -c 1 -t 1 -S $args $host",$ret,$exit3);
      $exit = ($exit1 + $exit2 + $exit3);
      if ($exit == 0){
              #link online
              if (! isset($a_phase1[$VPN_ID]['disabled'])) {
                      print "Link online, Disabling Tunnel!\n";
                      $a_phase1[$VPN_ID]['disabled']="";
                      if (is_array($a_phase2) && (count($a_phase2))) {
                          foreach ($a_phase2 as &$phase2) {
                              if ($phase2['ikeid'] == $ikeid) {
                                  $phase2['disabled']="";
                              }
                          }
                      }
                      write_config();       
      
                      
                      vpn_ipsec_configure();         
                      filter_configure();
              }
              else
                      print "Link online, Tunnel already Disabled!\n";
      }
      else{
              if (isset($a_phase1[$VPN_ID]['disabled'])){
                      print "Link offline, Enabling Tunnel!\n";
                      unset ($a_phase1[$VPN_ID]['disabled']);
                      if (is_array($a_phase2) && (count($a_phase2))) {
                          foreach ($a_phase2 as &$phase2) {
                              if ($phase2['ikeid'] == $ikeid) {
                                  unset ($phase2['disabled']);
                              }
                          }
                      }
                      write_config();
      
                      vpn_ipsec_configure();                
                      filter_configure();
                      }
              else
                      print "Link offline, Tunnel already Enabled!\n";
      }
      ?>
      
      

      Galera do PHP e IPSEC conseguem me dar uma força ?

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