Em minhas pesquisas pelas internet encontrei dezenas de artigos abordando a configuração do Open VPN, mais não encontrei nenhum que explicasse de maneira prática o uso em cenários onde se faz necessário a interligação de três ou mais redes distintas de tal forma que se um dos servidores cair às outras redes continue comunicando-se normalmente. Fato o qual me motivou a escrever esse artigo.

Temos a matriz, filial1 e filial2. Em uma situação em que o servidor da matriz (que está rodando uma instância do Open VPN apenas no modo servidor, servindo os clientes filial1 e filial2) venha a sair do ar, os servidores da filial1 e filial2 precisam continuar se comunicando. O mesmo terá que acontecer se o servidor da filial1 ou filial2 caírem, a comunicação com servidor da matriz permanece para o servidor ainda no ar.
Solução

1º – Uma solução simples para esse problema foi abordado em outro artigo utilizando o VTUN. Link abaixo:

http://itnproducoes.blogspot.com/2011/07/criando-tuneis-com-o-vtun.html

2º – No entanto, particularmente, tenho utilizado na maioria dos casos a solução proposta nesse artigo com o Open VPN, devido a pontos fortes que essa ferramenta oferece. Veja alguns dos principais abaixo:

* Possui atualizações constantes.

* Multiplataforma (Roda também em Windows).

* Segurança aprimorada utilizando certificados x509.

* Relativamente fácil de conseguir material na internet abordando o uso do Open VPN, além de possuir uma ampla documentação sobre seus recursos com exemplos de configuração. Veja o HOWTO no site do desenvolvedor.

Voltando ao assunto, para esse tutorial a solução proposta consiste em:

Matriz – Irá rodar uma instância do Open VPN como servidor para Filial1 e Filial2.

Filial1 – Irá rodar uma instância do Open VPN como cliente da Matriz e uma instância como servidor da Filial2.

Filial2 – Irá rodar uma instância do Open VPN como cliente da Matriz e uma instância como cliente da Filial1.

Nesse artigo exemplificarei como configurar a interligação de três redes distintas geograficamente separadas através de um túnel seguro criptografado de 2048 bits e autenticação utilizando certificados x509.

Recursos utilizados para esse tutorial:

* Três Servidores Linux rodando Debian 6.0.3 (Squeeze).

* Cada um com duas placas de redes, uma para comunicação com a rede local e outra para internet.

* Endereços das placas de redes locais:
192.168.2.1/24 –> Matriz
192.168.3.1/24 –> Filial1
192.168.4.1/24 –> Filial2

Cenário

Redes separadas geograficamente:
192.168.2.0/24 –> Matriz
192.168.3.0/24 –> Filial1
192.168.4.0/24 –> Filial2

*Obs: É necessário que as redes utilizem configurações de ips distintas, caso o contrário teremos posteriormente conflitos no roteamento e a comunicação não ocorrerá.

CONFIGURAÇÃO

Para instalar o Open VPN nos servidores.

# apt-get install openvpn

CONFIGURAÇÃO DA MATRIZ

Em nosso tutorial a máquina da matriz irá atuar apenas como servidor do Open VPN, dessa forma precisaremos além de da configuração propriamente dita, gerar as chaves de autenticação de seus clientes (Filial1 e Filial2).

a) Crie o arquivo /etc/openvpn/servidor.conf:

# mcedit /etc/openvpn/servidor.conf

Conteúdo do arquivo /etc/openvpn/servidor.conf:

proto udp
dev tun
server 10.0.0.0 255.255.255.0

#####Rota para os clientes####
client-config-dir ccd

#Filial1
route 192.168.3.0 255.255.255.0
#Filial2
route 192.168.4.0 255.255.255.0

##########################################################

max-clients 10
tls-server

#Compressao de dados
comp-lzo

#Tempo de ping 10s tempo de reinicio 120s
keepalive 10 120

#Mantem tunel e chaves carregadas em caso de quedas
persist-key
persist-tun

#Mantem o tunel levantando mesmo em conexoes ip dinamico
float
#########################################
dh /etc/openvpn/keys/dh2048.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/servidor.crt
key /etc/openvpn/keys/servidor.key
tls-auth /etc/openvpn/keys/chave.key 0

