VPN automática entre sites
Publicado por Sergei Martao (última atualização em 03/07/2017)
[ Hits: 4.202 ]
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.
#!/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;
Backup do Firebird por data - via rede ou local
Script para autenticação Velox Empresarial
Pesquisa Binária usando Bash-Shell
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Melhorando a precisão de valores flutuantes em python[AJUDA] (11)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)