CRIANDO TÚNEIS SEGUROS COM O OPEN VPN (Matriz – Filial1 – Filial2)
Autor: Irineu Teza Nunes | Publicado: 2012-01-22T09:34:00-02:00

INTRODUÇÃOEm 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.Para melhor entendermos o problema imaginamos a situação da figura que servirá como base desse tutorial: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ção1º - 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.html2º - 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 --&gt; Matriz192.168.3.1/24 --&gt; Filial1192.168.4.1/24 --&gt; Filial2CenárioRedes separadas geograficamente:192.168.2.0/24 --&gt; Matriz192.168.3.0/24 --&gt; Filial1192.168.4.0/24 --&gt; 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ÇÃOPara instalar o Open VPN nos servidores.# apt-get install openvpnCONFIGURAÇÃO DA MATRIZEm 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.confConteúdo do arquivo /etc/openvpn/servidor.conf:proto udpdev tunserver 10.0.0.0 255.255.255.0#####Rota para os clientes####client-config-dir ccd#Filial1route 192.168.3.0 255.255.255.0#Filial2route 192.168.4.0 255.255.255.0##########################################################max-clients 10tls-server#Compressao de dadoscomp-lzo#Tempo de ping 10s tempo de reinicio 120skeepalive 10 120#Mantem tunel e chaves carregadas em caso de quedaspersist-keypersist-tun#Mantem o tunel levantando mesmo em conexoes ip dinamicofloat#########################################dh /etc/openvpn/keys/dh2048.pemca /etc/openvpn/keys/ca.crtcert /etc/openvpn/keys/servidor.crtkey /etc/openvpn/keys/servidor.keytls-auth /etc/openvpn/keys/chave.key 0b) Crie a pasta /etc/openvpn/keys e /etc/openvpn/ccd# mkdir /etc/openvpn/keys# mkdir /etc/openvpn/ccdc) Crie os arquivos /etc/openvpn/ccd/filial1 e /etc/openvpn/ccd/filial2# mcedit /etc/openvpn/ccd/filial1Conteúdo arquivo /etc/openvpn/ccd/filial1 :iroute 192.168.3.0 255.255.255.0# mcedit /etc/openvpn/ccd/filial2Conteú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#Filial1route 192.168.3.0 255.255.255.0#Filial2route 192.168.4.0 255.255.255.0do 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/varsLinhas 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 entriesData 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óprio HOWTO)./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 entriesData 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 entriesData Base Updatede) 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 tun0Resultado esperado desse comando:…192.168.4.0 10.0.0.2 255.255.255.0 UG 0 0 0 tun0192.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 ACCEPTCONFIGURAÇÃO DA FILIAL1Com 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/keysClienteb) Crie o arquivo /etc/openvpn/clienteMatriz.conf# mcedit /etc/openvpn/clienteMatriz.confConteúdo do arquivo /etc/openvpn/clienteMatriz.conf:remote “IP DA MATRIZ”proto udpclient route 192.168.2.0 255.255.255.0dev tuntls-client##CONFIGURAÇÕES DE OTIMIZACAO###Tempo de ping 10s tempo de reinicio 120skeepalive 10 120#Compressao dos dadoscomp-lzo#Mantem tunel e chaves carregadas em quedaspersist-keypersist-tun##########################################dh /etc/openvpcn/keysCliente/dh2048.pemca /etc/openvpn/keysCliente/ca.crtcert /etc/openvpn/keysCliente/filial1.crtkey /etc/openvpn/keysCliente/filial1.keytls-auth /etc/openvpn/keysCliente/chave.key 1c) 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.keyd) 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 tun0Resultado 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 udpdev tunport 1195server 10.10.10.0 255.255.255.0#####Rota para os clientes####client-config-dir ccd#Filial2route 192.168.4.0 255.255.255.0##########################################################max-clients 10tls-server#Compressao de dadoscomp-lzo#Tempo de ping 10s tempo de reinicio 120skeepalive 10 120#Mantem tunel e chaves carregadas em caso de quedaspersist-keypersist-tun#Mantem o tunel levantando mesmo em conexoes ip dinamicofloat#########################################dh /etc/openvpn/keysServidor/dh2048.pemca /etc/openvpn/keysServidor/ca.crtcert /etc/openvpn/keysServidor/servidorFilial1.crtkey /etc/openvpn/keysServidor/servidorFilial1.keytls-auth /etc/openvpn/keysServidor/chave.key 0b) Crie as pastas /etc/openvpn/keysServidor e  /etc/openvpn/ccd# mkdir /etc/openvpn/keysServidor# mkdir /etc/openvpn/ccdc) Crie o arquivo /etc/openvpn/ccd/filial2Conteúdo arquivo /etc/openvpn/ccd/filial2 :iroute 192.168.4.0 255.255.255.0d) 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/varsLinhas 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 entriesData 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óprio HOWTO)./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 entriesData Base Updatede) 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/keysServidorf) 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 tun0Resultado 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 ACCEPTObservaçõ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 FILIAL2Continuando 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/keysMatrizb) Crie o arquivo /etc/openvpn/clienteMatriz.conf:# mcedit /etc/openvpn/clienteMatriz.confConteúdo do arquivo /etc/openvpn/clienteMatriz.conf:remote “IP DA MATRIZ”proto udpclient route 192.168.2.0 255.255.255.0dev tuntls-client##CONFIGURAÇÕES DE OTIMIZACAO###Tempo de ping 10s tempo de reinicio 120skeepalive 10 120#Compressao dos dadoscomp-lzo#Mantem tunel e chaves carregadas em quedaspersist-keypersist-tun##########################################dh /etc/openvpcn/keysMatriz/dh2048.pemca /etc/openvpn/keysMatriz/ca.crtcert /etc/openvpn/keysMatriz/filial2.crtkey /etc/openvpn/keysMatriz/filial2.keytls-auth /etc/openvpn/keysMatriz/chave.key 1c) 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.keyd) 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 tun0Resultado 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/keysFilial1b) Crie o arquivo /etc/openvpn/clienteFilial1.conf:# mcedit /etc/openvpn/clienteFilial1.confConteúdo do arquivo /etc/openvpn/clienteFilial1.conf:remote “IP DA FILIAL1”proto udpport 1195client route 192.168.3.0 255.255.255.0dev tuntls-client##CONFIGURAÇÕES DE OTIMIZACAO###Tempo de ping 10s tempo de reinicio 120skeepalive 10 120#Compressao dos dadoscomp-lzo#Mantem tunel e chaves carregadas em quedaspersist-keypersist-tun##########################################dh /etc/openvpcn/keysFilial1/dh2048.pemca /etc/openvpn/keysFilial1/ca.crtcert /etc/openvpn/keysFilial1/filial2.crtkey /etc/openvpn/keysFilial1/filial2.keytls-auth /etc/openvpn/keysFilial2/chave.key 1c) 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.keyd) 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 tunResultado esperado desse comando:…192.168.3.0 10.10.10.5 255.255.255.0 UG 0 0 0 tun0192.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 LOCALApesar 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 &gt; /proc/sys/net/ipv4/ip_forwardNa Filial1:# echo 1 &gt; /proc/sys/net/ipv4/ip_forwardNa Filial2:# echo 1 &gt; /proc/sys/net/ipv4/ip_forwardApó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ÃOUtilizando 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.REFERÊNCIASMorimoto, Carlos Eduardo. Servidores Linux – guia prático. Porto Alegre: Sul Editores,2009.HOWTO Open VPN. Disponível em:  Acesso em: 21 jan. 2012.