b) Crie a pasta /etc/openvpn/keys e /etc/openvpn/ccd

# mkdir /etc/openvpn/keys
# mkdir /etc/openvpn/ccd

c) Crie os arquivos /etc/openvpn/ccd/filial1 e /etc/openvpn/ccd/filial2

# mcedit /etc/openvpn/ccd/filial1

Conteúdo arquivo /etc/openvpn/ccd/filial1 :

iroute 192.168.3.0 255.255.255.0

# mcedit /etc/openvpn/ccd/filial2

Conteúdo arquivo /etc/openvpn/ccd/filial2 :

iroute 192.168.4.0 255.255.255.0

É importante salientar que a não criação desses dois arquivos é causa comum de erros no roteamento encontrado em diversas configurações, que apesar de possibilitarem a comunicação entre os servidores, não conseguem encaminhar os pacotes corretamente para a interface de rede local em questão.

Esses dois arquivos são vitais para o funcionamento das rotas criadas pelas linhas
#Filial1
route 192.168.3.0 255.255.255.0
#Filial2
route 192.168.4.0 255.255.255.0
do arquivo de configuração servidor.conf criado anteriormente. Isso porque as linhas do servidor.conf apenas criam as entradas de roteamento no kernel que serão encaminhadas para a interface tun0 do servidor Open VPN. No momento em que a conexão é estabelecida o servidor Open VPN saberá para qual rede encaminhar o pacote, utilizando justamente os arquivos /etc/openvpn/ccd/filial1 e/etc/openvpn/ccd/filial2 que possuem a rota do cliente recém-conectado.

d) Criar as chaves de segurança e autenticação:

* Copiar os scripts de criação das chaves fornecidos pela instalação do Open VPN para o diretório /etc/openvpn:

# cp -a /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

* Configurar o arquivo vars para geração das chaves:

Edite o arquivo /etc/openvpn/easy-rsa/2.0/vars e modifique as seguintes linhas de acordo com seus dados (KEY_SIZE corresponde ao tamanho da chave 2048 bits):

# mcedit /etc/openvpn/easy-rsa/2.0/vars

Linhas a serem modificadas:

export KEY_SIZE=2048
export KEY_COUNTRY= “BR”
export KEY_PROVINCE = “SC”
export KEY_CITY = “Laguna”
export KEY_ORG = “ITN Ltda”
export KEY_EMAIL= “itnp@msn.com”

* Preparar ambiente para criação das chaves para o servidor, filial1 e filial2:

# cd /etc/openvpn/easy-rsa/2.0
# source vars
# ./clean-all

#./build-ca
(Apenas confirme os dados com ENTER nessa etapa).

Entre na pasta /etc/openvpn/easy-rsa/2.0/keys e confirme a existência dos arquivos ca.crt, ca.key, index.txt e serial.

* Criar as chaves propriamente ditas:

# cd /etc/openvpn/easy-rsa/2.0/

./build-key-server servidor
(Mais uma vez confirme com ENTER os dados e responda do Y as duas perguntas finais Sign the certificate? Y e 1 out of 1 certificate requests certified, commit? Y)

Resultado esperado:
Write out database with 1 new entries
Data Base Updated

./buid.dh dh2048.pem
(Esse comando pode demorar alguns segundos).

# openvpn –genkey –secret chave.key
# mv chave.key /etc/openvpn/keys
(Criar essa chave adiciona uma camada extra de segurança a sua VPN recomendado pelo próprioHOWTO)

./build-key filial1
(Mais uma vez confirme com ENTER os dados e responda do Y as duas perguntas finais Sign the certificate? Y e 1 out of 1 certificate requests certified, commit? Y)

Resultado esperado:
Write out database with 1 new entries
Data Base Updated

./build-key filial2
(Mais uma vez confirme com ENTER os dados e responda do Y as duas perguntas finais Sign the certificate? Y e 1 out of 1 certificate requests certified, commit? Y)

Resultado esperado:
Write out database with 1 new entries
Data Base Updated

e) Confirmar a criação das chaves, copiar para seus diretórios de destino e iniciar o servidor OpenVPN:

