Create a Post
cancel
Showing results for 
Search instead for 
Did you mean: 
Thiago_Mourao
Employee
Employee

Como configurar VPN para acesso remoto no link secundário de Internet

Security Engineering Brazil

Abril, 2020

Version 01

 

Autor:

Thiago Mourao, SE and Cyber Security Evangelist

 

Revisão:

 

Contents

Objetivo

Limitações e Requisitos

Topologia

Scripts

Passo-a-Passo

 

Objetivo

Configurar o Acesso Remoto para responder pelo link não padrão de Internet (link secundário).

Como configuração padrão, quando os primeiros pacotes chegarem através do link de internet não padrão (link secundário), o gateway verificará sua tabela de roteamento e responderá esses pacotes usando a rota padrão, ou seja,  o gateway responderá estes pacotes através da interface cuja qual a rota padrão está configurada e, em muitos casos, estes pacotes serão bloqueados pelo próximo salto devido a inspeção Stateful Inspection (SYN-ACK sem SYN) ou devido ao filtro de roteamento de entrada (Ingress Routing Filter) que verificará que a origem não pertence a essa rota/rede.

OBS: Em alguns casos, essa configuração pode funcionar se o ISP do link primário não realizar Stateful Inspection ou o ISP não tiver um filtro de roteamento de entrada para bloquear ataques de spoofing e/ou Negação de Serviço (DoS/DDoS).

 

