Você está na página 1de 30

OpenVPN: Criando uma VPN bsica - Linux

PRXIMO: INSTALANDO O OPENVPN E CRIANDO UMA VPN BSICA

Introduo
Uma VPN (Virtual Private Network, ou rede virtual privada) , como o nome sugere, uma rede virtual, criada para interligar duas redes distantes, atravs da Internet. Usar uma VPN permite que voc compartilhe arquivos e use aplicativos de produtividade e de gerenciamento, como se todos os micros estivessem conectados mesma rede local. Voc pode at mesmo imprimir em impressoras da rede remota, da mesma forma que faria com uma impressora local. Antigamente, a nica forma de interligar redes em dois locais diferentes era usar linhas de frame-relay. Para quem no dessa poca, uma linha de frame-relay oferece um link dedicado de 64 kbits entre dois pontos (a matriz e a filial de uma empresa, por exemplo), com um custo mensal fixo. Voc pode combinar vrias linhas frame-relay em uma nica conexo, de acordo com a necessidade, o problema nesse caso o preo. Atualmente, existem outras opes de conexes dedicadas e de conexes de alta disponibilidade, oferecidas pelas operadoras, mas elas ficam fora do oramento da maioria das pequenas e mdias empresas. Usando uma VPN, voc pode obter todos os benefcios de ter uma conexo dedicada entre dois pontos usando conexes via ADSL ou cabo, que so muito mais baratas. Dependendo do volume de uso da rede, voc pode tanto utilizar a conexo que j tem quanto utilizar uma segunda conexo apenas para a VPN, evitando assim que o trfego prejudique a navegao dos usurios. Alm de interligar duas ou mais redes, a VPN pode (dependendo da configurao) ser acessada tambm por funcionrios trabalhando remotamente. Todos dados que trafegam atravs da VPN so encriptados, o que elimina o risco inerente transmisso via Internet. Naturalmente, nenhuma VPN pode ser considerada "100% segura", j que sempre existe um pequeno risco de algum conseguir obter acesso aos servidores, de forma a roubar as chaves de encriptao (por exemplo), mas, em uma VPN bem configurada, o risco realmente muito pequeno. muito mais provvel que um funcionrio descontente sabote a rede interna, ou envie informaes sigilosas para fora, do que algum invasor consiga efetivamente obter acesso rede via Internet. Nesse tpico, estudaremos como criar VPNs usando o OpenVPN. Alm de ser mais simples de configurar que a maioria das outras solues de VPN e ser bastante seguro e flexvel, ele possui verses Linux e Windows, o que permite criar tneis interligando mquinas rodando os dois sistemas sem grandes dificuldades. Outras vantagens so que ele pode ser usado por clientes conectando atravs de uma conexo compartilhada via NAT(apenas o servidor precisa de portas abertas) e a boa tolerncia contra conexes ruins, ou ao uso de conexes com IP dinmico. A VPN pode ser configurada para ser restabelecida de forma automtica em caso de interrupo na conexo, o que torna o link bastante confivel. Com relao segurana, o OpenVPN pode ser configurado para utilizar chaves estticas, que oferecem um nvel mediano de segurana, em troca de uma configurao mais simples, ou para utilizar certificados X509, onde a configurao um pouco mais complexa, mas, em compensao, a segurana muito maior (bem superior da maioria das solues comerciais). Isso permite que voc escolha a melhor relao entre praticidade e segurana de acordo com a situao.

Instalando o OpenVPN e criando uma VPN bsica


O primeiro passo instalar o OpenVPN, tanto no cliente quanto no servidor. Nas distribuies derivadas do Debian voc pode instal-lo rapidamente via apt-get:

# apt-get install openvpn

No final da instalao, 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 seo de gerenciamento de pacotes, faa uma busca pelo pacote "openvpn". A busca resulta em dois resultados: "openvpn", que o pacote em que estamos interessados e "openvpn-devel", que contm o cdigo fonte. Basta selecionar o pacote e concluir a instalao. No Fedora, a instalao pode ser feita usando o yum. Ele se encarregar de instalar tambm os pacotes "openssl" e "lzo", que contm as bibliotecas usadas pelo OpenVPN para encriptar e compactar o trfego da rede:

# yum install openvpn


No CentOS, necessrio adicionar o repositrio do RPMForge j que (at o CentOS 5.1), o pacote OpenVPN no faz parte dos repositrios oficiais. Voc pode adicionar o repositrio seguindo as instrues disponveis aqui: http://wiki.centos.org/Repositories/RPMForge. O primeiro passo instalar a chave GPG do repositrio:

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


Com a chave instalada, baixe o pacote RPM do repositrio. Este pacote instala o arquivo com a configurao do repositrio dentro da pasta "/etc/yum/repos.d". Verifique o link do pacote para a verso do CentOS que est utilizando na pgina com as instrues. No caso do CentOS 5.1, verso 32 bits, por exemplo, o pacote o "rpmforgerelease-0.3.6-1.el5.rf.i386.rpm". Se voc est fazendo a configurao 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 tambm se encarrega de instalar as dependncias:

# urpmi openvpn
Se voc estiver utilizando uma distribuio que no inclua o pacote nos repositrios, ou se a verso disponvel for muito antiga, voc pode tambm instalar a partir do pacote com o cdigo fonte, disponvel no: http://openvpn.net/index.php/downloads.html Depois de instalar o pacote, o prximo passo carregar o mdulo "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 tnel.

# modprobe tun
Adicione a linha "tun" no final do arquivo "/etc/modules" para que o mdulo passe a ser carregado automaticamente durante o boot:

# echo tun >> /etc/modules

Estes trs passos, ou seja, a instalao do OpenVPN, o carregamento do mdulo e a adio da linha no final do arquivo devem ser executados tanto no servidor quanto nos clientes. Depois de concluda a instalao, voc pode criar um tnel simples, no encriptado, usando os comandos abaixo. Este tnel no pode ser considerado uma "VPN" j que no seguro, mas serve como um "hello word" dentro da configurao do OpenVPN. Presumindo que as duas mquinas estejam ligadas em rede e que no exista nenhum firewall no caminho, use o comando abaixo no cliente, especificando o endereo do servidor:

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


Faa o mesmo no servidor, especificando agora o endereo 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 endereo "10.0.0.1":

No exemplo, o servidor recebe o endereo "10.0.0.2". Voc pode testar a conectividade usando o ping ou qualquer outra ferramenta:

Como comentei, o OpenVPN possui tambm uma verso Windows, que est disponvel no http://openvpn.se. Esta verso inclui um instalador grfico e funciona em todas as verses do Windows a partir do Windows 2000. Ela inclui tambm o driver tun/tap, que instalado automaticamente, voc precisa apenas prestar ateno nas mensagens de instalao. Em um certo ponto, ser exibida uma mensagem avisando que o driver TAP/Win32 no passou pelo processo de certificao de compatibilidade com o Windows. Responda "Continuar assim mesmo" para efetuar a instalao, do contrrio o OpenVPN no funcionar.

O processo de certificao 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 no est ao alcance de projetos independentes, como o OpenVPN, da a exibio da mensagem. De qualquer forma, isso no significa que o software seja instvel ou inseguro, muito pelo contrrio. Se a certificao da Microsoft fosse um indicador de qualidade, softwares como o IIS e o IE no teriam tantas falhas e brechas de segurana.

Criando VPNs usando chaves estticas