* Entre na pasta /etc/openvpn/easy-rsa/2.0/keys e copie os arquivos ca.crt, servidor.crt, servidor.key, dh2048.pem, para a pasta /etc/openvpn/keys.

# cd /etc/openvpn/easy-rsa/2.0/keys
# cp –a servidor.key servidor.crt dh2048.pem ca.crt /etc/openvpn/keys

* Reinicie o serviço do Open VPN, confirme a criação da interface tun0 e das rotas para as redes da filial1 e filial2:

# /etc/init.d/openvpn restart
#ifconfig tun0

#route | grep tun0
Resultado esperado desse comando:

192.168.4.0 10.0.0.2 255.255.255.0 UG 0 0 0 tun0
192.168.3.0 10.0.0.2 255.255.255.0 UG 0 0 0 tun0

f) Configurar o firewall para aceitar conexões na porta 1194, adicionando a seguinte linha: (1194 é a porta padrão do servidor Open VPN):

iptables -A INPUT –p udp –dport 1194 –j ACCEPT

CONFIGURAÇÃO DA FILIAL1

Com o servidor da matriz já configurado para aceitar conexões dos clientes filial1 e filial2, vamos ao maior desafio de nosso tutorial que é a configuração do servidor da filial1 para funcionar como servidor para filial2 e cliente da matriz ao mesmo tempo.

1 – Configurar o cliente:

a) Crie a pasta /etc/openvpn/keysCliente

# mkdir /etc/openvpn/keysCliente

b) Crie o arquivo /etc/openvpn/clienteMatriz.conf

# mcedit /etc/openvpn/clienteMatriz.conf

Conteúdo do arquivo /etc/openvpn/clienteMatriz.conf:

remote “IP DA MATRIZ”
proto udp
client
route 192.168.2.0 255.255.255.0
dev tun
tls-client

##CONFIGURAÇÕES DE OTIMIZACAO##

#Tempo de ping 10s tempo de reinicio 120s
keepalive 10 120

#Compressao dos dados
comp-lzo

#Mantem tunel e chaves carregadas em quedas
persist-key
persist-tun

##########################################
dh /etc/openvpcn/keysCliente/dh2048.pem
ca /etc/openvpn/keysCliente/ca.crt
cert /etc/openvpn/keysCliente/filial1.crt
key /etc/openvpn/keysCliente/filial1.key
tls-auth /etc/openvpn/keysCliente/chave.key 1

c) Copiar as chaves necessárias correspondentes a filial1 do servidor da matriz:

Para esse fim você pode utilizar uma conexão sftp a partir da filial1 ou até mesmo copiar em um pendrive os arquivos dh2048.pem, ca.crt, filial1.crt filial1.key e chave.key da pasta /etc/openvpn/easy-rsa/2.0/keys e /etc/openvpn/keys do servidor da matriz para a pasta/etc/openvpn/keysCliente do servidor da filial1.

Exemplo utilizando sftp:

# cd /etc/openvpn/keysCliente
# sftp root@“IP DA MATRIZ”
# “senha do root da matriz”
# get /etc/openvpn/easy-rsa/2.0/keys/filial1.crt
# get /etc/openvpn/easy-rsa/2.0/keys/filial1.key
# get /etc/openvpn/easy-rsa/2.0/keys/ca.crt
# get /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem
# get /etc/openvpn/keys/chave.key

d) Reinicie o serviço do Open VPN, confirme a criação da interface tun0 e das rotas para a rede da matriz:

# /etc/init.d/openvpn restart
#ifconfig tun0

#route | grep tun0
Resultado esperado desse comando:

192.168.2.0 10.0.0.5 255.255.255.0 UG 0 0 0 tun0

e) Teste a comunicação entre filial1 e Matriz através do envio de Pings:

#ping 192.168.2.1
(Enviado do servidor da filial1)

#ping 192.168.3.1
(Enviado do servidor da matriz)

Obs: Até o momento apesar de matriz e filial1 conseguirem resposta do echo da interface destinada à rede local (192.168.2.1 e 192.168.3.1) não será possível o ping para terminais da rede interna precisando ainda a configuração final no firewall que faremos na parte final do tutorial quando matriz, filial1 e filial2 estiverem se comunicando mutuamente.

2 – Configurar o servidor:

