VPN automática entre sites

Publicado por Sergei Martao (última atualização em 03/07/2017)

[ Hits: 4.188 ]

Homepage: -

Download vpnautomatica-170623-0000.sh




Script usado para criar uma contingência pela internet em caso de falha de um link que conecte dois ou mais sites distantes. Utiliza o pacote opensan para fazer um VPN ipsec e manter a comunicação funcionado com segurança.

  



Esconder código-fonte

#!/bin/bash
# Autores: Nelys Santos e Sergei Armando Martao
# Data: 23/06/2017
#
# Resumo: 
#   Script usado para criar uma contingencia pela internet em caso de falha de um link que conecte dois ou mais sites distantes
#   o script utiliza o pacote opensan para fazer um VPN ipsec e manter a comunicacao funcionando com segurança
#
# Funcionamento basico:
#   Script que le os arquivos *.redes do mesmo diretorio e baseado no que estiver escrito na linha left, cria automaticamente arquivos de ipsec para fazer uma rede
# que é interligada via um link interno (ex: mpls) possa se comunicar via internet usando a VPN ipsec pelo software openswan assim fornecendo uma maneira 
# rapida e pratica de contingencia multisites atravez da internet.
#
# Premissas para funcionamento:
# O servidor que o script estiver precisa conectar em todos os servidores de ipsec usando chave publica, sem pedir senha
# O usuario de execucao do script (linha 110, USER=usuario) precisa existir em todos os servidores e ter permissoes de sudo sem precisar de senha
# Ter o openswan instalado em todos os servidores VPN
# Deve ser criado um arquivo .redes para cada localidade de contingencia e seguir a nomenclatura a risca
# Ex. Numero.Descricao.redes
#    1.riodejaneiro.redes
#    2.saopaulo.redes
# 
# Exemplo do conteudo de um arquivo .redes
#linux=1 
#left=200.2.2.2
#leftnexthop=200.2.2.1
#172.16.10.0/24#INTERNASITEA
#10.10.10.0/24#CLIENTEXPTOA1
#
# linux=1
# Caso o servidor vpn seja um linux usando openswan, caso contrário deve usar linux=0
#
# left=200.2.2.2
# IP valido do left peer, usado para conectar e fechar a vpn
#
# leftnexthop=200.2.2.1
# Proximo salto do left peer, utilizado para direcionar por onde o pacote vpn saira
# 
# 172.16.10.0/24#INTERNASITEA
# Rede que sera feita a contingencia em caso de queda, redes internas devem ter a comentario INTERNA no minimo para identificado
# pode-se adicionar quantas redes internas forem preciso contingenciar
#
# 10.10.10.0/24#CLIENTEXPTOA1
# Rede que o siteA possui, exemplo um link P2P com esse cliente e sera feita a contingencia, nesse caso NAO colocar INTERNA
# Assim evitando fechar a VPN entre clientes diferentes, ex CLIENTEXPTOA1 com o CLIENTEXPTOB1 (que esta em outra localidade)

