Criando Uma VPN Básica e Avançada - Linux
Criando Uma VPN Básica e Avançada - Linux
Criando Uma VPN Básica e Avançada - Linux
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.
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:
# 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:
# 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:
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:
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.
# # 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:
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:
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:
# /etc/init.d/openvpn restart
# /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
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:
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":
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/
# cp -a /usr/share/openvpn/easyrsa /etc/openvpn/
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
# 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:
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:
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]:
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:
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:
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:
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:
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:
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:
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:
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:
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".
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:
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:
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:
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
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:
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:
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:
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
# /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:
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:
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:
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.
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
# /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
ou:
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:
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:
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:
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:
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
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:
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. :)