Para configurar o Open VPN como servidor do cliente da filial2 realizaremos praticamente os mesmos passos da configuração do servidor Open VPN da matriz com pequenas mudanças.

a) Crie o arquivo /etc/openvpn/servidorFilial1.conf

# mcedit /etc/openvpn/servidorFilial1.conf

Conteúdo do arquivo /etc/openvpn/servidorFilial1.conf:

proto udp
dev tun
port 1195
server 10.10.10.0 255.255.255.0

#####Rota para os clientes####
client-config-dir ccd

#Filial2
route 192.168.4.0 255.255.255.0

##########################################################

max-clients 10
tls-server

#Compressao de dados
comp-lzo

#Tempo de ping 10s tempo de reinicio 120s
keepalive 10 120

#Mantem tunel e chaves carregadas em caso de quedas
persist-key
persist-tun

#Mantem o tunel levantando mesmo em conexoes ip dinamico
float

#########################################
dh /etc/openvpn/keysServidor/dh2048.pem
ca /etc/openvpn/keysServidor/ca.crt
cert /etc/openvpn/keysServidor/servidorFilial1.crt
key /etc/openvpn/keysServidor/servidorFilial1.key
tls-auth /etc/openvpn/keysServidor/chave.key 0

b) Crie as pastas /etc/openvpn/keysServidor e /etc/openvpn/ccd

# mkdir /etc/openvpn/keysServidor
# mkdir /etc/openvpn/ccd

c) Crie o arquivo /etc/openvpn/ccd/filial2

Conteúdo arquivo /etc/openvpn/ccd/filial2 :

iroute 192.168.4.0 255.255.255.0

d) Criar as chaves de segurança e autenticação:

* Copiar os scripts de criação das chaves fornecidos pela instalação do Open VPN para o diretório /etc/openvpn:

# cp -a /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

* Configurar o arquivo vars para geração das chaves:

Edite o arquivo /etc/openvpn/easy-rsa/2.0/vars e modifique as seguintes linhas de acordo com seus dados (KEY_SIZE corresponde ao tamanho da chave 2048 bits):

# mcedit /etc/openvpn/easy-rsa/2.0/vars

Linhas a serem modificadas:

export KEY_SIZE=2048
export KEY_COUNTRY= “BR”
export KEY_PROVINCE = “SC”
export KEY_CITY = “Laguna”
export KEY_ORG = “ITN Ltda”
export KEY_EMAIL= “itnp@msn.com”

* Preparar ambiente para criação das chaves para o servidorFilial1 e filial2:

# cd /etc/openvpn/easy-rsa/2.0
# source vars
# ./clean-all

#./build-ca
(Apenas confirme os dados com ENTER nessa etapa).

Entre na pasta /etc/openvpn/easy-rsa/2.0/keys e confirme a existência dos arquivos ca.crt, ca.key, index.txt e serial.

* Criar as chaves propriamente ditas:

# cd /etc/openvpn/easy-rsa/2.0/

./build-key-server servidorFilial1
(Mais uma vez confirme com ENTER os dados e responda do Y as duas perguntas finais Sign the certificate? Y e 1 out of 1 certificate requests certified, commit? Y)

Resultado esperado:
Write out database with 1 new entries
Data Base Updated

./buid.dh dh2048.pem
(Esse comando pode demorar alguns segundos).

# openvpn –genkey –secret chave.key
# mv chave.key /etc/openvpn/keysServidor
(Criar essa chave adiciona uma camada extra de segurança a sua VPN recomendado pelo próprioHOWTO)

./build-key filial2
(Mais uma vez confirme com ENTER os dados e responda do Y as duas perguntas finais Sign the certificate? Y e 1 out of 1 certificate requests certified, commit? Y)

Resultado esperado:
Write out database with 1 new entries
Data Base Updated

e) Confirmar a criação das chaves, copiar para seus diretórios de destino e iniciar o servidor OpenVPN:

* Entre na pasta /etc/openvpn/easy-rsa/2.0/keys e copie os arquivos ca.crt, servidorFilial1.crt, servidorFilial1.key e dh2048.pem, para a pasta/etc/openvpn/keys.

# cd /etc/openvpn/easy-rsa/2.0/keys
# cp –a servidor.key servidor.crt dh2048.pem ca.crt /etc/openvpn/keysServidor

