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



  • 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 ?


Log in to reply