Limitações e Requisitos

  • Eu usei rota estática neste exemplo ao em vez de PBR que poderia ser muito mais granular
  • Eu usei uma ferramenta escrita encima do recurso cprid_util criado pelo @HeikoAnkenbrand (HeikoAnkenbrand) no artigo que ele escreveu aqui na comunidade do CheckMates chamado “GAIA - Easy execute CLI commands from management on gateways” (https://community.checkpoint.com/t5/Enterprise-Appliances-and-Gaia/GAIA-Easy-execute-CLI-commands-fr...) para executar comandos nos gateways a partir da gerência (SMS)
  • Para este PoC, assumimos que você já configurou um gateway com 2 (dois) links da Internet, onde o primeiro é a rota padrão e o segundo é um link de backup
  • Para este PoC, assumimos que você já configurou a VPN para acesso remoto (IPsec ou Mobile Access) para responder com o IP do link secundário de Internet

 

Topologia

Em nosso laboratório, estamos usando o GloudGuard VE (Virtual Edition) na R80.40 tanto no Security Gateway quanto na Manager e o VMware Workstation 12 como plataforma de virtualização.

Ambiente Virtual:

  • 1 x Check Point Gateway R80.40
  • 1 x Check Point Manager R80.40
  • 1 x Microsoft Windows Server 2012 R2
  • 1 x Windows 7 Ultimate
  • 4 x Roteadores Virtuais (VyOS)

Ambiente Físico do Hospedeiro:

  • 1 x Notebook (Windows Professional) with VMWare Workstation 12

NAT:

  • Nesta topologia, o roteador RT_301 está executando o NAT de origem DE: 192.168.250.1 PARA: 200.251.0.1

 

Topology.png

Scripts

FirstTimeSetup.sh

Este script irá preparar o ambiente pela primeira vez (First Time Wizard).

#!/bin/bash -f
source /opt/CPshrd-R80.40/tmp/.CPprofile.sh
#Script Directory
EXECDIR="/home/admin/VPNSecondaryLink"
#User that will Execute the Scripts and Cron Job
EXECUSER="admin"

echo "First time setup"
echo "Creating all files and Gaia configuration"

echo "Creating Directories"
mkdir $EXECDIR
mkdir $EXECDIR/log
mkdir $EXECDIR/tmp


echo "Creating Files"
touch $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh
touch $EXECDIR/VPNSecondaryLinkCleanUp.sh
touch $EXECDIR/VPNSecondaryLink_alert.sh
touch $EXECDIR/log/CronJob_VPNSecondaryLinkCleanUp.sh.log
touch /var/log/VPNSecondaryLink_alert.log

echo "Creating Symbolic Links"
ln -s /var/log/VPNSecondaryLink_alert.log $EXECDIR/log/VPNSecondaryLink_alert.log
ln -s $EXECDIR/VPNSecondaryLink_alert.sh $FWDIR/bin/VPNSecondaryLink_alert

echo "Copying Scripts to $EXECDIR"
cp ./CronJob_VPNSecondaryLinkCleanUp.sh $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh
cp ./VPNSecondaryLink_alert.sh $EXECDIR/VPNSecondaryLink_alert.sh

echo "Changing Owner and Group"
chown $EXECUSER:bin $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh
chown $EXECUSER:bin $EXECDIR/VPNSecondaryLink_alert.sh
chown $EXECUSER:bin $FWDIR/bin/VPNSecondaryLink_alert.sh

echo " Changing Permission"
chmod 760 $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh
chmod 760 $EXECDIR/VPNSecondaryLink_alert.sh
chmod 760 $FWDIR/bin/VPNSecondaryLink_alert.sh

echo "Lock Database Override"
clish -c "lock database override"
echo "Adding Daily Based Recurrence for CronJob_VPNSecondaryLinkCleanUp at Cron Job to 2:00am"
clish -c 'add cron job VPNSecondaryLinkCleanUp command "/home/admin/VPNSecondaryLink/CronJob_VPNSecondaryLinkCleanUp.sh >> /home/admin/VPNSecondaryLink/log/CronJob_VPNSecondaryLinkCleanUp.sh.log 2>&1" recurrence daily time 2:00'
echo "Saving clish configuration"
clish -c "save config"

 

VPNSecondaryLink_alert.sh

Este script será chamado pelo campo "Track" da regra, irá analisar a saída (log output) e irá criar a rota estática com base no IP de origem do tráfego que bateu na regra

#!/bin/bash -f
source /opt/CPshrd-R80.40/tmp/.CPprofile.sh
#Script Directory
DIR="/home/admin/VPNSecondaryLink"
#User that will Execute the Scripts and Cron Job
EXECUSER="admin"

#Jump to Script Directory
cd $FWDIR/bin

#Global Variable
gateway_ip="10.0.50.100"
secondary_gw="200.200.0.102"
raw_pbr_error=0
error_msg1="Error: Object Name pattern founded on multiple Host Objects"
error_msg2="Error: Static Route alreded configure"
error_msg3="Error: Rule Name do not match"
error_msg4="Error: Object not found on management Database"
error_msg5="Error: Route Already Inserted on CleanUp Script"

echo "#### Executing VPNSecondaryLink_alert at $(date -u) ####"
[ $raw_pbr_error -gt 0 ] || {

echo "Reading input from rule"
read input
#echo "Troubleshooting enabled"
#echo $input > $DIR/tmp/VPNSecondaryLink_alert_tr.log
echo "Parsing Source Object Name"
echo "Checking if Source is using Object Name"
raw_src_name=$(echo $input | sed -n 's/.* src: \(.*\); dst: .*/\1/p')
#echo "variavel raw_src_name=$raw_src_name"
echo "Checking if Source is using IP"
raw_src_ip=$(echo "$input" | grep -o -P '.{0,5}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' | grep src | sed -n 's/^src: \(.*\)/\1/p' )
#echo "variavel raw_src_ip=$raw_src_ip"
firstocteto=$(echo "$raw_src_ip" | sed -n 's/\(^[[:digit:]]*\)\..*\..*\..*/\1/p')
#echo "variavel firstocteto=$firstocteto"
if [ -z $firstocteto ] || [ $firstocteto -gt 223 ]; then
echo "Cannot match with IP parsing... Trying to find IP on Management Object Database"
raw_src_ip=$(mgmt_cli -r true show objects limit 2 offset 0 order.1.ASC "name" in.1 "name" in.2 "$raw_src_name" order.2.DESC "objId" type "host" --format json | jq '.objects[]."ipv4-address"')
if [ -z $raw_src_ip ] ; then
echo $error_msg4;
raw_pbr_error=1;
exit 1;
elif [ $(echo "$raw_src_ip" | wc -l) -gt 1 ] ; then
echo $error_msg1;
raw_pbr_error=1;
exit 1;
else
echo "IP Founded"
raw_src_ip=$(echo "$raw_src_ip"| tr -d \");
echo "Source IP: $raw_src_ip"
fi
else
echo "IP has no object in Database, using IP from Log"
echo "Source IP: $raw_src_ip"
fi
echo "Parsing Destination Object Name"
raw_dst_ip=$eth1
echo "Destination IP: $raw_dst_ip"
echo "Check if Route already exist"
if [ $(/usr/local/bin/g_cli 10.0.50.100 show configuration static-route | grep "$raw_src_ip" | wc -l) -gt 0 ] ; then
echo $error_msg2;
raw_pbr_error=1;
exit 0;
else
touch $DIR/VPNSecondaryLinkCleanUp.sh
chmod +x $DIR/VPNSecondaryLinkCleanUp.sh
echo "Creating Routing for $raw_src_ip/32"
/usr/local/bin/g_cli $gateway_ip "set static-route $raw_src_ip/32 nexthop gateway address $secondary_gw on"
echo "Checking file VPNSecondaryLinkCleanUp.sh"
if [ $(cat /tmp/VPNSecondaryLinkCleanUp.sh | grep $raw_src_ip | wc -l ) -gt 0 ] ; then
echo $error_msg5;
raw_pbr_error=1;
exit 1;
else
echo "Adding new route to VPNSecondaryLinkCleanUp.sh"
echo "/usr/local/bin/g_cli $gateway_ip set static-route $raw_src_ip/32 off" >> $DIR/VPNSecondaryLinkCleanUp.sh
fi
fi
echo "#### End of Execution of VPNSecondaryLink_alert at $(date -u) ####"
echo -e '\n\n'
exit 1;
}

 

CronJob_VPNSecondaryLinkCleanUp.sh

Esse script será chamado pelo "Job", chamado VPNSecondaryLinkCleanUp do Crontab para fazer backup do VPNSecondaryLinkCleanUp.sh atual para salvar esta informação para fins de histórico e executar o VPNSecondaryLinkCleanUp.sh atual para limpar a tabela de roteamento ao menos 1 vez por dia.

#!/bin/bash -f
source /opt/CPshrd-R80.40/tmp/.CPprofile.sh
#Script Directory
DIR="/home/admin/VPNSecondaryLink"
#User that will Execute the Scripts and Cron Job
EXECUSER="admin"

#Jump to Script Directory
cd $DIR
touch $DIR/VPNSecondaryLinkCleanUp.sh
if [ $(cat $DIR/VPNSecondaryLinkCleanUp.sh | wc -l ) -gt 0 ] ; then
echo "Coping old VPNSecondaryLinkCleanUp to TMP Diretory for historical purpose"
cp $DIR/VPNSecondaryLinkCleanUp.sh $DIR/tmp/VPNSecondaryLinkCleanUp-$(date +%s).txt
echo "Executing VPNSecondaryLinkCleanUp.sh to CleanUp Routes"
$DIR/VPNSecondaryLinkCleanUp.sh
echo "Erasing Old VPNSecondaryLinkCleanUp.sh"
> $DIR/VPNSecondaryLinkCleanUp.sh
else
echo "Current VPNSecondaryLinkCleanUp.sh is already empty. No routes to be cleaned"
fi

 

Passo-a-Passo

  • Copie os 3 (três) scripts para o Servidor de Gerência (SMS)

Thiago_Mourao_1-1586956223939.png

  • Altere a permissão de execução do script “FirstTimeSetup.sh

Thiago_Mourao_2-1586956223941.png

  • Execute o script “FirstTimeSetup.sh

Thiago_Mourao_3-1586956223943.png

  • Verifique se o CRON JOB foi criado

Thiago_Mourao_4-1586956223947.png

  • Create an Access Control Rule with the following pattern:

From: ANY

To: IP_da_Interface_do_link_de_backup/secundário_da_Internet (No nosso caso: 200.200.0.100)

Services: HTTP and HTTPS

Action: Permit

Track: Log / Alert:User Alert 1

Thiago_Mourao_5-1586956223952.png

Thiago_Mourao_6-1586956223952.png  Thiago_Mourao_7-1586956223953.png  Thiago_Mourao_8-1586956223953.png  Thiago_Mourao_9-1586956223954.png  Thiago_Mourao_10-1586956223955.png

Thiago_Mourao_11-1586956223955.png

Thiago_Mourao_12-1586956223957.png

  • Verifique os parâmetros dos comandos de alerta (Alert Commands) em Global PropertiesLog and AlertAlerts:
    • Selecione “Send user Defined alert no. 1 to SmartView Monitor”
    • Selecione “Run UserDefined script”
      • Configure o parâmetro para invocar o script: VPNSecondaryLink_alert >> /var/log/VPNSecondaryLink_alert.log 2>&1 

Thiago_Mourao_13-1586956223963.png

  • Criando uma VPN no Cliente Remoto usando IP da interface não padrão (Ex .: Eth1 - 200.200.0.100)

Thiago_Mourao_14-1586956223970.png  Thiago_Mourao_15-1586956223977.png

Thiago_Mourao_16-1586956223982.png  Thiago_Mourao_17-1586956223987.png

Thiago_Mourao_18-1586956223992.png  Thiago_Mourao_19-1586956224001.png

  • Conectando à VPN

Thiago_Mourao_20-1586956224011.png  Thiago_Mourao_21-1586956224018.png

  • Verificando se o Cliente Remoto se conectou com êxito e obteve um IP reservado do "Office Mode

Thiago_Mourao_22-1586956224020.png

  • Verificando o Acesso ao Recurso Interno (Ex.: Ubuntu Server 01)

Thiago_Mourao_23-1586956224045.png

OBS 1: Eu criei esta página para verificar o IP de origem do cliente

OBS 2: Esta é o servidor "Ubuntu Server 01" e seu IP privado é 10.100.0.101

  • Verificando no arquivo "VPNSecondaryLink_alert.log" para ver se os scripts executaram como o esperado e/ou identificar possíveis erros na execução

Thiago_Mourao_24-1586956224049.png

OBS: Existe um link simbólico $EXECDIR/log/VPNSecondaryLink_alert.log. O arquivo original foi criado em /var/log/VPNSecondaryLink_alert.log

  • Verificando o comportamento da VPN

Você pode ver na saída do comando fw monitor que o Cliente VPN começou a enviar pacotes para 200.200.0.100 que chegaram na interface Eth1 e o gateway Gw-01 responde esses pacotes através da interface Eth0. Devido à inspeção Stateful Inspection no roteador RT_101, os pacotes foram descartados e nunca chegaram ao cliente VPN.

Thiago_Mourao_25-1586956224054.png

Depois, após a execução do script e a rota estática ser inserida, os pacotes do gateway Gw-01 para o IP 200.250.0.1 começaram a ser roteados pela interface Eth1.

Thiago_Mourao_26-1586956224056.png

After respond to TCP 80 (HTTP), then visitor mode could be reached and site were created on VPN Client.

Thiago_Mourao_27-1586956224059.png

  • Checking the new routing on gateway

Thiago_Mourao_28-1586956224062.png

  • Running the Clean Up Scrip (CronJob_VPNSecondaryLinkCleanUp.sh)

Thiago_Mourao_29-1586956224063.png

 

0 Replies