A forma mais simples de configurar o OpenVPN utilizar chaves estticas, onde um arquivo contendo um algoritmo de encriptao usado pelas duas partes para encriptar os dados transmitidos atravs da VPN. Nesse modo, voc gera uma arquivo de texto no servidor, contendo a chave de encriptao e precisa apenas copi-la para o cliente e fazer uma configurao rpida para criar a VPN. Se voc quer apenas criar uma VPN domstica, ou criar uma VPN temporria entre duas redes, esta a configurao recomendada. O grande problema em utilizar uma chave esttica que, como o nome sugere, a mesma chave utilizada sesso aps sesso, sem nunca mudar. Com isso, existe uma pequena possibilidade de um atacante obstinado conseguir quebrar a VPN usando um ataque de fora bruta. Como a chave um arquivo de texto, que armazenado tanto no cliente quanto no servidor, existe tambm a possibilidade de algum conseguir copi-lo, caso tenha acesso fsico a uma das mquinas. Outra limitao que usando uma chave esttica o servidor suportar a conexo de um nico cliente por VPN. Para VPNs com vrios clientes, ou em redes empresariais, onde a segurana prioridade, recomendvel utilizar uma estrutura baseada em certificados X509, como veremos no tpico seguinte. Vamos ento configurao de nossa primeira VPN. Para este exerccio inicial, recomendo que utilize duas mquinas da rede local, que no tenham firewall ativo. Depois de entender melhor como o sistema funciona, passaremos para uma configurao mais elaborada. O primeiro passo gerar o arquivo com a chave, no servidor. O arquivo deve ser gerado dentro do diretrio "/etc/openvpn" (o diretrio padro de configurao), de forma que acessamos o diretrio antes de executar o comando que gera a chave:

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


Isso gerar o arquivo "static.key", que contm a chave de encriptao que ser usada para criar a conexo. Ele um arquivo de texto simples, que contm 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 tambm um pendrive, ou outra mdia de uso local, mas no recomendvel envi-lo por meios no seguros (e-mail por exemplo), j que qualquer um que tenha acesso ao arquivo poder se conectar sua VPN ou desencriptar todo o trfego transmitido atravs 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 cpia, 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 mquinas, falta criar os arquivos de configurao que sero 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 extenso ".conf" O arquivo "/etc/openvpn/server.conf", no servidor, fica com o seguinte contedo:

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 endereos que sero usados pelas interfaces virtuais da VPN, no servidor e no cliente. No exemplo, o servidor utilizar o endereo "10.0.0.1" e o cliente o endereo "10.0.0.2". Voc pode utilizar outros endereos se preferir. O importante que os endereos utilizados na VPN devem ser sempre diferentes dos endereos usados na rede local. A linha "secret static.key" especifica o arquivo com a chave de encriptao, que criamos no passo anterior. No esquea 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 endereo IP do servidor. No exemplo, estou utilizando um endereo de rede local, j que estamos apenas testando a VPN, mas, em um exemplo real de uso, voc utilizaria o endereo IP de Internet do servidor ou (ao utilizar uma conexo com IP dinmico) um domnio virtual utilizado por ele. Se voc ainda no tem um, acesse o no-ip.com ou o dyndns.org e faa o registro. Com os arquivos de configurao criados, inicializar a VPN incrivelmente simples. Voc precisa apenas reiniciar o servio "openvpn" tanto no cliente quanto no servidor, usando o comando:

# /etc/init.d/openvpn restart
Ao ser iniciado, o servio procura por arquivos ".conf" dentro do diretrio "/etc/openvpn" e inicia as VPNs configuradas automaticamente (desde que o servio esteja configurado para subir durante o boot, o que feito por padro na maioria das distribuies). Isso no apenas simplifica a configurao, mas faz com que a VPN passe a ser automaticamente restabelecida a cada boot. Para desativ-la, basta parar o servio:

# /etc/init.d/openvpn stop
Voc pode, tambm, ativar o OpenVPN manualmente, usando (como root) o comando:

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


