VPN automática entre sites
Publicado por Sergei Martao (última atualização em 03/07/2017)
[ Hits: 4.509 ]
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;
Fluxbox: Wallpapers aleatórios
Instalador .tar.bz2 com menu gráfico Zenity
Criando arquivos de in e out no CBQ
IFINFO - informações de sua interface de rede
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
converter algoritmo C++ em C? (1)
Programa fora de escala na tela do pc (22)
Problemas com Driver NVIDIA (1)
Fedora KDE plasma 42 X Módulo de segurança BB (Warsaw-2) (1)









