Recentemente minha empresa requisitou que o departamento de TI liberasse o acesso via VPN à todos os vendedores externos como uma medida para tentar aumentar a quantidade de vendas e a qualidade do atendimento aos clientes.
A primeira coisa que passou pela mente de todos no time foi segurança. Todos sabem que este tipo de software, se não implementado corretamente, é uma grande brecha de segurança. Uma das primeiras alternativas que analisamos foi o PPTP.
Como você já deve saber, nem os próprios desenvolvedores da implementação do PPTP o recomendam por causa da grande quantidade de falhas de segurança do software. Além disso, todas as senhas dos usuários com permissão para se conectar ao servidor ficam em um arquivo texto sem a mínima criptografia, o que aumenta muito os riscos de segurança.
A nossa segunda opção foi o OpenVPN. O que me chamou a atenção foi uma das premissas que guiaram os desenvolvedores no desenvolvimento deste software: complexidade é inimiga da segurança. Nada mais correto!
Porém, a implementação do OpenVPN para Windows não é muito amigável para usuários leigos como os vendedores da empresa. Neste aspecto o PPTP é uma boa opção, pois apenas abrindo a conexão e clicando no botão “Conectar” tudo já funcionava corretamente.
Procurando por soluções no próprio site do OpenVPN, acabei encontrando o OpenVPN GUI. Esta é uma implementação de interface gráfica para que o usuário consiga utilizar o OpenVPN mais facilmente. Com ele, basta clicar com o botão direito no ícone do OpenVPN GUI (que fica perto do relógio do Windows) e depois em “Connect” que tudo funcionaria sem problemas. Pronto! Encontrei minha solução, basta agora configurar tudo corretamente.
O servidor que escolhi para configurar o OpenVPN foi o CentOS 5.2 Linux, simplesmente por gostar da distribuição. Praticamente todo este texto se aplica a qualquer distribuição.
Se você entende bem inglês, recomendo que leia o FAQ no site do OpenVPN para tirar dúvidas. Muita informação clara e preciosa se encontra lá. Lendo o FAQ você consegue implantar uma VPN do zero sem muita dor de cabeça. Mais ou menos o objetivo deste texto!
Começando pela instalação do OpenVPN. Nos repositórios do CentOS o OpenVPN ainda não está disponível, por isso vamos precisar compilá-lo na mão. Mas antes, precisamos das ferramentas de desenvolvimento para podermos compilar os softwares necessários sem muita dor de cabeça.
Para instalá-las:
# yum groupinstall ‘Development Tools’
Isso vai levar um tempo, mas quando terminar você já vai conseguir compilar qualquer software que precise. Antes de instalar o OpenVPN é recomendado que você instale o OpenSSL e o OpenSSL-devel (que estão nos repositórios do CentOS):
# yum install openssl
# yum install openssl-devel
A biblioteca LZO, utilizada para fazer compressão dos dados em tempo real (o que melhora muito o desempenho do software), também é recomendada. Para fazer o download do LZO, vá até o site http://www.oberhumer.com/opensource/lzo/download/ e pegue a versão mais recente (cuidado para não fazer o download da minilzo, que não servirá neste caso). Para compilar e instalar o LZO:
# tar xzvf lzo-2.03.tar.gz
# cd lzo-2.03
# ./configure
# make
# make install
A instalação do OpenVPN também é bem simples. Faça o download dos arquivos do site oficial (http://www.openvpn.net) e compile:
# tar xzvf openvpn-2.0.9.tar.gz
# cd openvpn-2.0.9
# ./configure
# make
# make install
Como você deve se lembrar do início do artigo, o OpenVPN foi feito para ser simples: coisas muito complicadas tendem a ser configuradas de maneira errônea, o que acaba causando falhas na segurança do sistema.
Sendo assim, não é errado imaginar que a configuração do sistema seja simples. Com algumas opções você já consegue deixar o servidor inteiro funcionando perfeitamente. No meu ambiente preferi fazer com que o OpenVPN funcionasse por uma bridge por alguns motivos:
Primeiro, vou explicar como configurar o OpenVPN e depois explicarei como fazer a bridge no Linux.
O OpenVPN é um pouco diferente: ele não cria nenhum diretório padrão, nem arquivos de configuração na instalação. Quando você vai criar uma nova VPN você começa um novo arquivo de configuração do zero.
Crie o diretório /etc/openvpn:
# mkdir /etc/openvpn
Para dentro deste diretório você deve copiar o diretório easy-rsa, que está dentro do diretório criado quando você descompactou o OpenVPN na sua máquina.
# cp -R openvpn-2.0.9/easy-rsa /etc/openvpn
O easy-rsa é um conjunto de scripts que facilitam o processo de criação de certificados digitais. Estes serão utilizados para autenticar os usuários e permitir que eles estabeleçam a conexão com o nosso servidor.
Depois, crie um diretório que irá guardar os arquivos de configuração da VPN que iremos criar. Você pode dar qualquer nome a este diretório. Aqui, vou chamá-lo de vol-vpn:
# mkdir /etc/openvpn/vol-vpn
Dentro dele, crie um arquivo texto com qualquer nome. Ele irá conter todos os parâmetros da configuração da VPN que estamos fazendo. Ele vai ficar mais ou menos assim:
# cat /etc/openvpn/vol-vpn.conf
# Porta na qual o servidor aceitará conexões
port 1194
# Protocolo utilizado no túnel
proto udp
# Dispositivo utilizado pelo OpenVPN
dev tap0
# Indica que o servidor atuará como o
# controlador no canal de comunicação
# durante a conexão TLS
tls-server
# Permite que os clientes conectados ao
# servidor troquem pacotes entre si
client-to-client
# Para não precisar especificar o caminho
# completo nas opções ca, cert, key, dh e tls-auth
# utilizamos esta opção
cd /etc/openvpn/keys
ca ca.crt
cert vpnsrv.crt
key vpnsrv.key
dh dh1024.pem
# Chave estática que atua como uma segunda
# camada de proteção. Servidor só aceita conexões caso
# este arquivo também exista no cliente.
# gere com openvpn –genkey –secret ta.key
tls-auth /etc/openvpn/keys/ta.key 0
# Define que atuaremos como servidor
mode server
# Número máximo de clientes simultâneos conectados
# ao servidor. Neste caso, em um dado momento apenas
# 10 clientes conseguirão ficar conectados ao mesmo tempo.
# Mude para o número que você desejar e seus recursos
# permitirem
max-clients 10
# Permite que 2 clientes com o mesmo nome se conectem ao
# servidor ao mesmo tempo. Sem esta opção, o cliente que tentar
# se conectar derruba o cliente já conectado.
duplicate-cn
# Define o IP interno do servidor e a faixa de IP’s que serão
# atribuídos aos clientes quando se conectarem. Neste caso, o
# OpenVPN pode atribuir qualquer um dos 20 IP’s no range configurado.
server-bridge 192.168.0.1 255.255.255.0 192.168.0.10 192.168.0.30
# Configura o DNS no cliente
push “dhcp-option DNS 192.168.0.254″
# Configura o servidor WINS no cliente. Geralmente
# este é o controlador de domínio da sua rede.
push “dhcp-option WINS 192.168.0.3″
# Define qual será o gateway utilizado pelos clientes
# quando conectarem na VPN. É bom que este gateway seja
# a interface interna do seu servidor OpenVPN.
push “default-gateway 192.168.0.1″
# Define quando a outra ponta está morta. A cada 10 segundos
# um ping é enviado e se não for recebido em 120 segundos uma resposta,
# definimos que a outra ponta está morta.
ping 10
ping-restart 120
# Configura as mesmas opções no cliente.
push “ping 10″
push “ping-restart 60″
# Define que os dados serão comprimidos antes
# de serem enviados pelo canal de comunicação.
comp-lzo
# No arquivo status são gravados os dados dos clientes
# que se conectam ao servidor. Bom para controle do servidor.
status /etc/openvpn/vol-vpn/openvpn-status.log 2
# Quantidade de informações que serão escritas nos logs
# do OpenVPN. Quanto maior o número, mais informações.
verb 4
# Define quais serão os logs do sistema.
log /var/log/openvpn-vol-vpn.log
log-append /var/log/openvpn-vol-vpn.log
Bem simples, não? Obviamente este é um arquivo básico que tem como objetivo apenas fechar uma VPN que “faz o serviço”, nada de avançado. Se você quiser uma explicação detalhada sobre estas e mais outras opções que podem te ajudar bastante, leia o FAQ do OpenVPN.
Agora que já temos tudo configurado, precisamos gerar os certificados do servidor para que ele consiga emitir e validar os certificados dos clientes.
Entre no diretório /etc/openvpn/easy-rsa. Aqui dentro você verá vários shell-scripts diferentes, todos relacionados com a criação de certificados SSL. Primeiro, edite o arquivo vars. Ele contém algumas variáveis que devem ser modificadas:
Estas variáveis são utilizadas durante a criação de todos os certificados do sistema e devem sempre ser informadas corretamente. Salve o arquivo e faça o seguinte:
# . ./source vars
Ele irá executar o arquivo vars, definindo todas as variáveis de ambiente necessárias para os outros scripts que serão executados. Depois:
# ./clean-all
Este arquivo irá limpar o diretório /etc/openvpn/easy-rsa/keys (se você não tiver modificado o padrão do arquivo vars). Depois:
# ./build-ca
Este script demora um pouco para executar, geralmente você pode aceitar todos os padrões que ele oferece (que são lidos das variáveis definidas no vars). Ele cria uma autoridade certificadora que valida certificados e emite certificados com permissão de conectar no servidor. NUNCA apague o arquivo gerado pelo script. Se o fizer, todos os certificados já emitidos não terão permissão para conectar no servidor novamente e você vai precisar emitir todos novamente.
Agora já temos uma autoridade certificadora. Vamos gerar o certificado do servidor e dos clientes.
Para gerar o certificado do servidor:
# ./build-key-server servidor
Lembre-se de substituir “servidor” pelo nome do seu servidor. Aceite todos os padrões, mas em “Common name” coloque o nome do seu servidor. Logo após, ele oferece incluir uma senha no certificado. Pode deixar isso em branco. Dessa parte em diante, quando o script te fizer perguntas, sempre responda afirmativamente com “y”.
Para gerar os certificados para os clientes execute o script build-key:
# ./build-key cliente01
Serão feitas todas as perguntas que foram feitas quando você executou o build-key-server. Responda todas adequadamente e lembre-se de responder com “y” as últimas duas perguntas ou o certificado não será adicionado ao BD de certificados válidos. Lembre-se de trocar “cliente01″ pelo nome que você quer que o arquivo do certificado tenha.
Para revogar um certificado e fazer com que ele não consiga mais se conectar ao servidor faça o seguinte:
# cd /etc/openvpn/easy-rsa/
# . ./vars
# ./revoke-full cliente01
Para completar a operação, é necessário reiniciar o OpenVPN. Lembrando que isso só é necessário quando você quiser evitar que um determinado certificado consiga se conectar ao servidor.
Depois, gere a chave DH que permite que o cliente e servidor envolvidos na conexão troquem certificados de forma segura e cifrada, confirmando suas identidades:
# ./build-dh
Este script também demora um pouco, dependendo do equipamento onde você está executando. Todos os certificados são criados em /etc/openvpn/keys, se você não tiver modificado o padrão do script vars, editado anteriormente. Dentro deste diretório, pode ser que você encontre arquivos com a extensão .csr. Todos eles podem ser removidos pois são apenas requisições de certificados.
Antes de mais nada, é preciso instalar o pacote bridge-utils para que você consiga trabalhar com bridges no Linux. Para isso:
# yum install bridge-utils
No site do OpenVPN você encontra dois scripts muito úteis para configurar a bridge facilmente, um para inicializar a bridge e outro para pará-la. Seguem os scripts, basta copiar e colar em arquivos executáveis no seu servidor:
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define qual o dispositivo da bridge
br=”br0″
# Qual o dispositivo TAP será incluído na bridge
# Para incluir vários:
# tap=”tap0 tap1 tap2″
tap=”tap0″
# Define qual a interface ethernet que entrará na bridge.
# A interface deve ser a que se conecta à rede interna.
eth=”eth0″
eth_ip=”192.168.8.4″
eth_netmask=”255.255.255.0″
eth_broadcast=”192.168.8.255″
# Não precisa editar mais nada!
for t in $tap; do
openvpn –mktun –dev $t
done
brctl addbr $br
brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
Para parar a bridge:
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Interface da bridge
br=”br0″
# Interface TAP utilizada pelo OpenVPN
tap=”tap0″
ifconfig $br down
brctl delbr $br
for t in $tap; do
openvpn –rmtun –dev $t
done
Para inicializar a bridge, entre no diretório onde você criou o script que inicializa a bridge e:
# chmod +x bridge-start.sh
# ./bridge-start.sh
Para pará-la:
# ./bridge-stop.sh
Para automatizar este processo e inicializar a bridge sempre que o OpenVPN for inicializado, adicione as duas linhas no final do arquivo de configuração da sua VPN:
A primeira linha inicializa a bridge junto com o OpenVPN, a segunda para. Lembre-se que quando o seu sistema é configurado como bridge, ele perde o IP e fica inacessível pela rede. Para conseguir administrar seu servidor remotamente, pare a VPN ou coloque mais uma placa de rede que não participe da VPN apenas para conectar no servidor pelo SSH.
Agora o servidor está pronto para receber conexões e autenticar certificados. Vamos passar à configuração do OpenVPN no cliente.
Primeiro, faça o download e instalação do OpenVPN GUI (openvpn-2.0.9-gui-1.0.3-install.exe). Este arquivo já instala o OpenVPN e a interface gráfica do sistema. O diretório padrão de instalação é o C:\Arquivos de programas\OpenVPN. Vou sempre me referir a este diretório no tutorial. Se você modificar o padrão, faça as devidas substituições.
Primeiramente, vamos passar todos os arquivos de certificados para o cliente. Lembre-se de fazer isso sempre da forma mais segura possível pois se alguém for capaz de interceptar a transmissão e conseguir fazer uma cópia destes arquivos, ele poderá se conectar ao servidor e ter acesso a toda a sua rede interna.
Os arquivos devem ser colocados em C:\Arquivos de Programas\OpenVPN\config. Este diretório deve conter os arquivos ca.crt, dh1024.pem e o certificado do cliente (arquivos com as extensões .crt e .key). Além disso, também é necessário o arquivo de configuração do OpenVPN cliente. O nome não importa, mas é bom deixar a extensão dele como .ovpn. Para criar este arquivo, abra o Bloco de notas e insira o seguinte conteúdo:
Arquivo vol-vpn-client.ovpn:
# define qual o protocolo a ser utilizado
proto udp
# porta na qual a conexão será realizada
# no servidor
prot 1194
# define que o OpenVPN neste computador
# deve atuar como um cliente
client
# fala para o OpenVPN aceitar as configurações
# que o servidor enviar
pull
# define o dispositivo que será utilizado
# aqui também: tap para bridge e tun para vpn’s
# roteadas.
dev tap
# compressão de dados para otimizar a conexão
comp-lzo
# verifica se a outra ponta está ativa
keepalive 10 120
# define que seremos o cliente no
# handshake tls
tls-client
# onde estão os certificados. lembre-se sempre
# de que você deve colocar o caminho entre aspas
# duplas e com \\ separando os diretórios.
dh “C:\\Arquivos de Programas\\OpenVPN\\config\\dh1024.pem”
ca “C:\\Arquivos de Programas\\OpenVPN\\config\\ca.crt”
cert “C:\\Arquivos de Programas\\OpenVPN\\config\\cliente01.crt”
key “C:\\Arquivos de Programas\\OpenVPN\\config\\cliente01.key”
Pronto. O cliente também já está configurado e pronto para fazer a conexão com o servidor.
Primeiro temos que ativar o OpenVPN no servidor. Para isso:
# openvpn –config /etc/openvpn/vol-vpn/vol-vpn.conf &
Se o arquivo de configuração estiver OK, o servidor estará ativo e esperando conexões na porta 1194.
Para fazer o cliente se conectar ao servidor, localize o ícone do OpenVPN GUI que fica perto do relógio do Windows e dê dois cliques nele. Se todo o processo for OK, uma mensagem dizendo que a conexão foi estabelecida sem problemas será mostrada. Como estamos utilizando certificados para a autenticação, nenhuma senha será pedida para o usuário. Quando ele terminar, basta clicar com o botão direito no ícone do OpenVPN GUI e selecionar “Disconnect”. À prova de gerentes que não sabem nem abrir o Bloco de notas direito! E melhor ainda: bem seguro! :)
Para liberar a conexão no seu firewall você deve liberar o tráfego de INPUT/OUTPUT para as interfaces tap do seu sistema. Uma regra parecida com essa deve resolver:
# iptables -A INPUT -i tap+ -j ACCEPT
# iptables -A FORWARD -i tap+ -j ACCEPT
Como você não saberá o IP do cliente de antemão, não dá pra fazer uma regra mais específica. Por isso é sempre bom garantir a segurança do cliente e, caso ele seja roubado, revogar os certificados imediatamente para que ninguém não autorizado não consiga fazer conexões ao seu servidor.
Por mais seguro que o OpenVPN seja, ele abre uma brecha muito grande na sua rede: ele permite que pessoas possam se conectar remotamente à sua rede e ter acesso à tudo o que está dentro dela. Isso inclui servidores, clientes e claro, dados secretos. Dados que se caírem nas mãos de pessoas erradas, podem gerar sérios prejuízos à sua empresa. Por isso sempre tome cuidado:
Para mais informações, tutoriais e mini-howtos completos visite o www.openvpn.net. Lá você vai encontrar tudo o que precisa para resolver as suas dúvidas. Se quiser também pode deixar seu comentário! :)

Esta obra escrita por Pedro Augusto de Oliveira Pereira está licensiada sob a Creative Commons Atribuição-Uso Não-Comercial-Vedada a Criação de Obras Derivadas 3.0 Brasil License.
3 Comentários
Como configurar uma bridge no Linux | Pedro Pereira
30|Mar|2010 1[...] são úteis em vários casos como em uma VPN bem específica (como a que eu citei no post “OpenVPN se comportando como PPTP“), ao fazer um firewall transparente (virtualmente impossível de se invadir) ou quando você [...]
Eduardo
26|Dec|2011 2Sei que ja faz tempo que você escreveu este post, mas na configuração do cliente como você deixou os certificados soltos na pasta config não há nescessidade de indicar todo o caminho.
Pedro Pereira
28|Dec|2011 3Eduardo,
Ok! Obrigado pela dica :)
[]‘s
Pedro Pereira
Deixe seu comentário!