quarta-feira, 9 de setembro de 2015

Criando VPN site-to-site, conectando diversas filiais a matriz com openVPN

Nosso cenário

Apresento uma solução de VPN para conectar diversas filiais a matriz, utilizando openVPN com chaves estáticas, biblioteca lzo para compressão e utilização do MRTG para monitorar o tráfego de cada filial.

Nesse cenário temos a matriz com IP fixo e as filiais com IPs dinâmicos. Mas nada impede de se utilizar IP dinâmico na matriz, você pode criar um DNS dinâmico.

Seguem as configurações utilizadas:

Distribuição usada: CentOS-5.5

Matriz:
  • IP externo matriz= 200.200.200.200
  • Rede interna matriz = 192.168.1.0/24

Filial1 (chamaremos de Espírito Santo):
  • Rede interna = 192.168.2.0/24

Filial2 (chamaremos de Rio de Janeiro):
  • Rede interna = 192.168.3.0/24

Filial3 (chamaremos de Minas Gerais):
  • Rede interna = 192.168.4.0/24

Versão openVPN: 2.1.2

Versão lançada em 15/08/2010, o changelog você pode ver aqui: http://www.openvpn.net/index.php/open-source/documentation/change-log/71-21-change-log.html

Efetue o download em:
Versão lzo: 2.0.3

Efetue o download em:

Instalação

Após efetuar o download da biblioteca lzo e dos sources do openVPN, vamos compilar e instalar (esse procedimento será idêntico na matriz e em todas as filiais).

Primeiro verifique se o pacote openSSL está instalado conforme o exemplo:

# rpm -q openssl
openssl-0.9.8e-12.el5_4.6

Se não estiver, execute o comando:

# yum install openssl

1. LZO

Entre no diretório onde você baixou os sources e descompacte o arquivo:

# tar zxvf lzo-2.03.tar.gz

Vamos compilar sem nenhuma configuração específica:

# ./configure
# make check
(para testar a biblioteca de compressão)
# make
# make install


2. openVPN

Entre no diretório onde você baixou os sources e descompacte o arquivo:

# tar zxvf openvpn-2.1.2.tar.gz

Por padrão irá utilizar o diretório /usr/local com basedir, altere se houver necessidade.

# ./configure
# make
# make install


Vamos ver se o openVPN foi instalado:

# type openvpn
openvpn is /usr/local/sbin/openvpn

Feito isso, vamos efetuar as configurações.

Configuração MATRIZ

Vamos configurar a VPN na nossa matriz, que irá receber todas as filiais.

Crie o diretório openvpn-matriz em /etc para criar a configuração para cada filial :

# mkdir /etc/openvpn-matriz
# chown openvpn.openvpn /etc/openvpn-matriz

(se sua instalação não criou esse usuário e grupo crie)

Vamos criar o diretório que irá armazenar os logs:

# mkdir /var/log/openvpn
# chown openvpn.openvpn /var/log/openvpn

Começamos o primeiro arquivo com configuração para a filial1 (Espírito Santo):

# vi matriz-espiritosanto.conf

Esse é conteúdo da configuração para esta filial:

## FABIO S. SCHMIDT - fabio@improve.inf.br
## INTERFACE VPN PARA CONEXAO DA MATRIZ COM A FILIAL ESPIRITO SANTO

## REDE LOCAL MATRIZ: 192.168.1.
## REDE LOCAL ESPIRITO SANTO: 192.168.2.

# Interface para a conexao, identificar para cada filail
# Ex.: tun0, tun1, tun2

dev tun0

# 10.0.0.2 IP que sera estabelicido para a matriz na vpn
# 10.0.0.1 IP que sera estabelecido para a filial1 na vpn
ifconfig 10.0.0.2 10.0.0.1

# Diretorio que contem as chaves e configuracoes
cd /etc/openvpn-matriz

# Indica qual chave utilizar para esta conexao
secret key-filial1

#Cada tunel deve utilizar uma porta diferente
port 5001

# Usuario e grupo que executam o daemon Openvpn
user openvpn
group openvpn

#Utilizar a biblioteca de compressao de dados
comp-lzo

#256-bit AES
#Se nao for setado o openvpn usa por padrao Blowfish, 128 bits
cipher AES-256-CBC

#Ativar rotas automaticamente
up /etc/openvpn-matriz/rotas-espiritosanto.up

#Envia um ping para a outra ponta para manter a conexao em firewalls statefull
ping 15

#Nivel de log
verb 4

#Manter o tunel ativo e chave em caso de perda de conexao
persist-tun
persist-key

#Escreve um pequeno status sobre a conexao, reescrito a cada minuto
status /var/log/openvpn/status-filial1.log