f) Reinicie o serviço do Open VPN, confirme a criação da interface tun1 e das rotas para a rede da filial2:

# /etc/init.d/openvpn restart
# ifconfig tun0

#route | grep tun0
Resultado esperado desse comando:

192.168.4.0 10.10.10.2 255.255.255.0 UG 0 0 0 tun0

3 – Configurar o firewall para aceitar conexões na porta 1195, adicionando a seguinte linha:

iptables -A INPUT –p udp –dport 1195 –j ACCEPT

Observações importantes:

1º Antes da criação da configuração para o servidor do Open VPN na filial1, a interface tun0 era a do cliente da matriz.

2º Note que agora possuímos duas interfaces tun0 e tun1 no servidor da filial1, uma utilizada para o cliente da matriz (tun1) e outra para o servidor da filial2 (tun0).

3º Precisamos alterar a porta de escuta do servidor do Open VPN da filial1 para 1195, isso porque a porta padrão 1194 já estava sendo utilizada pelo cliente que se conecta na matriz.

CONFIGURAÇÃO DA FILIAL2

Continuando nosso tutorial, temos ainda a configuração do filial2 que atuará apenas como cliente tanto da matriz como da filial1.

1 – Configurar o cliente da Matriz:

a) Crie as pastas /etc/openvpn/keysMatriz

# mkdir /etc/openvpn/keysMatriz

b) Crie o arquivo /etc/openvpn/clienteMatriz.conf:

# mcedit /etc/openvpn/clienteMatriz.conf

Conteúdo do arquivo /etc/openvpn/clienteMatriz.conf:

remote “IP DA MATRIZ”
proto udp
client
route 192.168.2.0 255.255.255.0
dev tun
tls-client

##CONFIGURAÇÕES DE OTIMIZACAO##

#Tempo de ping 10s tempo de reinicio 120s
keepalive 10 120

#Compressao dos dados
comp-lzo

#Mantem tunel e chaves carregadas em quedas
persist-key
persist-tun

##########################################
dh /etc/openvpcn/keysMatriz/dh2048.pem
ca /etc/openvpn/keysMatriz/ca.crt
cert /etc/openvpn/keysMatriz/filial2.crt
key /etc/openvpn/keysMatriz/filial2.key
tls-auth /etc/openvpn/keysMatriz/chave.key 1

c) Copiar as chaves necessárias correspondentes a filial2 do servidor da matriz: dh2048.pem, ca.crt, filial2.crt , filial2.key e chave.key da pasta /etc/openvpn/easy-rsa/2.0/keys e /etc/openvpn/keys para a pasta /etc/openvpn/keysMatriz do servidor da filial2.

Exemplo utilizando sftp:

# cd /etc/openvpn/keysMatriz
# sftp root@“IP DA MATRIZ”
# “senha do root da matriz”
# get /etc/openvpn/easy-rsa/2.0/keys/filial2.crt
# get /etc/openvpn/easy-rsa/2.0/keys/filial2.key
# get /etc/openvpn/easy-rsa/2.0/keys/ca.crt
# get /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem
# get /etc/openvpn/keys/chave.key

d) Reinicie o serviço do Open VPN, confirme a criação da interface tun0 e das rotas para a rede da matriz:

# /etc/init.d/openvpn restart
#ifconfig tun0

#route | grep tun0
Resultado esperado desse comando:

192.168.2.0 10.0.0.9 255.255.255.0 UG 0 0 0 tun0

e) Teste a comunicação entre filial2 e Matriz através do envio de Pings:

#ping 192.168.2.1
(Enviado do servidor da filial2)

#ping 192.168.4.1
(Enviado do servidor da matriz)

2 – Configurar o cliente da Filial1:

a) Crie as pastas /etc/openvpn/keysFilial1

# mkdir /etc/openvpn/keysFilial1

b) Crie o arquivo /etc/openvpn/clienteFilial1.conf:

# mcedit /etc/openvpn/clienteFilial1.conf

Conteúdo do arquivo /etc/openvpn/clienteFilial1.conf:

remote “IP DA FILIAL1”
proto udp
port 1195
client
route 192.168.3.0 255.255.255.0
dev tun
tls-client