function MAIN(){
   # Criar funcao para mostrar o que seja fazer 1 para subir contingencia 2 para desativar
   DATA # Pegando a data atual
   CONFCOR # Configurando as variaveis com cor
   CARREGACONF # Carregando as configuracoes iniciais
   m1=0 # variavel para testar o primeiro while do primeiro meno
   while [ $m1 -ne 1 ]
   do
      MENU1 # funcao que chama o primeiro menu
      case $M1 in # validando a resposta dada ao menu1
      1) # Opcao para subir a contingencia
         m2=0 # variavel para testar o segundo while
         tipo="ATIVAR" # variavel para mostrar ATIVA no menu2
         while [ $m2 -ne 1 ]
         do
            CAPTURASITES #Capturando os sites disponiveis no diretorio 
            MENU2 # Mostrando o menu 2
            VALIDAOPCAO2 # validando a opcao digida
         done
         for((a=1;a<=${#SITE[@]};a++)); # For para subir a contingencia entre os sites
         do
            if [ ${SITE[$a]} != ${SITE[$CAIDO]} ];then # if para impedir de fechar um tunel com o proprio site
               CONFVARIAVEIS # carregando as variavies basicas conforme o site
               CRIACONEXAO # criando o arquivo de ipsec
               COPIAARQUIVOS # copiando os arquivos ipsec entre os sites
               RESTARTIPSEC # reiniciando o ipsec
            fi
         done
         m1=1 # variavel para saindo do primeiro while 
         ;;
      2) # Opcao para desativar a contingencia
         m2=0 # funcao funcia exatamente como a de cima
         tipo="DESATIVAR"
         while [ $m2 -ne 1 ]
         do
            CAPTURASITES
            MENU2
            VALIDAOPCAO2 
         done
         for((a=1;a<=${#SITE[@]};a++));
         do
            if [ ${SITE[$a]} != ${SITE[$CAIDO]} ];then
               CONFVARIAVEIS
               DELETAARQUIVOS # Funcao para deletar os arquivos ipsec de cada servidor vpn
               RESTARTIPSEC
            fi
         done
         m1=1   
         ;;
      3) # Opcao para sair do programa
         m1=1
         exit;
         ;;
      *) # Caso digitar uma opcao invalida
         MSGOPCAOINVALIDA # Apenas para mostrar que a opcao e invalida
                        ;;
      esac
   done
   MSGFIM # Mensagem mostranda no final do programa 
}

function CARREGACONF(){
   USER=brqssh # Usuario para executar as funcoes nos servidores precisa estar sudoers
   PORTA=22 # Porta SSH para conexcao 
   TIME=5 # Tempo de timeout em caso de falha
   DIRLOG=logs # Diretorio de logs
   ARQLOG=$DIRLOG/vpnautomatica.$DIA.log # Arquivo de logs
   mkdir -p $DIRLOG > /dev/null 2>&1 # Criando o diretorio de logs
}

function MENU1(){
   clear
   echo "#----------------- Script de VPN automatica ------------------#" | tee -a $ARQLOG
   echo -e "#--------------------$CAM $DATA $CF----------------------#" | tee -a $ARQLOG
   echo "#---------------------- MENU PRINCIPAL -----------------------#" | tee -a $ARQLOG
   echo "#-------------------------------------------------------------#" | tee -a $ARQLOG
   echo "# O que voce deseja fazer?                                     " | tee -a $ARQLOG
   echo "# 1 - Ativar a contigência em um site                          " | tee -a $ARQLOG
   echo "# 2 - Remover a contigência em um site                         " | tee -a $ARQLOG
   echo "# 3 - Sair                                                     " | tee -a $ARQLOG
   read -p "# R: " M1 # capturando o que digitar na tela
   echo "# R: $M1" >> $ARQLOG 
}

function MENU2(){
   clear
   echo "" | tee -a $ARQLOG
   echo "#-------------------------------------------------------------#" | tee -a $ARQLOG
   echo "# Por favor informe o site que deseja $tipo a contingencia     " | tee -a $ARQLOG
        for((a=1;a<=${#SITE[@]};a++));
        do
      echo "# [$a] ${SITE[$a]}" | tee -a $ARQLOG # Mostrando as opcoes disponiveis
        done
   read -p "# R: " CAIDO
   echo "# R: $CAIDO" >> $ARQLOG # capturando o que digitar na tela
   echo "" | tee -a $ARQLOG      
}

function MSGFIM(){
   DATA
   echo ""   | tee -a $ARQLOG
   echo "#-------------------- Script Finalizado ----------------------#" | tee -a $ARQLOG
   echo -e "#--------------------$CAM $DATA $CF----------------------#" | tee -a $ARQLOG # Mostrando a data na tela
   echo ""   | tee -a $ARQLOG
}

function CAPTURASITES(){ 
   a=1
   for i in `ls *.redes` # Capturar todos os arquivos com final .redes transoformando em opcao
   do
      SITE[$a]=$i
      let a=$a+1
   done
}

function VALIDAOPCAO2(){ # Validando o que foi digitado no menu 2
   for((a=1;a<=${#SITE[@]};a++));
        do
      if [ $CAIDO == $a ];then # se o numero digitado estiver dentro do contado do vetor
          m2=1 # entao ele sai do segundo while
      fi
        done
   if [ $m2 != 1 ];then # Caso tenha digita uma opcao invalida
      MSGOPCAOINVALIDA
   fi
} 
function MSGOPCAOINVALIDA(){
   echo -e "\nEntre com uma opcao valida!" | tee -a $ARQLOG 
   echo -e "Precione qualquer tecla para voltar..." | tee -a $ARQLOG
   read 
}

function CONFVARIAVEIS(){
   FROM=${SITE[$CAIDO]} # O site caido sempre sera o FROM, ex 1.fw01.redes
   TO=${SITE[$a]} # Os sites para fechar a vpn, ex, 2.fw01.redes
   LEFTHOST=`ls $FROM | cut -d. -f2` # usado para nomear o arquivo de vpn, ex: fw01
   RIGHTHOST=`ls $TO | cut -d. -f2` # usado para nomear o arquivo de vpn, ex: fw02
   ARQUIVOVPN=ipsec.$LEFTHOST-to-$RIGHTHOST # arquivo de ipsec sera ipsec.fw01-to-fw02
   LEFT=`grep left= $FROM`; # IP do left peer, ex 200.2.2.2
   RIGHT=`grep left= $TO|sed 's/left/right/g'`; # IP do right peer, ex 189.9.9.9, é feito a troca pois ó controle é feito pelo leftnexthop
   LEFTNEXTHOP=`grep leftnexthop= $FROM`; # capturando o IP do left next hop, ex 200.200.200.1 
   LEFTIP=`echo $LEFT|cut -d= -f2` # capturando o IP do peer left, ex 200.200.200.2
   RIGHTIP=`echo $RIGHT|cut -d= -f2` # capturando o IP do peer right, ex 187.8.8.8
   LEFTTYPE=`grep -i linux $FROM | cut -d= -f2` # capturando se o left e linux ou nao, 0 ou 1
   RIGHTTYPE=`grep -i linux $TO | cut -d= -f2` # capturando se o right e linux ou nao, 0 ou 1
}

function CRIACONEXAO(){ # Criando o arquivo de ipsec
   rm -f $ARQUIVOVPN 2>/dev/null; # Removendo Arquivos de VPN Anteriroes
   rm -f $ARQUIVOVPN-from 2>/dev/null; # Removendo Arquivos de VPN Anteriroes

   for e in `cat $FROM|grep INTERNA` # filtrando apenas as redes com nome internal
   do
      leftconn=`echo $e|cut -d# -f2`; # capturando o nome da leftconn
      leftsubnet=`echo $e|cut -d# -f1`; # caputrando a left subnet para a vpn
      for j in `cat $TO|grep \#` # capturando qualquer lihha que tenha #
      do
         rightconn=`echo $j|cut -d# -f2`; # capturando o nome do rightcoon 
         rightsubnet=`echo $j|cut -d# -f1`; # capturando a right subnet para a vpn
         CONFIPSEC # criando o arquivo de ipsec
      done   
   done
   
   for e in `cat $TO|grep INTERNA` # Mesmo procesimento a cima no entando apenas para as redes nao internas
   do # usado para impedir de fechar a VPN com duas redes não internas ex, dois clientes em lugares diferentes
      leftconn=`echo $e|cut -d# -f2`;
      rightsubnet=`echo $e|cut -d# -f1`;
      for k in `cat $FROM|grep \#|grep -v INTERNA`
      do
         leftsubnet=`echo $k|cut -d# -f1`
         rightconn=`echo $k|cut -d# -f2`;
         CONFIPSEC
      done
   done
   rightnexthop=`grep leftnexthop= $TO|cut -d= -f2`; # capturando o rightnethop
   sed "s/$LEFTNEXTHOP/rightnexthop=$rightnexthop/g" $ARQUIVOVPN >$ARQUIVOVPN-from; #criando o segundo arquivo de vpn para o site remoto
}

function CONFIPSEC(){ #Configuracoes basicas do ipsec, caso precise alterar criptografia ou tempos edite as linhas a baixo
   echo "conn $leftconn-TO-$rightconn" >> $ARQUIVOVPN;
   echo "   type=tunnel" >> $ARQUIVOVPN;
   echo "   $LEFT" >> $ARQUIVOVPN;
   echo "   $LEFTNEXTHOP" >> $ARQUIVOVPN;
   echo "   leftsubnet=$leftsubnet" >> $ARQUIVOVPN;
   echo "   $RIGHT" >> $ARQUIVOVPN;
   echo "   rightsubnet=$rightsubnet" >> $ARQUIVOVPN;
   echo "   authby=secret" >> $ARQUIVOVPN;
   echo "   auth=esp" >> $ARQUIVOVPN;
   echo "   keylife=24h" >> $ARQUIVOVPN;
   echo "   keyexchange=ike" >> $ARQUIVOVPN;
   echo "   ike=3des-md5-modp1024" >> $ARQUIVOVPN;
   echo "   esp=3des-md5-96" >> $ARQUIVOVPN;
   echo "   rekey=no" >> $ARQUIVOVPN;
   echo "   rekeymargin=9m" >> $ARQUIVOVPN;
   echo "   rekeyfuzz=25%" >> $ARQUIVOVPN;
   echo "   pfs=no" >> $ARQUIVOVPN;
   echo "   auto=start" >> $ARQUIVOVPN;
   echo "" >> $ARQUIVOVPN;
}

function COPIAARQUIVOS(){ # funcao para copiar e mover os arquivos de ipsec
   if [ $LEFTTYPE -eq 1 ];then # Caso seja linux
      timeout $TIME scp -P $PORTA $ARQUIVOVPN $USER@$LEFTIP:/tmp > /dev/null 2>&1 # copia o arquivo de ipsec para o $LEFTIP
      T=$?; FASELOG=1; LOGTELA # valida o resultado 
   else # caso nao seja linux sera ignorado, ex localidade com firewall de algum fabricante
      T=2; FASELOG=1; LOGTELA # T=2 para nao linux
   fi
   if [ $RIGHTTYPE -eq 1 ];then
      timeout $TIME scp -P $PORTA $ARQUIVOVPN-from $USER@$RIGHTIP:/tmp > /dev/null 2>&1 #copiar o arquivo de ipsec para o $RIGHTIP
      T=$?; FASELOG=2; LOGTELA
   else   
      T=2; FASELOG=2; LOGTELA
   fi
   
   if [ $LEFTTYPE -eq 1 ];then
      timeout $TIME ssh -p $PORTA $USER@$LEFTIP sudo mv /tmp/$ARQUIVOVPN /etc/ipsec.d/ > /dev/null 2>&1 # move o arquivo do /tmp/ para o diretorio do ipsec
      T=$?; FASELOG=3; LOGTELA
   else   
      T=2; FASELOG=3; LOGTELA
   fi
   if [ $RIGHTTYPE -eq 1 ];then
      timeout $TIME ssh -p $PORTA $USER@$RIGHTIP sudo mv /tmp/$ARQUIVOVPN-from /etc/ipsec.d/ > /dev/null 2>&1 
      T=$?; FASELOG=4; LOGTELA
   else
      T=2; FASELOG=4; LOGTELA
   fi
      
}

function RESTARTIPSEC(){ # funcao para reinciar o ipsec em ambas as pontas
   if [ $LEFTTYPE -eq 1 ];then
      timeout $TIME ssh -p $PORTA $USER@$LEFTIP sudo /etc/init.d/ipsec restart > /dev/null 2>&1 
      T=$?; FASELOG=5; LOGTELA
   else
      T=2; FASELOG=5; LOGTELA
   fi
   if [ $RIGHTTYPE -eq 1 ];then
      timeout $TIME ssh -p $PORTA $USER@$RIGHTIP sudo /etc/init.d/ipsec restart > /dev/null 2>&1 
      T=$?; FASELOG=6; LOGTELA
   else
      T=2; FASELOG=6; LOGTELA
   fi
}

function DELETAARQUIVOS(){ # Funcao para deletar os arquivos de ipsec em ambas as pontas
   if [ $LEFTTYPE -eq 1 ];then
      timeout $TIME ssh -p $PORTA $USER@$LEFTIP sudo rm /etc/ipsec.d/$ARQUIVOVPN >>/dev/null 2>&1
      T=$?; FASELOG=7; LOGTELA
   else
      T=2; FASELOG=7; LOGTELA
   fi
   if [ $RIGHTTYPE -eq 1 ];then
      timeout $TIME ssh -p $PORTA $USER@$RIGHTIP sudo rm /etc/ipsec.d/$ARQUIVOVPN-from >>/dev/null 2>&1
      T=$?; FASELOG=8; LOGTELA
   else
      T=2; FASELOG=8; LOGTELA
   fi
   rm $ARQUIVOVPN $ARQUIVOVPN-from > /dev/null 2>&1 # Deletando arquivos ipsec localmente
}

function LOGTELA(){ # funcao para mostrar log em tela e salvar no arquivo
   case $FASELOG in
      1) 
         TESTAT # funcao que valida o valor de T
         echo -ne "Copiado o arquivo $ARQUIVOVPN para HOST:$LEFTHOST IP:$LEFTIP \n" | tee -a $ARQLOG 
         ;;
      2)
         TESTAT
         echo -ne "Copiado o arquivo $ARQUIVOVPN-from para HOST:$RIGHTHOST IP:$RIGHTIP \n" | tee -a $ARQLOG
         ;;
      3)
         TESTAT
         echo -ne "Movido o arquivo $ARQUIVOVPN do diretorio /tmp/ para /etc/ipsec.d HOST:$LEFTHOST IP:$LEFTIP \n" | tee -a $ARQLOG
         ;;
      4)   
         TESTAT
         echo -ne "Movido o arquivo $ARQUIVOVPN-from do diretorio /tmp/ para /etc/ipsec.d HOST:$RIGHTHOST IP:$RIGHTIP \n" | tee -a $ARQLOG
         ;;
      5)
         TESTAT
         echo -ne "Reiniciado o servido do ipsec HOST:$LEFTHOST IP:$LEFTIP \n" | tee -a $ARQLOG
         ;;
      6)   
         TESTAT
         echo -ne "Reiniciado o servido do ipsec HOST:$RIGHTHOST IP:$RIGHTIP \n" | tee -a $ARQLOG
         ;;
      7)
         TESTAT
         echo -ne "Deletado o arquivo de ipsec $ARQUIVOVPN HOST:$LEFTHOST IP:$LEFTIP \n" | tee -a $ARQLOG
         ;;
      8)
         TESTAT
         echo -ne "Deletado o arquivo de ipsec $ARQUIVOVPN-from HOST:$RIGHTTHOST IP:$RIGHTIP \n" | tee -a $ARQLOG
         ;;
      *)
         echo "OPCAO NAO INVALIDA" | tee -a $ARQLOG
         ;;
   esac

}

