You are on page 1of 15

Instalando o OpenVPN e criando uma VPN básica

O primeiro passo é instalar o OpenVPN, tanto no cliente quanto no servidor. Nas


distribuições derivadas do Debian você pode instalá-lo rapidamente via apt-get:

# apt-get install openvpn

No final da instalação, ele exibirá uma mensagem, perguntando se o OpenVPN deve ser
desativado antes de ser atualizado ("Would you like to stop openvpn before it gets
upgraded?"). Responda que sim.

No OpenSuSE, abra o Yast e, dentro da seção de gerenciamento de pacotes, faça uma


busca pelo pacote "openvpn". A busca resulta em dois resultados: "openvpn", que é o
pacote em que estamos interessados e "openvpn-devel", que contém o código fonte.
Basta selecionar o pacote e concluir a instalação.

No Fedora, a instalação pode ser feita usando o yum. Ele se encarregará de instalar
também os pacotes "openssl" e "lzo", que contém as bibliotecas usadas pelo OpenVPN
para encriptar e compactar o tráfego da rede:

# yum install openvpn

No CentOS, é necessário adicionar o repositório do RPMForge já que (até o CentOS


5.1), o pacote OpenVPN não faz parte dos repositórios oficiais. Você pode adicionar o
repositório seguindo as instruções disponíveis aqui:
http://wiki.centos.org/Repositories/RPMForge.

O primeiro passo é instalar a chave GPG do repositório:

# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

Com a chave instalada, baixe o pacote RPM do repositório. Este pacote instala o
arquivo com a configuração do repositório dentro da pasta "/etc/yum/repos.d".
Verifique o link do pacote para a versão do CentOS que está utilizando na página com
as instruções. No caso do CentOS 5.1, versão 32 bits, por exemplo, o pacote é o
"rpmforge-release-0.3.6-1.el5.rf.i386.rpm". Se você está fazendo a configuração via
linha de comando, pode baixar o pacote usando o wget, como em:

# wget -c
http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

Em seguida, instale o pacote usando o comando "yum localinstall", como em:

# yum localinstall rpmforge-release-0.3.6-1.el5.rf.i386.rpm


A partir daí, você pode instalar o pacote do OpenVPN usando o yum, assim como no
Fedora:

# yum install openvpn

No Mandriva, basta instalar o pacote "openvpn" usando urpmi. Assim como no Fedora,
ele também se encarrega de instalar as dependências:

# urpmi openvpn

Se você estiver utilizando uma distribuição que não inclua o pacote nos repositórios, ou
se a versão disponível for muito antiga, você pode também instalar a partir do pacote
com o código fonte, disponível no: http://openvpn.net/index.php/downloads.html

Depois de instalar o pacote, o próximo passo é carregar o módulo "tun" do Kernel, que é
utilizado pelo OpenVPN para criar interfaces virtuais. Cada VPN criada se comporta
como se fosse uma nova interface de rede, conectada à rede de destino. Imagine que a
VPN se comporta como se existisse um cabo de rede gigante ligando esta interface
virtual à rede do outro lado do túnel.

# modprobe tun

Adicione a linha "tun" no final do arquivo "/etc/modules" para que o módulo passe a ser
carregado automaticamente durante o boot:

# echo tun >> /etc/modules

Estes três passos, ou seja, a instalação do OpenVPN, o carregamento do módulo e a


adição da linha no final do arquivo devem ser executados tanto no servidor quanto nos
clientes.

Depois de concluída a instalação, você pode criar um túnel simples, não encriptado,
usando os comandos abaixo. Este túnel não pode ser considerado uma "VPN" já que
não é seguro, mas serve como um "hello word" dentro da configuração do OpenVPN.

Presumindo que as duas máquinas estejam ligadas em rede e que não exista nenhum
firewall no caminho, use o comando abaixo no cliente, especificando o endereço do
servidor:

# openvpn --remote 192.168.1.1 --dev tun0 --ifconfig 10.0.0.1 10.0.0.2

Faça o mesmo no servidor, especificando agora o endereço do cliente:

# openvpn --remote 192.168.1.202 --dev tun0 --ifconfig 10.0.0.2 10.0.0.1


Rode o comando "ifconfig" no cliente e você verá que foi criada uma interface de rede
virtual, a "tun0", com o endereço "10.0.0.1":

No exemplo, o servidor recebe o endereço "10.0.0.2". Você pode testar a conectividade


usando o ping ou qualquer outra ferramenta:

Como comentei, o OpenVPN possui também uma versão Windows, que está disponível
no http://openvpn.se.

Esta versão inclui um instalador gráfico e funciona em todas as versões do Windows a


partir do Windows 2000. Ela inclui também o driver tun/tap, que é instalado
automaticamente, você precisa apenas prestar atenção nas mensagens de instalação. Em
um certo ponto, será exibida uma mensagem avisando que o driver TAP/Win32 não
passou pelo processo de certificação de compatibilidade com o Windows. Responda
"Continuar assim mesmo" para efetuar a instalação, do contrário o OpenVPN não
funcionará.
O processo de certificação dos drivers para o Windows é um processo caro e demorado,
onde os fabricantes de componentes submetem os drivers de dispositivo à Microsoft
para que eles sejam certificados. Este é um processo que não está ao alcance de projetos
independentes, como o OpenVPN, daí a exibição da mensagem. De qualquer forma,
isso não significa que o software seja instável ou inseguro, muito pelo contrário. Se a
certificação da Microsoft fosse um indicador de qualidade, softwares como o IIS e o IE
não teriam tantas falhas e brechas de segurança.

Criando VPNs usando chaves estáticas


A forma mais simples de configurar o OpenVPN é utilizar chaves estáticas, onde um
arquivo contendo um algoritmo de encriptação é usado pelas duas partes para encriptar
os dados transmitidos através da VPN.

Nesse modo, você gera uma arquivo de texto no servidor, contendo a chave de
encriptação e precisa apenas copiá-la para o cliente e fazer uma configuração rápida
para criar a VPN. Se você quer apenas criar uma VPN doméstica, ou criar uma VPN
temporária entre duas redes, esta é a configuração recomendada.

O grande problema em utilizar uma chave estática é que, como o nome sugere, a mesma
chave é utilizada sessão após sessão, sem nunca mudar. Com isso, existe uma pequena
possibilidade de um atacante obstinado conseguir quebrar a VPN usando um ataque de
força bruta. Como a chave é um arquivo de texto, que é armazenado tanto no cliente
quanto no servidor, existe também a possibilidade de alguém conseguir copiá-lo, caso
tenha acesso físico a uma das máquinas. Outra limitação é que usando uma chave
estática o servidor suportará a conexão de um único cliente por VPN.

Para VPNs com vários clientes, ou em redes empresariais, onde a segurança é


prioridade, é recomendável utilizar uma estrutura baseada em certificados X509, como
veremos no tópico seguinte.

Vamos então à configuração de nossa primeira VPN. Para este exercício inicial,
recomendo que utilize duas máquinas da rede local, que não tenham firewall ativo.
Depois de entender melhor como o sistema funciona, passaremos para uma
configuração mais elaborada.

O primeiro passo é gerar o arquivo com a chave, no servidor. O arquivo deve ser gerado
dentro do diretório "/etc/openvpn" (o diretório padrão de configuração), de forma que
acessamos o diretório antes de executar o comando que gera a chave:

# cd /etc/openvpn
# openvpn --genkey --secret static.key

Isso gerará o arquivo "static.key", que contém a chave de encriptação que será usada
para criar a conexão. Ele é um arquivo de texto simples, que contém uma chave de 2048
bits, como em:

#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
0600d007988a59c6f7895884d336d445
2679fd3d2c0b9e0b777b4da92ab97043
... (mais 13 linhas)
e871ed9077185a2a6904e67cd0869e15
-----END OpenVPN Static key V1-----

Este arquivo deve ser copiado para a pasta "/etc/openvpn" do cliente, usando (por
exemplo) o SFTP. Você pode usar também um pendrive, ou outra mídia de uso local,
mas não é recomendável enviá-lo por meios não seguros (e-mail por exemplo), já que
qualquer um que tenha acesso ao arquivo poderá se conectar à sua VPN ou desencriptar
todo o tráfego transmitido através dela.

Para acessar o servidor (a partir do cliente) via SFTP, use o comando "sftp ip" para se
conectar e, em seguida, use os comandos "cd /etc/openvpn" e "get static.key" para fazer
a cópia, como em:

# cd /etc/openvpn
# sftp root@192.168.1.101

Password:
sftp> cd /etc/openvpn
sftp> get static.key
Fetching /etc/openvpn/static.key to static.key
sftp> quit

Com o arquivo contendo a chave presente nas duas máquinas, falta criar os arquivos de
configuração que serão usados pelo OpenVPN. Neste exemplo, criarei o arquivo
"/etc/openvpn/server.conf" no servidor e o arquivo "/etc/openvpn/client.conf" no cliente.
Os nomes podem ser diferentes, mas os arquivos devem ser criados dentro da pasta
"/etc/openvpn" e devem terminar com a extensão ".conf"

O arquivo "/etc/openvpn/server.conf", no servidor, fica com o seguinte conteúdo:

dev tun
ifconfig 10.0.0.1 10.0.0.2
secret static.key

A linha "ifconfig 10.0.0.1 10.0.0.2" inclui os endereços que serão usados pelas
interfaces virtuais da VPN, no servidor e no cliente. No exemplo, o servidor utilizará o
endereço "10.0.0.1" e o cliente o endereço "10.0.0.2". Você pode utilizar outros
endereços se preferir. O importante é que os endereços utilizados na VPN devem ser
sempre diferentes dos endereços usados na rede local.

A linha "secret static.key" especifica o arquivo com a chave de encriptação, que criamos
no passo anterior. Não esqueça de alterar a linha caso o nome do arquivo seja diferente.

Em seguida, vem o arquivo "/etc/openvpn/client.conf", que deve ser criado no cliente:

remote 192.168.1.101
dev tun
ifconfig 10.0.0.2 10.0.0.1
secret static.key

A primeira linha especifica o endereço IP do servidor. No exemplo, estou utilizando um


endereço de rede local, já que estamos apenas testando a VPN, mas, em um exemplo
real de uso, você utilizaria o endereço IP de Internet do servidor ou (ao utilizar uma
conexão com IP dinâmico) um domínio virtual utilizado por ele. Se você ainda não tem
um, acesse o no-ip.com ou o dyndns.org e faça o registro.

Com os arquivos de configuração criados, inicializar a VPN é incrivelmente simples.


Você precisa apenas reiniciar o serviço "openvpn" tanto no cliente quanto no servidor,
usando o comando:

# /etc/init.d/openvpn restart

Ao ser iniciado, o serviço procura por arquivos ".conf" dentro do diretório


"/etc/openvpn" e inicia as VPNs configuradas automaticamente (desde que o serviço
esteja configurado para subir durante o boot, o que é feito por padrão na maioria das
distribuições). Isso não apenas simplifica a configuração, mas faz com que a VPN passe
a ser automaticamente restabelecida a cada boot. Para desativá-la, basta parar o serviço:

# /etc/init.d/openvpn stop

Você pode, também, ativar o OpenVPN manualmente, usando (como root) o comando:

# openvpn --config /etc/openvpn/client.conf

(onde o "client.conf" é o arquivo de configuração que será usado)

Este comando manual permite acompanhar as mensagens de inicialização e de conexão,


o que ajuda a descobrir o que está errado em casos em que a VPN não funciona, embora
a configuração pareça estar correta.

Se a VPN é usada pelos clientes apenas esporadicamente, você pode criar um ícone no
desktop, ou um pequeno script contendo o comando, para que o usuário possa se
conectar à VPN apenas quando precisar. Outra opção é instalar o kvpnc
(http://home.gna.org/kvpnc/), um cliente gráfico que pode ser usado para se conectar a
VPNs baseadas em diversos protocolos, incluindo o OpenVPN:

Depois de estabelecida a VPN, o cliente passará a ter uma nova interface de rede, a
"tun0", com o endereço IP "10.0.0.2", que funciona como um link ponto-a-ponto com a
interface "tun0" do servidor, que recebe o endereço "10.0.0.1":

Teste a conexão usando o ping, ou acessando algum serviço disponível no servidor,


como em:
# ssh 10.0.0.1

Depois do teste inicial, você pode fazer um teste realizando a conexão via Internet (você
pode usar uma conexão discada ou outra conexão temporária no cliente para fazer o
teste). Para isso, você vai precisar apenas alterar a configuração no cliente, adicionando
o endereço de internet do servidor, como em:

remote guiadohardware.no-ip.org
dev tun
ifconfig 10.0.0.2 10.0.0.1
secret static.key

Não se esqueça de reiniciar o OpenVPN para que a alteração entre em vigor:

# /etc/init.d/openvpn restart

Configuração das portas no OpenVPN


Diferente de outras soluções de VPN, o OpenVPN utiliza uma única porta de entrada,
mesmo que sejam utilizadas várias VPNs simultaneamente. Isso facilita bastante a
configuração do firewall ou do roteamento de portas no servidor.

No OpenVPN 2.x é utilizada por padrão a porta 1194 UDP, que deve estar aberta no
firewall do servidor (versões antigas, anteriores à 2.0-beta16 utilizavam a porta 5000
UDP). Se o servidor acessa através de uma conexão compartilhada, é necessário
configurar o gateway da rede (ou o modem ADSL) para encaminhar a porta para ele.

Como de praxe, é possível alterar a porta padrão usada pelo OpenVPN, desde que você
especifique a nova porta tanto na configuração do servidor quanto do cliente. Para isso,
usamos a opção "proto udp", seguida pela porta desejada, que deve ser incluída tanto na
configuração do servidor quanto na do cliente, como em:

proto udp
port 22222

É possível, também, usar uma porta TCP. Nesse caso, usamos a opção "proto tcp-
server" na configuração do servidor (/etc/openvpn/server.conf) e a opção "proto tcp-
client" na configuração do cliente (/etc/openvpn/client.conf), como em:

proto tcp-server
port 22222

e:
proto tcp-client
port 22222

O grande problema em utilizar o TCP no OpenVPN é que o desempenho da VPN será


perceptivelmente pior do que se utilizada uma porta UDP.

Isso ocorre porque no UDP os pacotes são transmitidos diretamente, sem nenhum
overhead, o que garante o melhor desempenho. No UDP não existe correção de erros
nem retransmissão de pacotes perdidos, mas isso não é um problema no caso do
OpenVPN, pois ele é o responsável apenas pela criação do link de dados. Sobre ele,
temos o protocolo TCP/IP e as diferentes camadas do sistema operacional, que se
encarregam dessa tarefa.

Ao utilizar uma porta TCP, o próprio OpenVPN é obrigado a fazer a checagem e a


retransmissão de pacotes, respeitando o modo de funcionamento do protocolo. Isso
aumenta bastante a latência da conexão e faz com que cada vez que um pacote é
perdido, o OpenVPN precise parar a transmissão de todos os pacotes subsequentes até
que a retransmissão seja feita. Quanto maior for o volume de dados que trafegam pela
VPN, mais desvantajoso é o uso do TCP no caso do OpenVPN, de forma que é mais
recomendável utilizar uma porta UDP sempre que possível.

Estabilizando e otimizando a conexão


Usando a configuração simplificada do exemplo anterior, você notará que a VPN não
será muito estável, pois qualquer interrupção na comunicação entre as duas máquinas
derrubará o link, até que você reinicie o serviço do OpenVPN (no cliente), forçando a
reconexão, como em:

# /etc/init.d/openvpn restart

Vamos então a um conjunto de parâmetros de configuração que permitem estabilizar a


VPN, fazendo com que o OpenVPN passe a monitorar a conexão e restabelecê-la
automaticamente sempre que necessário.

O primeiro, e mais importante, é o parâmetro "keepalive", que faz com que o servidor e
o cliente monitorem a conexão, enviando pings periódicos um para o outro, e reiniciem
a VPN automaticamente caso não recebam resposta dentro de um período determinado.
Esta opção é especialmente importante em VPNs usadas através de links ADSL ou
qualquer outro tipo de conexão que não seja completamente estável. Um exemplo de
uso seria:

keepalive 10 120

O primeiro número especifica o intervalo dos pings e o segundo o timeout, depois do


qual a VPN é reiniciada. Nesse caso, o ping é enviado a cada 10 segundos sem atividade
e a VPN é reiniciada depois de 120 segundos sem respostas. Caso o link seja
interrompido, o cliente tenta restabelecer a VPN periodicamente, até que tenha sucesso.
Esta linha deve ser incluída tanto na configuração do servidor quanto na do cliente.

Opcionalmente, você pode incluir a linha "inactive", para especificar um tempo


máximo para as tentativas de reconexão. Se quiser que o cliente desista depois de uma
hora, por exemplo, inclua a linha:

inactive 3600

O parâmetro "comp-lzo" faz com que o OpenVPN passe a compactar os dados


transmitidos através do túnel (é necessário que o pacote "lzo" esteja instalado). O
algoritmo usado pelo OpenVPN é bastante leve, por isso o uso adicional de
processamento, tanto no servidor quando nos clientes é pequeno. A compressão dos
dados não faz milagres, mas é uma boa forma de melhorar o desempenho da VPN ao
utilizar links lentos ou congestionados. Esta é outra opção que deve ser incluída tanto no
servidor quanto nos clientes para que seja usada:

comp-lzo

Outras duas opções, úteis para tornar a VPN mais confiável e mais resistente a
problemas de conectividade, são a "persistkey" e a "persisttun". Elas fazem com que o
daemon mantenha a interface tun aberta e as chaves carregadas quando é reiniciado
(quando a VPN é restabelecida depois de uma queda de conexão, por exemplo), o que
torna mais rápida a restauração do link e evita problemas diversos:

persistkey
persisttun

Outra opção útil ao utilizar conexões com IP dinâmico é a opção "float", que permite
que o túnel continue aberto mesmo que o endereço IP da outra máquina mude. Em
situações normais, a mudança de IP faria com que a conexão fosse encerrada e o túnel
fosse interrompido até que fosse reiniciado (seja manualmente ou seja pelo uso da
opção keepalive). A opção "float" torna o processo mais transparente, já que o
OpenVPN passa a monitorar as mudança de endereços, mantendo o túnel aberto
enquanto houver conexão entre as duas partes. Essa opção também deve ser incluída
tanto na configuração do servidor quanto na do cliente:

float

Temos aqui um exemplo mais incrementado de configuração do servidor, onde a porta


é especificada manualmente e são usados os parâmetros que acabamos de ver:

dev tun
proto udp
port 22222
keepalive 10 120
comp-lzo
persistkey
persisttun
float
ifconfig 10.0.0.1 10.0.0.2
secret static.key

A configuração no cliente é praticamente a mesma, com a adição da linha "remote", que


especifica o endereço do servidor e a mudança na linha "ifconfig", onde a ordem dos
endereços são trocados:

remote guiadohardware.no-ip.org
dev tun
proto udp
port 22222
keepalive 10 120
comp-lzo
persistkey
persisttun
float
ifconfig 10.0.0.2 10.0.0.1
secret static.key

Roteando pacotes através da VPN


Originalmente, o cliente terá acesso apenas ao próprio servidor. Para que ele tenha
acesso aos demais hosts da rede, é necessário realizar alguns passos adicionais.

O primeiro é ativar o roteamento de pacotes no servidor, de forma que ele passe a


encaminhar os pacotes recebidos do cliente para a interface de rede local. Mesmo que o
servidor possua uma única placa de rede, a VPN é vista pelo sistema como uma
interface separada, de forma que, do ponto de vista do sistema operacional, a VPN e a
rede local são duas placas de rede separadas.

O roteamento é feito usando dois comandos (executados no servidor):

# echo 1 > /proc/sys/net/ipv4/ip_forward


# iptables -t nat -s 10.0.0.2 -A POSTROUTING -o eth0 -j MASQUERADE

O primeiro ativa o roteamento de pacotes no Kernel e o segundo orienta o sistema a


encaminhar os pacotes recebidos a partir do endereço IP do cliente (10.0.0.2, no
exemplo) para a interface de rede local (eth0, no exemplo). Estes dois comandos
precisam ser adicionados em algum dos scripts de inicialização do sistema (como o
"/etc/rc.local) para que sejam executados a cada boot.
O próximo passo é executar o comando abaixo no cliente, de forma que ele passe a
consultar o servidor ao tentar acessar endereços dentro da faixa usada pela rede local:

# route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.0.0.1 dev tun0

Note que o comando especifica a faixa de endereços usada na rede local (192.168.1.0,
no exemplo), a máscara, o endereço IP do servidor do outro lado da VPN e a interface
virtual usada pela VPN (tun0).

A partir daí, o cliente conseguirá acessar outros micros da rede, montar


compartilhamentos ou até mesmo imprimir em impressoras compartilhadas. É
importante notar, entretanto, que se o cliente também estiver conectado a uma rede local
(acessando através de uma conexão compartilhada, por exemplo), ela deve utilizar uma
faixa diferente de endereços.

Configuração do OpenVPN no Windows


A configuração da versão Windows do OpenVPN é bastante similar à da versão Linux,
com exceção de alguns detalhes e algumas adaptações feitas devido às diferenças entre
os dois sistemas. Depois de baixar o pacote no http://opnvpn.se e instalar o programa,
acesse a opção "OpenVPN configuration file directory", dentro da pasta "OpenVPN"
que será criada no iniciar:

O atalho leva à pasta "config" dentro do diretório de instalação do programa, onde irão a
chave de encriptação e o arquivo de configuração, de forma similar à pasta
"/etc/openvpn" que temos no Linux.

Se você pretende usar a máquina Windows como servidor, pode usar a opção "Generate
a static OpenVPN key", usando o atalho dentro do menu iniciar. Isso gerará um arquivo
"key.txt" dentro do diretório de configuração, que precisa então ser copiado para o
cliente.
Se, por outro lado, você quer usar a máquina Windows para se conectar a um servidor
Linux, comece copiando o arquivo "static.key" do servidor para dentro da pasta de
configuração:

É necessário criar também um arquivo de configuração, com a extensão "ovpn" (usando


o bloco de notas), onde são especificadas as opções de configuração. O conteúdo do
arquivo é exatamente o mesmo que usaríamos em um cliente Linux:

Depois de copiar a chave e gerar o arquivo de configuração, clique com o botão direito
sobre ele e use a opção "Start OpenVPN on this config file" para ativar a VPN:

Isso abrirá uma janela do prompt do MS-DOS mostrando o progresso da conexão:


Assim como no Linux, a VPN aparece como uma nova interface de rede, que recebe o
endereço IP definido na configuração:

Depois de testar a conexão, é possível fazer com que ela seja inicializada
automaticamente ativando o serviço do OpenVPN, que passa então a monitorar o
diretório de configuração, carregando automaticamente os arquivos de configuração
colocados dentro dele, assim como no Linux.

Para isso, acesse o "Painel de Controle > Ferramentas Administrativas > Serviços" e
mude a configuração do "OpenVPN Service" de "Manual" para "Automático":

You might also like