(onde o "client.conf" o arquivo de configurao que ser usado) Este comando manual permite acompanhar as mensagens de inicializao e de conexo, o que ajuda a descobrir o que est errado em casos em que a VPN no funciona, embora a configurao parea 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 usurio possa se conectar VPN apenas quando precisar. Outra opo instalar o kvpnc (http://home.gna.org/kvpnc/), um cliente grfico 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 endereo IP "10.0.0.2", que funciona como um link ponto-a-ponto com a interface "tun0" do servidor, que recebe o endereo "10.0.0.1":

Teste a conexo usando o ping, ou acessando algum servio disponvel no servidor, como em:

# ssh 10.0.0.1
Depois do teste inicial, voc pode fazer um teste realizando a conexo via Internet (voc pode usar uma conexo discada ou outra conexo temporria no cliente para fazer o teste). Para isso, voc vai precisar apenas alterar a configurao no cliente, adicionando o endereo 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


No se esquea de reiniciar o OpenVPN para que a alterao entre em vigor:

# /etc/init.d/openvpn restart

Configurao das portas no OpenVPN


Diferente de outras solues de VPN, o OpenVPN utiliza uma nica porta de entrada, mesmo que sejam utilizadas vrias VPNs simultaneamente. Isso facilita bastante a configurao do firewall ou do roteamento de portas no servidor. No OpenVPN 2.x utilizada por padro a porta 1194 UDP, que deve estar aberta no firewall do servidor (verses antigas, anteriores 2.0-beta16 utilizavam a porta 5000 UDP). Se o servidor acessa atravs de uma conexo compartilhada, necessrio configurar o gateway da rede (ou o modem ADSL) para encaminhar a porta para ele. Como de praxe, possvel alterar a porta padro usada pelo OpenVPN, desde que voc especifique a nova porta tanto na configurao do servidor quanto do cliente. Para isso, usamos a opo "proto udp", seguida pela porta desejada, que deve ser includa tanto na configurao do servidor quanto na do cliente, como em:

proto udp port 22222


possvel, tambm, usar uma porta TCP. Nesse caso, usamos a opo "proto tcp-server" na configurao do servidor (/etc/openvpn/server.conf) e a opo "proto tcp-client" na configurao 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 so transmitidos diretamente, sem nenhum overhead, o que garante o melhor desempenho. No UDP no existe correo de erros nem retransmisso de pacotes perdidos, mas isso no um problema no caso do OpenVPN, pois ele o responsvel apenas pela criao 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 prprio OpenVPN obrigado a fazer a checagem e a retransmisso de pacotes, respeitando o modo de funcionamento do protocolo. Isso aumenta bastante a latncia da conexo e faz com que cada vez que um pacote perdido, o OpenVPN precise parar a transmisso de todos os pacotes subsequentes at que a retransmisso 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 recomendvel utilizar uma porta UDP sempre que possvel.

Estabilizando e otimizando a conexo


Usando a configurao simplificada do exemplo anterior, voc notar que a VPN no ser muito estvel, pois qualquer interrupo na comunicao entre as duas mquinas derrubar o link, at que voc reinicie o servio do OpenVPN (no cliente), forando a reconexo, como em:

# /etc/init.d/openvpn restart
Vamos ento a um conjunto de parmetros de configurao que permitem estabilizar a VPN, fazendo com que o OpenVPN passe a monitorar a conexo e restabelec-la automaticamente sempre que necessrio. O primeiro, e mais importante, o parmetro "keepalive", que faz com que o servidor e o cliente monitorem a conexo, enviando pings peridicos um para o outro, e reiniciem a VPN automaticamente caso no recebam resposta dentro de um perodo determinado. Esta opo especialmente importante em VPNs usadas atravs de links ADSL ou qualquer outro tipo de conexo que no seja completamente estvel. Um exemplo de uso seria:

keepalive 10 120
O primeiro nmero 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 includa tanto na configurao do servidor quanto na do cliente. Opcionalmente, voc pode incluir a linha "inactive", para especificar um tempo mximo para as tentativas de reconexo. Se quiser que o cliente desista depois de uma hora, por exemplo, inclua a linha:

inactive 3600
O parmetro "comp-lzo" faz com que o OpenVPN passe a compactar os dados transmitidos atravs do tnel ( necessrio 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 compresso dos dados no faz milagres, mas uma boa forma de melhorar o desempenho da VPN ao utilizar links lentos ou congestionados. Esta outra opo que deve ser includa tanto no servidor quanto nos clientes para que seja usada:

comp-lzo
Outras duas opes, teis para tornar a VPN mais confivel e mais resistente a problemas de conectividade, so 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 conexo, por exemplo), o que torna mais rpida a restaurao do link e evita problemas diversos:

persistkey persisttun
Outra opo til ao utilizar conexes com IP dinmico a opo "float", que permite que o tnel continue aberto mesmo que o endereo IP da outra mquina mude. Em situaes normais, a mudana de IP faria com que a conexo fosse encerrada e o tnel fosse interrompido at que fosse reiniciado (seja manualmente ou seja pelo uso da opo keepalive). A opo "float" torna o processo mais transparente, j que o OpenVPN passa a monitorar as mudana de endereos, mantendo o tnel aberto enquanto houver conexo entre as duas partes. Essa opo tambm deve ser includa tanto na configurao do servidor quanto na do cliente:

float
Temos aqui um exemplo mais incrementado de configurao do servidor, onde a porta especificada manualmente e so usados os parmetros 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 configurao no cliente praticamente a mesma, com a adio da linha "remote", que especifica o endereo do servidor e a mudana na linha "ifconfig", onde a ordem dos endereos so 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 atravs da VPN


Originalmente, o cliente ter acesso apenas ao prprio servidor. Para que ele tenha acesso aos demais hosts da rede, necessrio 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 so 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 endereo 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 inicializao do sistema (como o "/etc/rc.local) para que sejam executados a cada boot. O prximo passo executar o comando abaixo no cliente, de forma que ele passe a consultar o servidor ao tentar acessar endereos 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 endereos usada na rede local (192.168.1.0, no exemplo), a mscara, o endereo 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 tambm estiver conectado a uma rede local (acessando atravs de uma conexo compartilhada, por exemplo), ela deve utilizar uma faixa diferente de endereos.

Configurao do OpenVPN no Windows


A configurao da verso Windows do OpenVPN bastante similar da verso Linux, com exceo de alguns detalhes e algumas adaptaes feitas devido s diferenas entre os dois sistemas. Depois de baixar o pacote no http://opnvpn.se e instalar o programa, acesse a opo "OpenVPN configuration file directory", dentro da pasta "OpenVPN" que ser criada no iniciar:

O atalho leva pasta "config" dentro do diretrio de instalao do programa, onde iro a chave de encriptao e o arquivo de configurao, de forma similar pasta "/etc/openvpn" que temos no Linux. Se voc pretende usar a mquina Windows como servidor, pode usar a opo "Generate a static OpenVPN key", usando o atalho dentro do menu iniciar. Isso gerar um arquivo "key.txt" dentro do diretrio de configurao, que precisa ento ser copiado para o cliente. Se, por outro lado, voc quer usar a mquina Windows para se conectar a um servidor Linux, comece copiando o arquivo "static.key" do servidor para dentro da pasta de configurao:

necessrio criar tambm um arquivo de configurao, com a extenso "ovpn" (usando o bloco de notas), onde so especificadas as opes de configurao. O contedo do arquivo exatamente o mesmo que usaramos em um cliente Linux:

Depois de copiar a chave e gerar o arquivo de configurao, clique com o boto direito sobre ele e use a opo "Start OpenVPN on this config file" para ativar a VPN:

Isso abrir uma janela do prompt do MS-DOS mostrando o progresso da conexo:

Assim como no Linux, a VPN aparece como uma nova interface de rede, que recebe o endereo IP definido na configurao:

Depois de testar a conexo, possvel fazer com que ela seja inicializada automaticamente ativando o servio do OpenVPN, que passa ento a monitorar o diretrio de configurao, carregando automaticamente os arquivos de configurao colocados dentro dele, assim como no Linux. Para isso, acesse o "Painel de Controle > Ferramentas Administrativas > Servios" e mude a configurao do "OpenVPN Service" de "Manual" para "Automtico":

OpenVPN avanado: Certificados e bridges


Usar chaves estticas permite criar VPNs rapidamente, interligando duas mquinas. A facilidade de configurao faz com que esta modalidade seja a mais utilizada, embora as limitaes sejam claras. Vamos agora criar uma configurao mais elaborada, utilizando certificados X509. Este mtodo chamado de PKI (Public Key Infraestructure) e permite criar VPNs mais complexas, envolvendo vrios servidores e vrios clientes, alm de oferecer uma maior segurana. Para isso, criaremos uma "entidade certificadora", que ser usada para gerar os certificados usados pelo servidor e pelos clientes. Falar em uma "entidade certificadora" d a impresso de que precisaremos contratar uma empresa especializada para gerar os certificados, mas, na verdade, tudo feito internamente, usando scripts fornecidos junto com o OpenVPN. Durante o processo, gerado um certificado mestre (um arquivo, que pode ser tanto armazenado pelo prprio servidor quanto por outra mquina da rede) que usado para gerar os certificados usados pelas mquinas. O uso dos certificados permite que o servidor verifique a identidade dos clientes e tambm que os clientes verifiquem a identidade do servidor, evitando a possibilidade do uso de ataques "man-in-the-middle", onde algum substitui o servidor por outra mquina, configurada para capturar as credenciais dos clientes quando eles tentam estabelecer a conexo. Os certificados podem ser criados rapidamente, conforme for necessrio conectar mais mquinas VPN. Quando necessrio bloquear o acesso a uma determinada mquina (um funcionrio que se desligou da empresa, por exemplo), basta revogar o certificado para que o servidor deixe de aceitar a conexo.

Criando certificados X509


Para criar os certificados, utilizaremos o easy-rsa, um conjunto de scripts includos no pacote do OpenVPN. Na maioria das distribuies, os scripts esto disponveis dentro da pasta "/usr/share/doc/openvpn/examples/easy-rsa". Se a pasta no existir na sua instalao, use os comandos abaixo para localiz-la:

# updatedb # locate easy-rsa

Duas localizaes comuns so as pastas "/usr/share/doc/packages/openvpn/easy-rsa" e "/usr/share/doc/openvpn2.0/easy-rsa". No Fedora, especificamente, usada a pasta "/usr/share/openvpn/easyrsa" e, no CentOS, usada a pasta "/usr/share/doc/openvpn-2.0.9/easy-rsa/" (onde o 2.0.9 a verso do pacote, que muda de acordo com a verso do CentOS usada). O primeiro passo copiar todo o diretrio para dentro da pasta "/etc/openvpn" (voc pode usar outro diretrio se preferir). Isso evita que nossa configurao seja apagada ao atualizar o pacote do OpenVPN no futuro. No Debian, o comando seria:

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

No Fedora, onde a localizao da pasta diferente, o comando muda para:

# cp -a /usr/share/openvpn/easyrsa /etc/openvpn/

Isso criar o diretrio "/etc/openvpn/easy-rsa", contendo os seguintes arquivos:

2.0 build-key build-req make-crl revoke-full build-ca build-key-pass build-req-pass openssl.cnf sign-req build-dh build-key-pkcs12 clean-all README.gz vars build-inter build-key-server list-crl revoke-crt

Em outras distribuies, basta verificar qual a pasta onde esto os exemplos e ajustar o comando de acordo. A partir da, toda a configurao ser feita dentro do novo diretrio:

# cd /etc/openvpn/easy-rsa

Comece editando o arquivo "vars", usando seu editor de textos preferido:

# joe vars

No final do arquivo, voc encontra um conjunto de parmetros usados para gerar as chaves (pas, estado, cidade, empresa, etc.), que devem ser editados, como em:

export export export export export

KEY_COUNTRY=BR KEY_PROVINCE=SP KEY_CITY="Guarulhos" KEY_ORG="GDH" KEY_EMAIL="morimoto@guiadohardware.net"

Em seguida, usamos o comando "source" para carregar as variveis contidas dentro do arquivo "vars" e, em seguida, executamos os scripts "clean-all" e "build-ca". O primeiro script limpa qualquer sobra de configurao anterior, enquanto o segundo gera o certificado raiz, usando o openssl. Como os scripts esto dentro do diretrio atual, usamos o "./" ao execut-los:

# source vars # ./clean-all # ./build-ca

Generating a 1024 bit RSA private key ...................++++++ .....................++++++ writing new private key to 'ca.key' ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [BR]: State or Province Name (full name) [SP]: Locality Name (eg, city) [Guarulhos]: Organization Name (eg, company) [GDH]:

Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address [morimoto@guiadohardware.net]:

Isso criar a pasta "/etc/openvpn/easy-rsa/keys/", contendo os seguintes arquivos:

ca.crt ca.key index.txt serial

O arquivo "ca.crt" contm o certificado raiz. Ele jamais deve sair do servidor, j que qualquer um que tenha acesso a ele poder gerar certificados adicionais que, essencialmente, permitiro que qualquer um se conecte VPN. A necessidade de manter esse arquivo secreto faz com que alguns administradores prefiram gerar as chaves em uma mquina desconectada da rede (apenas com acesso local) e copiar manualmente os certificados gerados para o servidor e as demais mquinas. Depois de criar o certificado raiz, podemos passar para o para o passo seguinte, que gerar os certificados para o servidor e para os clientes. Para gerar o certificado do servidor, usamos o script "build-key-server", especificando como parmetro o nome do arquivo que ser gerado ("servidor" no exemplo). O nome apenas para identificao dos hosts, voc pode usar os nomes que preferir:

# cd /etc/openvpn/easy-rsa/ # ./build-key-server servidor

Ele comea confirmando as informaes que sero includas no certificado (pas, cidade, empresa, etc.), da mesma forma que ao rodar o build-ca. Em um certo ponto, ele perguntar pelo atributo "Common Name", onde voc deve fornecer o nome do servidor, como em:

Common Name (eg, your name or your server's hostname) []:Etch

Em seguida, ele oferece a opo de incluir um "challenge password", uma senha que ser solicitada cada vez que o certificado for usado. Ela aumenta a segurana, mas, em compensao, reduz bastante a praticidade, j que voc precisar digitar a senha cada vez que o certificado for utilizado, o que pode se tornar incrivelmente inconveniente em um servidor administrado remotamente. Se quiser manter as coisas simples, deixe o campo em branco:

A challenge password []:

Antes de terminar, ele confirma se voc deseja assinar o certificado e pede mais uma confirmao antes de aplicar a alterao. Responda "y" em ambas, caso contrrio a gerao do certificado abortada:

Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y

Em seguida, geramos as chaves que sero usadas pelos clientes, usando o script "build-key". Voc pode gerar chaves para vrios clientes em seqncia, especificando nomes diferentes, como em:

# ./build-key cliente1 # ./build-key cliente2

Cada vez que o comando executado, o script mostra a sada do comando do openssl usado para gerar a chave e confirma os parmetros do certificado, como ao rodar o "build-key-server":

Generating a 1024 bit RSA private key .++++++ .......................++++++ writing new private key to 'cliente1.key'

Se ao executar o comando "./build-key nome" ele simplesmente for executado instantaneamente, sem exibir o indicador ou qualquer mensagem de erro, sinal de que alguma coisa est errada, provavelmente com a atribuio das variveis usada pelo script. Nesse caso, experimente rodar novamente o comando "source vars" e executar o script novamente, como em:

# source vars # ./build-key cliente1

No se esquea de preencher a opo "commonName" com o nome da mquina (ou outro nome definido por voc, diferente em cada chave). Deixando o campo em branco a chave no gerada. No final do processo, no esquea de responder as perguntas "Sign the certificate?" e "1 out of 1 certificate requests certified, commit?" com o valor "y".

Common Name (eg, your name or your server's hostname) []:cliente1 ... Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y

Diferente do "build-key-server", ele no oferece a opo de proteger a chave usando uma senha. Se voc quiser que os usurios precisem digitar uma senha antes de poderem efetuar a conexo usando o certificado, gere as chaves usando o script "build-key-pass" em vez do "build-key". Ele confirma todos os parmetros (assim como o build-key-server) e oferece a opo incluir a senha:

# ./build-key-pass cliente2

Em seguida, usamos o script "build-dh" (sem parmetros). Ele gera os parmetros Diffie Hellman, que reforam a segurana, permitindo que o servidor e os clientes troquem as chaves (de forma segura) no momento da conexo, confirmando suas identidades:

# ./build-dh

Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time ....................................+...........+...............

O comando demora quase um minuto para gerar os parmetros, mostrando um indicador de progresso durante o processo. Em caso de problemas, certifique-se de que est rodando os comandos a partir do diretrio "/etc/openvpn/easy-rsa", rode o comando "source vars" para carregar as variveis e tente novamente. O processo de gerao das chaves gera um conjunto de arquivos ".csr". Estes arquivos correspondem s requisies para a assinatura das chaves, que so feitas durante o processo de criao. Eles podem ser removidos no final do processo:

# rm *.csr

Voc ficar, ento, com um conjunto de arquivos similar a esse dentro do diretrio "/etc/openvpn/easy-rsa/keys":

ca.crt cliente1.key cliente2.key index.txt servidor.crt ca.key cliente2.crt cliente3.crt index.txt.attr servidor.key cliente1.crt cliente2.csr cliente3.key serial

Caso esteja curioso, estes scripts nada mais fazem do que executar os comandos correspondentes do OpenSSL, usando os parmetros definidos no arquivo "vars". O script "build-key", por exemplo, executa os comandos:

cd $KEY_DIR && openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr -config $KEY_CONFIG && openssl ca -days 3650 -out $1.crt -in $1.csr -config $KEY_CONFIG && chmod 0600 $1.key

Note que usado o parmetro "-days 3650", que faz com que as chaves tenham validade de 10 anos. Se a sua VPN ainda estiver em uso at l, no se esquea de trocar as chaves antes do 3650 dia, caso contrrio sua VPN parar de funcionar aps completar o dcimo aniversrio. :)

Instalando os certificados
Falta agora fazer a instalao das chaves, tanto no servidor quanto nos clientes. Para o servidor, crie o diretrio "/etc/openvpn/keys" e copie para ele os arquivos "ca.crt", "servidor.crt" e "servidor.key", como em:

# cd /etc/openvpn/easy-rsa/keys # mkdir /etc/openvpn/keys # cp -a ca.crt servidor.crt servidor.key /etc/openvpn/keys/

Copie tambm o arquivo "dh1024.pem" (o nmero 1024 corresponde ao comprimento da chave e pode mudar de acordo com a configurao). Ele gerado ao rodar o script "build-dh" e importante, pois contm os parmetros Diffie Hellman:

# cp -a dh1024.pem /etc/openvpn/keys/

O passo final fazer a cpia dos certificados para os clientes, usando o SFTP ou outra ferramenta de transferncia de arquivos. Todos os clientes devem possuir o arquivo "ca.crt", o arquivo "dh1024.pem" e os arquivos .crt e .key correspondentes a ele. O cliente1 receberia os arquivos "ca.crt", "dh1024.pem", "cliente1.crt" e "cliente1.key"; o cliente2 receberia os arquivos "ca.crt", "dh1024.pem", "cliente2.crt" e "cliente2.key", e assim por diante. Em resumo, temos:

Arquivos na pasta "/etc/openvpn/keys" do servidor:

ca.crt, dh1024.pem, servidor.crt, servidor.key

Arquivos na pasta "/etc/openvpn/keys" do cliente:

ca.crt, dh1024.pem, cliente.crt, cliente.key

Nos clientes Linux, crie o diretrio "/etc/openvpn/keys" e copie os quatro arquivos para ele. Se eles estiverem com o servidor SSH ativo (e voc tiver a senha de root), pode fazer a cpia a partir do prprio servidor, usando o SFTP, como em:

# sftp root@192.168.1.21

Password:

sftp> sftp> sftp> sftp> sftp> sftp>

mkdir /etc/openvpn/keys cd /etc/openvpn/keys put ca.crt put dh1024.pem put cliente1.crt put cliente1.key

No caso dos clientes Windows, os quatro arquivos devem ser copiados para o diretrio "keys", dentro do diretrio de instalao do OpenVPN, como em "C:Arquivos de programasOpenVPNconfigkeys". Assim como no caso dos clientes Linux, necessrio criar o diretrio manualmente:

O uso de chaves torna necessrio que os relgios das mquinas estejam sincronizados. No Linux, voc pode acertar o relgio da mquina via web usando o comando:

# ntpdate -u pool.ntp.org

No Windows, marque a opo "Sincronizar automaticamente com um servidor de horrio na Internet", disponvel no Painel de Controle > Data e hora > Horrio na Internet".

Ajustando a configurao e roteando pacotes


A parte mais complicada em usar certificados a configurao inicial, que acabamos de fazer. Uma vez que os certificados j esto criados e instalados nos clientes, tudo fica mais simples. Vamos comear com uma configurao bsica, similar VPN que criamos inicialmente utilizando chaves estticas. Nesse exemplo, estou utilizando o sistema tap (em vez do tun, como no exemplo anterior) e estou utilizando os certificados anteriormente criados. A diferena entre o tun e o tap que no tun o trfego da rede roteado (o que elimina os pacotes de broadcast), enquanto no tap tudo transmitido, incluindo pacotes de broadcast e pacotes de outros protocolos de rede (como o IPX/SPX). O arquivo "/etc/openvpn/server.conf" no servidor ficaria:

dev tap ifconfig 10.0.0.1 255.255.255.0 tls-server dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/servidor.crt key /etc/openvpn/keys/servidor.key

Veja que agora usamos a linha "tls-server" e especificamos a localizao dos 4 arquivos com os certificados que instalamos nos passos anteriores. A linha "ifconfig" especifica o endereo IP que ser usado pelo servidor, juntamente com a mscara de subrede. A configurao no arquivo "/etc/openvpn/client.conf" nos clientes ficaria:

remote guiadohardware.no-ip.org dev tap tls-client ifconfig 10.0.0.2 255.255.255.0 dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/cliente1.crt key /etc/openvpn/keys/cliente1.key

Note que o "ifconfig 10.0.0.1 255.255.255.0" na configurao do servidor e o "ifconfig 10.0.0.2 255.255.255.0" na configurao do cliente indicam os endereos que sero usados pelas interfaces de rede virtual. Eles no tem relao nenhuma com os endereos reais das mquinas. O nico local onde o endereo "real" do servidor especificado, na opo "remote", includa na configurao do cliente.

Criados os arquivos de configurao no servidor e no cliente, reinicie o servio em ambas as mquinas, para que o daemon leia a nova configurao e estabelea a conexo:

# /etc/init.d/openvpn restart

Se a VPN no funcionar, ou se voc receber um "Starting virtual private network daemon: client(FAILED)" ao reiniciar o servio, experimente ativar o OpenVPN manualmente (no cliente), usando o comando:

# openvpn --config client.conf

Isso faz com que ele exiba as mensagens geradas pelo programa durante a inicializao, o que pode ajud-lo a identificar o problema. Pode ser que ele no esteja conseguindo contactar o servidor no endereo especificado (ou o firewall pode estar bloqueando a porta especificada na configurao), pode existir algum erro na configurao, ou pode ter havido algum problema durante a gerao ou a cpia das chaves, por exemplo. Nos clientes Windows, a configurao quase idntica, mudando apenas as linhas com a localizao das chaves. Se voc as colocou dentro da pasta "keys", no diretrio de configurao, o arquivo "client.ovpn" ficaria como no screenshot a seguir:

Para permitir que vrios clientes se conectem simultaneamente VPN, necessrio fazer algumas mudanas na configurao. A principal delas que, em vez de especificar manualmente o endereo IP usado pelo servidor e pelo cliente usando o comando "ifconfig" como em "ifconfig 10.0.0.2 10.0.0.1" (que usamos nos exemplos onde foi utilizada a interface tun) ou "ifconfig 10.0.0.1 255.255.255.0" (usado no exemplo com o tap), passamos a especificar uma faixa de endereos IP para a VPN e deixamos que o servidor atribua endereos para os clientes conforme eles se conectam. Isso mais simples do que parece. Na configurao do servidor utilizaremos a linha "server" (deixando de usar a linha do ifconfig), especificando a faixa de endereos e a mscara, como em:

server 10.0.0.0 255.255.255.0

importante enfatizar que a faixa de endereos utilizada na VPN deve ser diferente da faixa de endereos utilizada na rede local qual o servidor est ligado, que, por sua vez, tambm deve ser diferente da faixa de endereos de rede local utilizada pelo cliente. Originalmente, o cliente tem acesso apenas ao prprio servidor. Para permitir que ele possa acessar os demais hosts da rede local, adicionamos uma linha adicional, que faz com que o servidor inclua uma regra de roteamento na configurao do cliente, no momento da conexo. Ela especifica a faixa de endereos e a mscara usada na rede local:

push "route 192.168.1.0 255.255.255.0"

Com a regra, o cliente passar a usar o endereo IP do servidor na VPN como rota padro para os pacotes destinados faixa de endereos especificada. Essa linha substitui o comando "route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.0.0.1 dev tun0" (executado no cliente) que usamos no tpico sobre VPNs com chaves estticas.

Na configurao do cliente, adicionamos a linha "pull" (push = empurrar, pull = puxar), para que ele aceite as configuraes fornecidas pelo servidor. Com isso, o cliente recebe automaticamente um endereo aleatrio dentro da faixa "10.0.0.x", sem que voc precise especificar a configurao de cada um manualmente:

pull

Temos aqui um exemplo de configurao completa do servidor, utilizando a interface tun, especificando uma porta UDP alternativa e utilizando as novas opes:

proto udp port 22222 dev tun server 10.0.0.0 255.255.255.0 push "route 192.168.1.0 255.255.255.0" tls-server dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/servidor.crt key /etc/openvpn/keys/servidor.key

A configurao correspondente para o cliente seria:

remote guiadohardware.no-ip.org proto udp port 22222 client pull dev tun tls-client dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/cliente1.crt key /etc/openvpn/keys/cliente1.key

Com essa configurao, o servidor passa a ser capaz de receber conexes a partir de vrios clientes simultaneamente. O OpenVPN capaz de gerenciar todas as conexes utilizando a mesma porta. Para adicionar um novo cliente VPN, voc precisaria apenas gerar um novo certificado, usando o comando "./build-key" e copiar os quatro arquivos para dentro da pasta "/etc/openvpn/keys" (alm de instalar o OpenVPN, naturalmente). Em resumo, os comandos para gerar um novo certificado so:

# cd /etc/openvpn/easy-rsa/ # source vars # ./build-key novocliente

A configurao a mesma que foi usada para o primeiro cliente, mudando apenas os arquivos dos certificados. Com isso, cada cliente recebe um endereo diferente dentro da faixa "10.0.0.x" e pode acessar o servidor atravs do endereo "10.0.0.1".

necessrio tambm ativar, no servidor, a regra de firewall que roteia os pacotes provenientes dos clientes da VPN para a interface de rede local. Como agora estamos utilizando endereos atribudos automaticamente, e no mais endereos estticos, especificamos a faixa de endereos, em vez de especificar diretamente o endereo usado pelo cliente:

# echo 1 > /proc/sys/net/ipv4/ip_forward # iptables -t nat -s 10.0.0.0/24 -A POSTROUTING -o eth0 -j MASQUERADE

Estes dois comandos precisam ser executados pelo servidor a cada boot. Voc pode inclu-los no seu script de firewall, ou em algum dos scripts de inicializao do sistema. Uma opo til ao usar vrios clientes a opo "ifconfig-pool-persist". Ela faz com que o OpenVPN passe a armazenar uma lista com os endereos IP usados por cada cliente da VPN e faa o possvel para atribuir sempre os mesmos endereos em futuras conexes. Isso no impede que os endereos mudem, mas torna as mudanas muito menos freqentes. Esta opo includa apenas na configurao do servidor, especificando um arquivo de texto onde a lista ser salva, como em:

ifconfig-pool-persist /etc/openvpn/ipp.txt

O arquivo criado e atualizado automaticamente pelo OpenVPN. A nica exigncia que ele deve ser criado dentro do diretrio "/etc/openvpn", ou outra pasta qual o usurio "openvpn" (usado pelo daemon) tenha acesso. Uma opo que aumenta a segurana dos clientes a "remote-cert-tls server", que faz com que os clientes verifiquem o certificado do servidor no momento da conexo. Ela mais uma opo destinada a proteger os clientes contra ataques man-in-the-middle. Esta opo adicionada apenas na configurao dos clientes:

remote-cert-tls server

Uma observao importante que esta opo suportada apenas pelo OpenVPN verso 2.1 (final) em diante. Se o cliente usar uma verso anterior (como o OpenVPN 2.1_rc4, usado no Debian Etch), a opo muda para "ns-cert-type server":

ns-cert-type server

Voc pode verificar qual a verso do OpenVPN usada, e assim descobrir qual das duas opes deve ser utilizada, usando o comando:

# openvpn --version

Usar a opo "remote-cert-tls server" em um cliente com uma verso antiga do OpenVPN faz com que o servio simplesmente deixe de funcionar, at que voc a substitua pela "ns-cert-type server". Outro problema comum com relao ao uso da banda pelos usurios da VPN. Se uma nica conexo web dividida entre o uso da VPN e o acesso web, voc vai provavelmente querer restringir o uso de banda da VPN, para evitar que cpias de grandes arquivos e outras atividades que envolvam grande uso de banda saturem a conexo. Isso feito usando a opo "shaper", que limita a banda total de sada usada pela VPN a um determinado volume de trfego. Se voc usa um link ADSL com 512 kbits (ou seja, 64 kbytes) de upload, voc poderia restringir o uso de banda pela VPN a 50 kbytes, por exemplo, de forma a deixar pelo menos uma pequena poro da banda reservada para outros usos.

A opo "shaper" pode ser includa na configurao do servidor (para que seja aplicada ao trfego de sada somado de todos os clientes conectados a ele), na configurao dos clientes (limitando assim o trfego de sada permitido por cada um) ou em ambos. Basta especificar o limite desejado, em bytes, como em:

shaper 51200

Voc pode tambm limitar o nmero de clientes simultneos que sero aceitos pelo servidor usando a opo "maxclients", especificando o nmero de clientes desejados, como em:

max-clients 10

Uma ltima opo, que pode ser usada para proteger sua VPN contra ataques DoS e oferecer uma camada adicional de segurana a opo "tls-auth". Com ela, uma chave compartilhada usada para criar uma segunda camada de encriptao sobre os pacotes j encriptados usando os certificados. O servidor s aceita pedidos de conexo encriptados com a chave compartilhada, o que faz com que pedidos de conexo de pessoas no autorizadas (que no tero a chave) sequer sejam processados. Para utilizar a opo, necessrio criar uma chave esttica, usando o comando "openvpn --genkey --secret", o mesmo que utilizamos no inicio para gerar a chave esttica usada na nossa VPN inicial. Este arquivo pode ser armazenado no diretrio "/etc/openvpn/keys", junto com os arquivos dos certificados:

# cd /etc/openvpn/keys # openvpn --genkey --secret chave.key

O arquivo gerado deve ser ento copiado para todos os clientes. O prximo passo adicionar a opo, tanto na configurao do servidor quanto na dos clientes, especificando a localizao do arquivo, como em:

tls-auth /etc/openvpn/keys/chave.key

Note que, nesse caso, a chave no permite acessar a VPN. Ela apenas um pr-requisito para poder enviar requisies de conexo para o servidor, ou seja, apenas uma acamada adicional de proteo. Alm dela, necessrio ter os 4 arquivos com o certificado e as chaves, como nos exemplos anteriores. Temos aqui um exemplo final de configurao para o servidor, utilizando todas as opes que vimos at aqui:

# /etc/openvpn/server.conf proto udp port 22222 dev tun server 10.0.0.0 255.255.255.0 push "route 192.168.1.0 255.255.255.0" comp-lzo keepalive 10 120 persistkey persisttun float ifconfig-pool-persist /etc/openvpn/ipp.txt max-clients 10 shaper 51200 tls-server

dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/servidor.crt key /etc/openvpn/keys/servidor.key tls-auth /etc/openvpn/static.key

Aqui vai o arquivo de configurao correspondente para os clientes:

# /etc/openvpn/client.conf remote guiadohardware.no-ip.org proto udp port 22222 client pull dev tun comp-lzo keepalive 10 120 persistkey persisttun float tls-client dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/cliente1.crt key /etc/openvpn/keys/cliente1.key tls-auth /etc/openvpn/static.key

Se voc j est com o servidor OpenVPN ativo, precisa apenas reiniciar o servio para que a nova configurao entre em vigor, como em:

# /etc/init.d/openvpn restart

ou:

# service openvpn restart

Se voc receber um "Starting virtual private network daemon: server(FAILED).", verifique todas as opes e cheque se os arquivos dos certificados foram gerados e copiados corretamente. Como comentei anteriormente, o contedo do arquivo de configurao nos clientes Windows exatamente o mesmo, mudando apenas as linhas com as localizaes dos arquivos com os certificados. No Windows, so usadas barras invertidas ao indicar a localizao de arquivos e isso se aplica tambm configurao do OpenVPN. Entretanto, as barras invertidas so tambm usadas como caracteres de escape no shell, por isso (por estranho que possa parecer), ao indicar localizaes de arquivos na configurao do OpenVPN no Windows voc deve duplicar todas as barras invertidas e colocar a localizao entre aspas, como em:

static "C:\Arquivos de programas\OpenVPN\keys\static.key"

Um ltimo truque que, em um servidor com vrias conexes, ou no caso de uma rede com vrios servidores de VPN (onde os clientes podem se conectar a qualquer um dos servidores para obter acesso rede), voc pode criar um sistema simples de redundncia e de balanceamento de carga especificando os endereos de todos os servidores na configurao dos clientes (criando vrias linhas "remote") e adicionando a opo "remote-random", como em:

remote guiadohardware.no-ip.org remote gdhn.com.br remote gdhpress.com.br remote-random

Isso faz com que o cliente escolha aleatoriamente entre os trs endereos especificados a cada conexo, tentando os outros dois caso o primeiro esteja inacessvel. Como cada cliente escolher um servidor diferente a cada conexo, a carga acabar sendo dividida igualmente entre os servidores.

Revogando certificados e bloqueando clientes


Uma parte importante do gerenciamento dos certificados no OpenVPN a revogao dos certificados que no devem mais ser utilizados. Imagine o caso de um notebook que foi roubado, por exemplo. Se os certificados no forem revogados, qualquer um em posse deles poder (a menos que voc inclua uma senha ao gerar os certificados) se conectar VPN e, a partir da, ter acesso rede interna da empresa. O processo de revogao dos certificados consiste em criar um arquivo contendo a lista dos certificados revogados e configurar o servidor para utiliz-lo. A partir da, no importa mais se os arquivos do certificado revogados sejam distribudos, j que eles no tero mais serventia alguma. Para criar a lista, acesse o diretrio "/etc/openvpn/easy-rsa" no servidor (ou na mquina que estiver usando para gerar os certificados) e carregue as variveis do arquivo "vars":

# cd /etc/openvpn/easy-rsa # source vars

Execute o comando "revoke-full", especificando o certificado que ser revogado, como em:

# ./revoke-full cliente1

Using configuration from /etc/openvpn/easy-rsa/openssl.cnf Revoking Certificate 08. Data Base Updated Using configuration from /etc/openvpn/easy-rsa/openssl.cnf cliente1.crt: /C=BR/ST=SP/O=GDH/CN=cliente1/emailAddress=foo@bar.com error 23 at 0 depth lookup:certificate revoked

A mensagem "error 23" indica que o certificado foi revogado com sucesso, ou seja, ela no exatamente uma mensagem de erro e sim uma confirmao. O comando gera o arquivo "crl.pem", dentro do diretrio "/etc/openvpn/easy-rsa/keys". O prximo passo copiar o arquivo para o diretrio "/etc/openvpn/keys" do servidor, a mesma pasta utilizada pelos arquivos com os certificados.

Para que ele passe a ser utilizado pelo OpenVPN, adicione o parmetro "crl-verify" na configurao do servidor, especificando a localizao do arquivo, como em:

crl-verify /etc/openvpn/keys/crl.pem

Para que a alterao entre em vigor, reinicie o OpenVPN:

# /etc/init.d/openvpn restart

Com isso, o cliente perde imediatamente o acesso VPN e passa a receber um erro "TLS Error: TLS handshake failed" ao tentar se conectar novamente. Para revogar mais chaves, repita o processo, no se esquecendo de copiar o arquivo atualizado para a pasta "/etc/openvpn/keys" do servidor a cada alterao. Se voc est gerando as chaves usando o prprio servidor, pode tambm especificar diretamente o arquivo na pasta "/etc/openvpn/easy-rsa/keys" na opo; assim voc elimina a necessidade de copiar manualmente o arquivo a cada alterao. Um exemplo de configurao seria:

crl-verify /etc/openvpn/easy-rsa/keys/crl.pem

Para que o OpenVPN leia o arquivo atualizado, use o parmetro "reload" do servio. Isso atualiza a configurao sem derrubar os clientes conectados:

# /etc/init.d/openvpn reload

Criando bridges no OpenVPN


A configurao que vimos at agora faz com que o trfego seja roteado atravs da VPN. Isso melhora o desempenho, pois elimina a transmisso do trfego de broadcast e de qualquer outro protocolo de rede que no seja o TCP/IP. A desvantagem que, sem a transmisso do trfego de broadcast, recursos como a navegao no ambiente de redes (nos clientes Windows) ou a instalao automtica de impressoras compartilhadas atravs do Cups (nos clientes Linux) deixem de funcionar. Se voc est disposto a sacrificar parte do link para que a VPN se comporte como uma rede local, como se todos os micros estivessem conectados ao mesmo switch, existe a opo de criar um bridge, unindo a interface virtual da VPN e a interface da rede local. Com isso, o servidor passa a usar o mesmo endereo, tanto na rede local quanto na VPN e os clientes conectados VPN podem receber um endereo dentro da faixa usada na rede local. Com isso, eles passam a no apenas acessar, mas tambm a serem acessados pelos demais micros. Para isso, precisaremos de um pacote adicional, o "bridge-utils", que deve ser instalado no servidor. Este um pacote padro, que est disponvel em todas as principais distribuies e pode ser instalado usando o gerenciador de pacotes, como em:

# apt-get install bridge-utils

ou:

# yum install bridge-utils

Em seguida, precisamos fazer algumas alteraes na configurao do servidor. A primeira delas a criao de dois scripts, um para ativar e o outro para desativar o bridge. Estes scripts sero executados juntamente com o OpenVPN, na ativao e desativao do servio. O primeiro deles o script "/etc/openvpn/bridge-start", que contm os comandos que ativam o bridge. Veja que este script contm uma srie de parmetros (que coloquei em negrito), que precisam ser alterados de acordo com a configurao do servidor:

#!/bin/bash # /etc/openvpn/bridge-start br="br0" tap="tap0" eth="eth0" eth_ip="192.168.1.101" eth_gw="192.168.1.1" eth_netmask="255.255.255.0" eth_broadcast="192.168.1.255" 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 route add default gw $eth_gw dev $br iptables -A INPUT -i tap0 -j ACCEPT iptables -A INPUT -i br0 -j ACCEPT iptables -A FORWARD -i br0 -j ACCEPT

A varivel "eth" inclui o device da placa de rede e a "eth_ip" contm o endereo utilizado pelo servidor (nesse exemplo, o servidor utiliza um endereo de rede interna, pois acessa atravs de uma conexo compartilhada, onde apenas a porta do OpenVPN roteada para ele). A varivel "eth_gw" inclui o gateway da rede (utilizado pelo servidor), enquanto a "eth_netmask" e "eth_broadcast" incluem a mscara e o endereo de broadcast da rede. Os trs comandos finais incluem regras no firewall para permitir o trfego nas interfaces. Em seguida, temos o script "/etc/openvpn/bridge-stop", responsvel por desativar o bridge. Diferente do primeiro, os parmetros so fixos, mudando apenas em configuraes especiais:

#!/bin/bash # /etc/openvpn/bridge-stop br="br0" tap="tap0"

ifconfig $br down brctl delbr $br for t in $tap; do openvpn --rmtun --dev $t done

Depois de criar os dois scripts, transforme-os em executveis usando o comando "chmod +x", como em:

# chmod +x /etc/openvpn/bridge-start # chmod +x /etc/openvpn/bridge-stop

Em seguida, temos as mudanas na configurao do servidor. A primeira mudana que o bridge utiliza a interface "tap" em vez da "tun" (o tap transmite pacotes de broadcast e o tun no), por isso, substitumos a linha "dev tun" por "dev tap0". A linha "server 10.0.0.0 255.255.255.0" dos exemplos anteriores deixa de ser usada, dando lugar ao parmetro "serverbridge", que contm um conjunto mais extenso de parmetros:

server-bridge 192.168.1.101 255.255.255.0 192.168.1.210 192.168.1.220

O primeiro parmetro (192.168.1.101) inclui o endereo IP do servidor, seguido pela mscara. Os dois endereos seguintes (192.168.1.210 192.168.1.220) especificam uma faixa de endereos que ser fornecida aos clientes remotos. Diferente dos exemplos anteriores, usamos uma faixa de endereos dentro da faixa usada na rede local, por isso importante que voc reserve uma faixa de endereos que no seja usada por outros micros da rede e que esteja fora da faixa de endereos fornecidos pelo servidor DHCP. A linha 'push "route 192.168.1.0 255.255.255.0"' (que define a regra de roteamento responsvel por permitir o acesso rede local por parte dos clientes remotos) tambm deixa de ser usada, j que com o bridge eles passam a ter acesso direto rede, sem necessidade de usar roteamento. Temos aqui um exemplo de arquivo de configurao completo para o servidor:

proto udp port 22223 dev tap0 server-bridge 192.168.1.254 255.255.255.0 192.168.1.210 192.168.1.220 comp-lzo keepalive 10 120 ifconfig-pool-persist /etc/openvpn/ipp.txt tls-server dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/servidor.crt

Na configurao dos clientes, a nica mudana em relao aos exemplos anteriores a substituio da linha "dev tun" por "dev tap" (note que, diferente do servidor, usamos "dev tap" e no "dev tap0"). Temos aqui um exemplo de configurao completo. Veja que continuamos usando a linha "pull", que faz com que o cliente obtenha a configurao de rede a partir do servidor:

remote guiadohardware.no-ip.org proto udp port 22223 client pull dev tap comp-lzo keepalive 10 120 tls-client dh /etc/openvpn/keys/dh1024.pem ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/cliente2.crt key /etc/openvpn/keys/cliente2.key ns-cert-type server

Depois de ajustada a configurao, falta apenas ativar o bridge. Para isso, desativamos o servio do OpenVPN, executamos o script que ativa o bridge e, por ltimo, ativamos novamente o servio do OpenVPN:

# /etc/init.d/openvpn stop # chmod +x /etc/openvpn/bridge-start # /etc/init.d/openvpn start

Se voc estiver acessando o servidor remotamente, vai perceber que ele ficar alguns segundos sem responder. Isso acontece porque o sistema precisa "aprender" os endereos dos hosts ligados a cada uma das interfaces que compe o bridge. Entretanto, se ele no voltar depois de uns 30 segundos, provvel que voc deixou algum parmetro incorreto na configurao, que acabou desconectando o servidor da rede. Nesse caso, voc vai precisar reiniciar o servidor, ou se logar localmente nele para ver o que deu errado. Depois de ativado o bridge, o servidor ficar com trs interfaces de rede. A interface "eth0" ficar sem endereo definido, assim como a interface "tap0", usada pela VPN. Uma terceira interface, a "br0" ficar com a configurao da rede, substituindo ambas. Isso acontece porque a "br0" justamente a interface virtual do bridge, que combina o trfego da rede local e da VPN, fazendo com que todo o trfego que chega em uma, seja retransmitido na outra. Ao usar o bridge, no usado o roteamento de pacotes, por isso no necessrio rodar o comando "echo 1 > /proc/sys/net/ipv4/ip_forward" no servidor, nem nenhum comando adicional no cliente. O sistema simplesmente passa a escutar as duas interfaces e encaminhar todo o trfego de uma interface para a outra, tratando as duas interfaces como se fossem uma s. No cliente, a configurao ainda mais simples. Voc precisa apenas reiniciar o servio do OpenVPN para que a alterao na configurao entre em vigor e a VPN seja restabelecida:

# /etc/init.d/openvpn restart

Uma vez que o cliente remoto se conecta bridge, ser criada a interface "tap0", utilizando um dos endereos da faixa definida na configurao do servidor, como em "192.168.1.220". Rodando o comando "route" (no cliente), voc ver que o sistema automaticamente incluiu uma rota, associando a interface tap rede "192.168.1.0". A partir da, o cliente pode acessar normalmente todos os demais micros da rede local, incluindo outros clientes remotos, e tambm ser acessado por eles. A nica grande limitao a velocidade do link, j que em vez de 100 megabits com latncia inferior a 10 milissegundos, como em uma conexo de rede local, voc passar a ter uma linha ADSL com apenas 256 ou 512 kbits de upload e uma latncia muito mais alta. Com isso, o acesso a compartilhamentos de arquivos e outros recursos pode ficar realmente muito lento, utilizvel apenas para a transferncia de pequenos arquivos.

Outra dica que pode demorar alguns minutos at que outros micros da rede tenham acesso ao cliente, pois o sistema precisa receber conexes dos endereos antes de coloc-los na tabela. normal que voc no consiga acessar um cliente que acabou de se conectar rede (o bridge ainda no aprendeu sobre ele) e consiga se conectar normalmente alguns minutos depois. Veja s:

$ ssh 192.168.1.210

ssh: connect to host 192.168.1.210 port 22: No route to host

$ ssh 192.168.1.210 # (dois minutos depois)

The authenticity of host '192.168.1.210 (192.168.1.210)' can't be established. RSA key fingerprint is ba:73:11:cd:e5:c5:c2:08:46:6e:d8:c4:02:f8:62:90. Are you sure you want to continue connecting (yes/no)?

Se voc tiver muitos micros com o Windows 95/98/ME na rede, o desempenho da VPN tambm ser bastante penalizado pelo trfego do protocolo NetBIOS (o compartilhamento de arquivos e impressoras). A melhor soluo para minimizar o problema configurar o servidor de arquivos da rede como servidor WINS e configurar todos os clientes para utiliz-lo. O uso do servidor WINS tambm a soluo se voc quiser que os clientes remotos tenham acesso aos compartilhamentos com a VPN utilizando interfaces tun, onde o trfego roteado. Depois de testar a conexo, voc pode automatizar a execuo dos scripts para ativar e desativar o bridge adicionando as duas linhas abaixo ao arquivo de configurao do servidor:

up /etc/openvpn/bridge-start down /etc/openvpn/bridge-stop

Usando esta configurao, o bridge deve ser ativado automaticamente durante a inicializao do servidor e (se voc est mantendo o servio do OpenVPN ativo nos clientes, em vez de conectar manualmente) eles devem se conectar VPN automaticamente assim que alguma conexo estiver disponvel. Como todo o trfego da VPN encriptado e os certificados privados no so transmitidos durante o estabelecimento da conexo, voc pode usar a VPN sem medo, mesmo ao acessar atravs de redes inseguras, como redes wireless pblicas ou redes de terceiros. Afinal, esta justamente a grande vantagem de utilizar uma VPN. :)