#Vamos utilizar um arquivo para o log da conexao de cada filial
log-append /var/log/openvpn/filial1.log

Criaremos agora a configuração para a filial2 (Rio de Janeiro):

# vi matriz-riodejaneiro.conf

## FABIO S. SCHMIDT - fabio@improve.inf.br
## INTERFACE VPN PARA CONEXAO DA MATRIZ COM A FILIAL RIO DE JANEIRO

## REDE LOCAL MATRIZ: 192.168.1.
## REDE LOCAL RIO DE JANEIRO: 192.168.3.

# Interface para a conexao, identificar para cada filail
# Ex.: tun0, tun1, tun2

dev tun1

# 10.2.0.2 IP que sera estabelicido para a matriz na vpn
# 10.2.0.1 IP que sera estabelecido para a filial2 na vpn
ifconfig 10.1.0.2 10.1.0.1

# Diretorio que contem as chaves e configuracoes
cd /etc/openvpn-matriz

# Indica qual chave utilizar para esta conexao
secret key-filial2

#Cada tunel deve utilizar uma porta diferente
port 5002

# Usuario e grupo que executam o daemon Openvpn
user openvpn
group openvpn

#Utilizar a biblioteca de compressao de dados
comp-lzo

#256-bit version of AES (Advanced Encryption Standard)
#Se nao for setado o openvpn usa por padrao Blowfish, 128 bits
cipher AES-256-CBC

#Ativar rotas automaticamente
up /etc/openvpn-matriz/rotas-riodejaneiro.up

#Envia um ping para a outra ponta para manter a conexao em firewalls statefull
ping 15

#Nivel de log
verb 3

#Manter o tunel ativo e chave em caso de perda de conexao
persist-tun
persist-key

#Escreve um pequeno status sobre a conexao, reescrito a cada minuto
status /var/log/openvpn/status-filial2.log

#Vamos utilizar um arquivo para o log da conexao de cada filial
log-append /var/log/openvpn/filial2.log

Criaremos agora a configuração para a filial3 (Minas gerais):

# vi matriz-riodejaneiro.conf

## FABIO S. SCHMIDT - fabio@improve.inf.br
## INTERFACE VPN PARA CONEXAO DA MATRIZ COM A FILIAL MINAS GERAIS

## REDE LOCAL MATRIZ: 192.168.1.
## REDE LOCAL MINAS GERAIS: 192.168.3.

# Interface para a conexao, identificar para cada filail
# Ex.: tun0, tun1, tun2

dev tun2

# 10.1.0.2 IP que sera estabelicido para a matriz na vpn
# 10.1.0.1 IP que sera estabelecido para a filial2 na vpn
ifconfig 10.2.0.2 10.2.0.1

# Diretorio que contem as chaves e configuracoes
cd /etc/openvpn-matriz

# Indica qual chave utilizar para esta conexao
secret key-filial3

#Cada tunel deve utilizar uma porta diferente
port 5003

# Usuario e grupo que executam o daemon Openvpn
user openvpn
group openvpn

#Utilizar a biblioteca de compressao de dados
comp-lzo

#256-bit version of AES (Advanced Encryption Standard)
#Se nao for setado o openvpn usa por padrao Blowfish, 128 bits
cipher AES-256-CBC

#Ativar rotas automaticamente
up /etc/openvpn-matriz/rotas-minasgerais.up

#Envia um ping para a outra ponta para manter a conexao em firewalls statefull
ping 15

#Nivel de log
verb 4

#Manter o tunel ativo e chave em caso de perda de conexao
persist-tun
persist-key

#Escreve um pequeno status sobre a conexao, reescrito a cada minuto
status /var/log/openvpn/status-filial3.log

#Vamos utilizar um arquivo para o log da conexao de cada filial
log-append /var/log/openvpn/filial3.log

Vamos gerar as chaves de criptografia de cada filial:

# openvpn --genkey --secret /etc/openvpn-matriz/key-filial1
# openvpn --genkey --secret /etc/openvpn-matriz/key-filial2
# openvpn --genkey --secret /etc/openvpn-matriz/key-filial3


Sete o usuário e grupo openvpn como proprietário dos 3 aquivos das chaves, e sete a permissão para 400.

Você pode ter visto que adicionamos o comando "up /etc/openvpn-matriz/rotas-NOMEDAFILIAL.up" para criar as rotas para cada filial, segue o conteudo de cada um (obviamente o usuario openvpn deve ter permissão para execução):

# more rotas-espiritosanto.up

#!/bin/bash
route add -net 192.168.2.0 netmask 255.255.255.0 gw 10.0.0.1

# more rotas-riodejaneiro.up

#!/bin/bash
route add -net 192.168.3.0 netmask 255.255.255.0 gw 10.1.0.1

# more rotas-minasgerais.up

#!/bin/bash
route add -net 192.168.4.0 netmask 255.255.255.0 gw 10.2.0.1

Estes são os comandos para inicializar as conexões (você pode criar um script para inicializar):

# openvpn --config /etc/openvpn-matriz/matriz-espiritosanto.conf --script-security 3 system -daemon &
# openvpn --config /etc/openvpn-matriz/matriz-minasgerais.conf --script-security 3 system -daemon &
# openvpn --config /etc/openvpn-matriz/matriz-riodejaneiro.conf --script-security 3 system -daemon &


Assim que você inicializar, cada conexão irar gerar o seus arquivos de log e status no diretório que configuramos: /var/log/openvpn

Configuração FILIAIS

Nas filiais, após seguir os passos de instalação, vamos criar o diretório /etc/opevpn-filial que irá conter o arquivo para conexão com a matriz.

# mkdir /etc/openvpn-filial
# chown openvpn.openvpn /etc/openvpn-filial

(se a instalação não criou esse usuário e grupo crie)

Vamos criar o diretório para os logs:

# mkdir /var/log/openvpn
# chown openvpn.openvpn /var/log/openvpn


Copie para este diretório de cada filial a sua respectiva chave:
  • key-filial1 - Espírito Santo
  • key-filial2 - Rio de Janeiro
  • key-filial3 - Minas gerais

No diretório criado, vamos criar o arquivo matriz.conf.

Vamos ao exemplo com Espírito Santo (Filial1), está bem comentado para facilitar a criação das configurações das outras filiais:

## FABIO S. SCHMIDT - fabio@improve.inf.br
## INTERFACE VPN PARA CONEXAO DA FILIAL XXXX COM A MATRIZ

## REDE LOCAL MATRIZ: 192.168.1.
## REDE LOCAL ESPIRITO SANTO: 192.168.2.

#Endereço do servidor Matriz
#remote IP

remote 200.200.200.200

# Interface para a conexao
# Ex.: tun0, tun1, tun2
#Em cada filial so havera uma interface tun, pode setar todas como tun0
dev tun0

# Aqui é o inverso da MATRIZ
ifconfig 10.0.0.1 10.0.0.2

# Diretorio que contem as chaves e configuracoes
cd /etc/openvpn-filial

# Indica qual chave utilizar para esta conexao
secret key-filial1

#protocolo
proto udp
#Cada tunel deve utilizar uma porta diferente
#Coloque a porta conforme a configuracao de cada filial na matriz
port 5001

# Usuario e grupo que executam o daemon Openvpn
user openvpn
group openvpn

#Utilizar a biblioteca de compressao de dados
comp-lzo

#256-bit version of AES (Advanced Encryption Standard)
#Se nao for setado o openvpn usa por padrao Blowfish, 128 bits
cipher AES-256-CBC

#Ativar rotas automaticamente
up /etc/openvpn-filial/rotas-matriz.up

#Envia um ping para a outra ponta para mantera a conexao em firewalls statefull
ping 15

#Nivel de log
verb 4

#Manter o tunel ativo e chave em caso de perda de conexao
persist-tun
persist-key

#Escreve um pequeno status sobre a conexao, reescrito a cada minuto
status /var/log/openvpn/status-matriz.log

#Nao vamos enviar as mensagens para o syslog
log-append /var/log/openvpn/matriz.log

Como você pode ver, setamos o comando "/etc/openvpn-matriz/rotas-matriz.up" que irá levantar as rotas para a rede da matriz, como o exemplo:

(Filial1)

#!/bin/bash
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.0.0.2

Lembrando que 192.168.1.0/24 é a rede local na Matriz e 10.0.0.2 o IP da VPN setado para a matriz para a conexão da Filial1.

Este é o script para inicializar a VPN em cada filial:

openvpn --config /etc/openvpn-filial/matriz.conf --script-security 3 system -daemon &

Feito isso, nossa vpn está pronta para funcionar em cada filial, não vou entrar em detalhes de liberação de portas no firewall, pois pode ser encontrada muita documentação sobre isso aqui no VOL.

Já estou preparando um artigo para vocês monitorarem o tráfego na vpn de cada filial com MRTG.

Qualquer dúvida ou contribuição por favor deixe seu comentário, e visite meu blog: fonte:
http://www.vivaolinux.com.br/artigo/Criando-VPN-sitetosite-conectando-diversas-filiais-a-matriz-com-openVPN