##CONFIGURAÇÕES DE OTIMIZACAO##

#Tempo de ping 10s tempo de reinicio 120s
keepalive 10 120

#Compressao dos dados
comp-lzo

#Mantem tunel e chaves carregadas em quedas
persist-key
persist-tun

##########################################
dh /etc/openvpcn/keysFilial1/dh2048.pem
ca /etc/openvpn/keysFilial1/ca.crt
cert /etc/openvpn/keysFilial1/filial2.crt
key /etc/openvpn/keysFilial1/filial2.key
tls-auth /etc/openvpn/keysFilial2/chave.key 1

c) Copiar as chaves necessárias correspondentes a filial2 do servidor da filial1: dh2048.pem, ca.crt, filial2.crt , filial2.key e chave.key da pasta /etc/openvpn/easy-rsa/2.0/keys e /etc/openvpn/keys para a pasta /etc/openvpn/keysMatriz do servidor da filial2.

Exemplo utilizando sftp:

# cd /etc/openvpn/keysFilial1
# sftp root@“IP DA FILIAL1”
# “senha do root da filial1”
# get /etc/openvpn/easy-rsa/2.0/keys/filial2.crt
# get /etc/openvpn/easy-rsa/2.0/keys/filial2.key
# get /etc/openvpn/easy-rsa/2.0/keys/ca.crt
# get /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem
# get /etc/openvpn/keysServidor/chave.key

d) Reinicie o serviço do Open VPN, confirme a criação de mais uma interface tun1 e das rotas para a rede da filial1:

# /etc/init.d/openvpn restart
#ifconfig tun0
#ifconfig tun1

#route | grep tun
Resultado esperado desse comando:

192.168.3.0 10.10.10.5 255.255.255.0 UG 0 0 0 tun0
192.168.2.0 10.0.0.9 255.255.255.0 UG 0 0 0 tun1

e) Teste a comunicação entre filial2 e Matriz através do envio de Pings:

#ping 192.168.2.1
(Enviado do servidor da filial2)

#ping 192.168.4.1
(Enviado do servidor da matriz)

f) Teste a comunicação entre filial2 e Filial1 através do envio de Pings:

#ping 192.168.3.1
(Enviado do servidor da filial2)

#ping 192.168.4.1
(Enviado do servidor da filial1)

ROTEAMENTO PARA REDE LOCAL

Apesar de todos os três servidores estarem comunicando-se através da VPN, se o objetivo é expandir o encaminhamento de pacotes para os terminais ligados nas redes e permitir a comunicação entre eles, como comentando anteriormente, é necessário à configuração dos servidores para permitir o repasse de pacotes das interfaces dos túneis a interface de rede local. Para tanto ativamos o repasse com o seguinte comando:

Na matriz:
# echo 1 > /proc/sys/net/ipv4/ip_forward

Na Filial1:
# echo 1 > /proc/sys/net/ipv4/ip_forward

Na Filial2:
# echo 1 > /proc/sys/net/ipv4/ip_forward

Após completar esse passo as redes estarão se comunicando sem problemas, sendo que tarefas como compartilhamento de impressoras e arquivos já podem ser realizadas entre os micros das redes geograficamente separadas tranquilamente.

CONCLUSÃO

Utilizando a configuração desse tutorial a VPN estará roteando o tráfego. Isso elimina a transmissão de broadcast e protocolos da camada 2. A desvantagem é que como as redes estão em endereçamentos diferentes, alguns recursos da rede como instalação automática de impressoras do Cups ou de um servidor DHCP unificado para três redes não irão funcionar. Para esses casos podemos utilizar o pacote bridge-utils, e criar uma configuração tal em que todas as três redes estejam conectadas como se estivessem em uma mesma rede local. No entanto, isso irá aumentar drasticamente o tráfego tornando-se muitas vezes inviável. Na grande maioria dos casos a solução proposta nesse aqui é mais que suficiente, sendo que podemos limitar ainda mais o uso do túnel bloqueando tudo e liberando apenas as portas e protocolos necessários aos serviços que irão utilizar de fato a VPN.

Fonte: http://itnproducoes.blogspot.com.br/2012/01/criando-tuneis-seguros-com-o-openvpn.html