function TESTAT(){ #Validando o valor de T
   case $T in   
      "0") # caso 0 quer dizer que funcionou
         echo -ne "[$CVD OK $CF]\t\t " | tee -a $ARQLOG         
         ;;
      "2") # caso 2 quer dizer que a ponta nao é linux
         echo -ne "[$CAM IGNORADO $CF]\t " | tee -a $ARQLOG         
         ;;
      *) # qualquer outro valor quer dizer que houve erro na execucao
         echo -ne "[$CVE FALHA $CF]\t " | tee -a $ARQLOG         
         ;;
   esac
}

function DATA(){ # Configurando data para a tela e log
   DIA=`date "+%y%m%d"` > /dev/null # Data yymmdd
   HORA=`date "+%H:%M:%S"` > /dev/null # Hora hh:mm:ss
   DATA="$DIA - $HORA" # Juntando DIA e HORA
}

function CONFCOR(){ # Configurando variaveis com cor
   CVE='\e[1;31m' # Red Bold
   CVD='\e[1;32m' # Verde Bold
   CAM='\e[1;33m' # Yellow Bold
   CF='\e[0m'    # Tag end
}

MAIN #Funcao principal que inicia o script
exit;

Scripts recomendados

Backup compactado

Instalador .tar.bz2 com menu gráfico Zenity

Criação de unidades criptografadas

slowloris

Firewall - FECHADO


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts