Para criar os certificados, utilizaremos o easy-rsa, um conjunto de scripts includos no pacote do OpenVPN. Na maioria das distribuies, os scripts esto disponeis dentro da pasta !/usr/share/doc/openvpn/exap!es/eas"#rsa!. "e a pasta no e#istir na sua instalao, use os comandos abai#o para localiz$-la% & updatedb & locate easy-rsa 'uas localizaes comuns so as pastas !(usr(s)are(doc(pac*a+es(openpn(easy-rsa! e !(usr(s)are(doc(openpn-,.-(easy-rsa!. No .edora, especificamente, / usada a pasta !(usr(s)are(openpn(easyrsa! e, no 0entO", / usada a pasta !(usr(s)are(doc(openpn-,.-.1(easy- rsa(! 2onde o ,.-.1 / a erso do pacote, 3ue muda de acordo com a erso do 0entO" usada4. O primeiro passo / copiar todo o diret5rio para dentro da pasta !(etc(openpn! 2oc6 pode usar outro diret5rio se preferir4. 7sso eita 3ue nossa confi+urao seja apa+ada ao atualizar o pacote do OpenVPN no futuro. No 'ebian, o comando seria% & cp -a (usr(s)are(doc(openpn(e#amples(easy-rsa (etc(openpn( No .edora, onde a localizao da pasta / diferente, o comando muda para% & cp -a (usr(s)are(openpn(easyrsa (etc(openpn( 7sso criar$ o diret5rio !(etc(openpn(easy-rsa!, contendo os se+uintes ar3uios% ,.- build-*ey build-re3 ma*e-crl reo*e-full build-ca build-*ey-pass build-re3-pass openssl.cnf si+n-re3 build-d) build-*ey-p*cs8, clean-all 9:;'<:.+z ars build-inter build-*ey-serer list-crl reo*e-crt :m outras distribuies, basta erificar 3ual / a pasta onde esto os e#emplos e ajustar o comando de acordo. ; partir da, toda a confi+urao ser$ feita dentro do noo diret5rio% & cd (etc(openpn(easy-rsa 0omece editando o ar3uio !vars!, usando seu editor de te#tos preferido% & joe ars No final do ar3uio, oc6 encontra um conjunto de par=metros usados para +erar as c)aes 2pas, estado, cidade, empresa, etc.4, 3ue deem ser editados, como em% e#port >:?@0OANB9?CD9 e#port >:?@P9OV7N0:C"P e#port >:?@07B?C!Euarul)os! e#port >:?@O9EC!E'F! e#port >:?@:<;7GC!morimotoH+uiado)ardIare.net! :m se+uida, usamos o comando !source! para carre+ar as ari$eis contidas dentro do ar3uio !ars! e, em se+uida, e#ecutamos os scripts !clean-all! e !build-ca!. O primeiro script limpa 3ual3uer sobra de confi+urao anterior, en3uanto o se+undo +era o certificado raiz, usando o openssl. 0omo os scripts esto dentro do diret5rio atual, usamos o !.(! ao e#ecut$-los% & source ars & .(clean-all & .(build-ca Eeneratin+ a 8-,J bit 9"; priate *ey ...................KKKKKK .....................KKKKKK Iritin+ neI priate *ey to Lca.*eyL ----- ?ou are about to be as*ed to enter information t)at Iill be incorporated into your certificate re3uest. M)at you are about to enter is I)at is called a 'istin+uis)ed Name or a 'N. B)ere are 3uite a feI fields but you can leae some blan* .or some fields t)ere Iill be a default alue, 7f you enter L.L, t)e field Iill be left blan*. ----- 0ountry Name 2, letter code4 ND9O% "tate or Proince Name 2full name4 N"PO% Gocality Name 2e+, city4 NEuarul)osO% Or+anization Name 2e+, company4 NE'FO% Or+anizational Anit Name 2e+, section4 NO% 0ommon Name 2e+, your name or your sererLs )ostname4 NO% :mail ;ddress NmorimotoH+uiado)ardIare.netO% 7sso criar$ a pasta !(etc(openpn(easy-rsa(*eys(!, contendo os se+uintes ar3uios% ca.crt ca.*ey inde#.t#t serial O ar3uio !ca$crt! cont/m o certificado raiz. :le jamais dee sair do seridor, j$ 3ue 3ual3uer um 3ue ten)a acesso a ele poder$ +erar certificados adicionais 3ue, essencialmente, permitiro 3ue 3ual3uer um se conecte P VPN. ; necessidade de manter esse ar3uio secreto faz com 3ue al+uns administradores prefiram +erar as c)aes em uma m$3uina desconectada da rede 2apenas com acesso local4 e copiar manualmente os certificados +erados para o seridor e as demais m$3uinas. 'epois de criar o certificado raiz, podemos passar para o passo se+uinte, 3ue / +erar os certificados para o seridor e para os clientes. Para +erar o certificado do seridor, usamos o script !build-*ey-serer!, especificando como par=metro o nome do ar3uio 3ue ser$ +erado 2!seridor! no e#emplo4. O nome / apenas para identificao dos )osts, oc6 pode usar os nomes 3ue preferir% & cd (etc(openpn(easy-rsa( & .(build-*ey-serer seridor :le comea confirmando as informaes 3ue sero includas no certificado 2pas, cidade, empresa, etc.4, da mesma forma 3ue ao rodar o build-ca. :m um certo ponto, ele per+untar$ pelo atributo !0ommon Name!, onde oc6 dee fornecer o nome do seridor, como em% 0ommon Name 2e+, your name or your sererLs )ostname4 NO%%tch :m se+uida, ele oferece a opo de incluir um !c)allen+e passIord!, uma sen)a 3ue ser$ solicitada cada ez 3ue o certificado for usado. :la aumenta a se+urana, mas, em compensao, reduz bastante a praticidade, j$ 3ue oc6 precisar$ di+itar a sen)a cada ez 3ue o certificado for utilizado, o 3ue pode se tornar incrielmente inconeniente em um seridor administrado remotamente. "e 3uiser manter as coisas simples, dei#e o campo em branco% ; c)allen+e passIord NO% ;ntes de terminar, ele confirma se oc6 deseja assinar o certificado e pede mais uma confirmao antes de aplicar a alterao. 9esponda !y! em ambas, caso contr$rio a +erao do certificado / abortada% "i+n t)e certificateQ Ny(nO%" 8 out of 8 certificate re3uests certified, commitQ Ny(nO" :m se+uida, +eramos as c)aes 3ue sero usadas pelos clientes, usando o script !build-*ey!. Voc6 pode +erar c)aes para $rios clientes em se3R6ncia, especificando nomes diferentes, como em% & .(build-*ey cliente8 & .(build-*ey cliente, 0ada ez 3ue o comando / e#ecutado, o script mostra a sada do comando do openssl usado para +erar a c)ae e confirma os par=metros do certificado, como ao rodar o !build-*ey-serer!% Eeneratin+ a 8-,J bit 9"; priate *ey .KKKKKK .......................KKKKKK Iritin+ neI priate *ey to Lcliente8.*eyL "e ao e#ecutar o comando !.(build-*ey nome! ele simplesmente for e#ecutado instantaneamente, sem e#ibir o indicador ou 3ual3uer mensa+em de erro, / sinal de 3ue al+uma coisa est$ errada, proaelmente com a atribuio das ari$eis usada pelo script. Nesse caso, e#perimente rodar noamente o comando !source ars! e e#ecutar o script noamente, como em% & source ars & .(build-*ey cliente8 No se es3uea de preenc)er a opo !commonName! com o nome da m$3uina 2ou outro nome definido por oc6, diferente em cada c)ae4. 'ei#ando o campo em branco a c)ae no / +erada. No final do processo, no es3uea de responder as per+untas !"i+n t)e certificateQ! e !8 out of 8 certificate re3uests certified, commitQ! com o alor !y!. 0ommon Name 2e+, your name or your sererLs )ostname4 NO%cliente8 ... "i+n t)e certificateQ Ny(nO%y 8 out of 8 certificate re3uests certified, commitQ Ny(nO" 'iferente do !build-*ey-serer!, ele no oferece a opo de prote+er a c)ae usando uma sen)a. "e oc6 3uiser 3ue os usu$rios precisem di+itar uma sen)a antes de poderem efetuar a cone#o usando o certificado, +ere as c)aes usando o script !bui!d#&e"#pass! em ez do !build-*ey!. :le confirma todos os par=metros 2assim como o build-*ey-serer4 e oferece a opo incluir a sen)a% & .(build-*ey-pass cliente, :m se+uida, usamos o script !build-d)! 2sem par=metros4. :le +era os par=metros 'iffie Fellman, 3ue reforam a se+urana, permitindo 3ue o seridor e os clientes tro3uem as c)aes 2de forma se+ura4 no momento da cone#o, confirmando suas identidades% & .(build-d) Eeneratin+ 'F parameters, 8-,J bit lon+ safe prime, +enerator , B)is is +oin+ to ta*e a lon+ time ....................................K...........K............... O comando demora 3uase um minuto para +erar os par=metros, mostrando um indicador de pro+resso durante o processo. :m caso de problemas, certifi3ue-se de 3ue est$ rodando os comandos a partir do diret5rio !(etc(openpn(easy-rsa!, rode o comando !source ars! para carre+ar as ari$eis e tente noamente. O processo de +erao das c)aes +era um conjunto de ar3uios !.csr!. :stes ar3uios correspondem Ps re3uisies para a assinatura das c)aes, 3ue so feitas durante o processo de criao. :les podem ser remoidos no final do processo% & rm S.csr Voc6 ficar$, ento, com um conjunto de ar3uios similar a esse dentro do diret5rio !(etc(openpn(easy-rsa(*eys!% ca.crt cliente8.*ey cliente,.*ey inde#.t#t seridor.crt ca.*ey cliente,.crt clienteT.crt inde#.t#t.attr seridor.*ey cliente8.crt cliente,.csr clienteT.*ey serial 0aso esteja curioso, estes scripts nada mais fazem do 3ue e#ecutar os comandos correspondentes do Open""G, usando os par=metros definidos no ar3uio !ars!. O script !build-*ey!, por e#emplo, e#ecuta os comandos% cd U>:?@'79 VV openssl re3 -days TWX- -nodes -neI -*eyout U8.*ey -out U8.csr -confi+ U>:?@0ON.7E VV openssl ca -days TWX- -out U8.crt -in U8.csr -confi+ U>:?@0ON.7E VV c)mod -W-- U8.*ey Note 3ue / usado o par=metro !-days TWX-!, 3ue faz com 3ue as c)aes ten)am alidade de 8- anos. "e a sua VPN ainda estier em uso at/ l$, no se es3uea de trocar as c)aes antes do TWX-Y dia, caso contr$rio sua VPN parar$ de funcionar ap5s completar o d/cimo aniers$rio. %4 'nsta!ando os certificados .alta a+ora fazer a instalao das c)aes, tanto no seridor 3uanto nos clientes. Para o seridor, crie o diret5rio !(etc(openpn(*eys! e copie para ele os ar3uios !ca.crt!, !seridor.crt! e !seridor.*ey!, como em% & cd (etc(openpn(easy-rsa(*eys & m*dir (etc(openpn(*eys & cp -a ca.crt seridor.crt seridor.*ey (etc(openpn(*eys( 0opie tamb/m o ar3uio !d)8-,J.pem! 2o nZmero 8-,J corresponde ao comprimento da c)ae e pode mudar de acordo com a confi+urao4. :le / +erado ao rodar o script !build-d)! e / importante, pois cont6m os par=metros 'iffie Fellman% & cp -a d)8-,J.pem (etc(openpn(*eys( O passo final / fazer a c5pia dos certificados para os clientes, usando o ".BP ou outra ferramenta de transfer6ncia de ar3uios. Bodos os clientes deem possuir o ar3uio !ca$crt!, o ar3uio !dh(0)*$pe! e os ar3uios .crt e .*ey correspondentes a ele. O cliente8 receberia os ar3uios !ca.crt!, !d)8-,J.pem!, !cliente8.crt! e !cliente8.*ey![ o cliente, receberia os ar3uios !ca.crt!, !d)8-,J.pem!, !cliente,.crt! e !cliente,.*ey!, e assim por diante. :m resumo, temos% ;r3uios na pasta !(etc(openpn(*eys! do seridor% ca.crt, d)8-,J.pem, seridor.crt, seridor.*ey ;r3uios na pasta !(etc(openpn(*eys! do cliente% ca.crt, d)8-,J.pem, cliente.crt, cliente.*ey Nos clientes Ginu#, crie o diret5rio !/etc/openvpn/&e"s! e copie os 3uatro ar3uios para ele. "e eles estierem com o seridor ""F atio 2e oc6 tier a sen)a de root4, pode fazer a c5pia a partir do pr5prio seridor, usando o ".BP, como em% & sftp rootH81,.8W\.8.,8 PassIord% sftp] m*dir (etc(openpn(*eys sftp] cd (etc(openpn(*eys sftp] put ca.crt sftp] put d)8-,J.pem sftp] put cliente8.crt sftp] put cliente8.*ey No caso dos clientes MindoIs, os 3uatro ar3uios deem ser copiados para o diret5rio !*eys!, dentro do diret5rio de instalao do OpenVPN, como em !0%^;r3uios de pro+ramas^OpenVPN^confi+*eys!. ;ssim como no caso dos clientes Ginu#, / necess$rio criar o diret5rio manualmente%
O uso de c)aes torna necess$rio 3ue os rel5+ios das m$3uinas estejam sincronizados. No Ginu#, oc6 pode acertar o rel5+io da m$3uina ia Ieb usando o comando% & ntpdate -u pool.ntp.or+ No MindoIs, mar3ue a opo !"incronizar automaticamente com um seridor de )or$rio na 7nternet!, disponel no Painel de 0ontrole ] 'ata e )ora ] For$rio na 7nternet!. +,ustando a configura-o e roteando pacotes ; parte mais complicada em usar certificados / a confi+urao inicial, 3ue acabamos de fazer. Ama ez 3ue os certificados j$ esto criados e instalados nos clientes, tudo fica mais simples. Vamos comear com uma confi+urao b$sica, similar P VPN 3ue criamos inicialmente utilizando c)aes est$ticas. Nesse e#emplo, estou utilizando o sistema tap 2em ez do tun, como no e#emplo anterior4 e estou utilizando os certificados anteriormente criados. ; diferena entre o tun e o tap / 3ue no tun o tr$fe+o da rede / roteado 2o 3ue elimina os pacotes de broadcast4, en3uanto no tap tudo / transmitido, incluindo pacotes de broadcast e pacotes de outros protocolos de rede 2como o 7P_("P_4. O ar3uio !/etc/openvpn/server$conf! no seridor ficaria% de tap ifconfi+ 8-.-.-.8 ,XX.,XX.,XX.- tls-serer d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(seridor.crt *ey (etc(openpn(*eys(seridor.*ey Veja 3ue a+ora usamos a lin)a !tls-serer! e especificamos a localizao dos J ar3uios com os certificados 3ue instalamos nos passos anteriores. ; lin)a !ifconfi+! especifica o endereo 7P 3ue ser$ usado pelo seridor, juntamente com a m$scara de subrede. ; confi+urao no ar3uio !/etc/openvpn/c!ient$conf! nos clientes ficaria% remote +uiado)ardIare.no-ip.or+ de tap tls-client ifconfi+ 8-.-.-., ,XX.,XX.,XX.- d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(cliente8.crt *ey (etc(openpn(*eys(cliente8.*ey Note 3ue o !ifconfi+ 8-.-.-.8 ,XX.,XX.,XX.-! na confi+urao do seridor e o !ifconfi+ 8-.-.-., ,XX.,XX.,XX.-! na confi+urao do cliente indicam os endereos 3ue sero usados pelas interfaces de rede irtual. :les no tem relao nen)uma com os endereos reais das m$3uinas. O Znico local onde o endereo !real! do seridor / especificado, / na opo !remote!, includa na confi+urao do cliente. 0riados os ar3uios de confi+urao no seridor e no cliente, reinicie o serio em ambas as m$3uinas, para 3ue o daemon leia a noa confi+urao e estabelea a cone#o% & (etc(init.d(openpn restart "e a VPN no funcionar, ou se oc6 receber um !"tartin+ irtual priate netIor* daemon% client2.;7G:'4! ao reiniciar o serio, e#perimente atiar o OpenVPN manualmente 2no cliente4, usando o comando% & openpn --confi+ client.conf 7sso faz com 3ue ele e#iba as mensa+ens +eradas pelo pro+rama durante a inicializao, o 3ue pode ajud$-lo a identificar o problema. Pode ser 3ue ele no esteja conse+uindo contactar o seridor no endereo especificado 2ou o fireIall pode estar blo3ueando a porta especificada na confi+urao4, pode e#istir al+um erro na confi+urao, ou pode ter )aido al+um problema durante a +erao ou a c5pia das c)aes, por e#emplo. Nos clientes MindoIs, a confi+urao / 3uase id6ntica, mudando apenas as lin)as com a localizao das c)aes. "e oc6 as colocou dentro da pasta !*eys!, no diret5rio de confi+urao, o ar3uio !client.opn! ficaria como no screens)ot a se+uir%
Para permitir 3ue $rios clientes se conectem simultaneamente P VPN, / necess$rio fazer al+umas mudanas na confi+urao. ; principal delas / 3ue, em ez de especificar manualmente o endereo 7P usado pelo seridor e pelo cliente usando o comando !ifconfi+! como em !ifconfi+ 8-.-.-., 8-.-.-.8! 23ue usamos nos e#emplos onde foi utilizada a interface tun4 ou !ifconfi+ 8-.-.-.8 ,XX.,XX.,XX.-! 2usado no e#emplo com o tap4, passamos a especificar uma fai#a de endereos 7P para a VPN e dei#amos 3ue o seridor atribua endereos para os clientes conforme eles se conectam. 7sso / mais simples do 3ue parece. Na confi+urao do seridor utilizaremos a lin)a !serer! 2dei#ando de usar a lin)a do ifconfi+4, especificando a fai#a de endereos e a m$scara, como em% serer 8-.-.-.- ,XX.,XX.,XX.- ` importante enfatizar 3ue a fai#a de endereos utilizada na VPN dee ser diferente da fai#a de endereos utilizada na rede local P 3ual o seridor est$ li+ado, 3ue, por sua ez, tamb/m dee ser diferente da fai#a de endereos de rede local utilizada pelo cliente. Ori+inalmente, o cliente tem acesso apenas ao pr5prio seridor. Para permitir 3ue ele possa acessar os demais )osts da rede local, adicionamos uma lin)a adicional, 3ue faz com 3ue o seridor inclua uma re+ra de roteamento na confi+urao do cliente, no momento da cone#o. :la especifica a fai#a de endereos e a m$scara usada na rede local% pus) !route 81,.8W\.8.- ,XX.,XX.,XX.-! 0om a re+ra, o cliente passar$ a usar o endereo 7P do seridor na VPN como rota padro para os pacotes destinados P fai#a de endereos especificada. :ssa lin)a substitui o comando !route add -net 81,.8W\.8.- netmas* ,XX.,XX.,XX.- +I 8-.-.-.8 de tun-! 2e#ecutado no cliente4 3ue usamos no t5pico sobre VPNs com c)aes est$ticas. Na confi+urao do cliente, adicionamos a lin)a !pull! 2pus) C empurrar, pull C pu#ar4, para 3ue ele aceite as confi+uraes fornecidas pelo seridor. 0om isso, o cliente recebe automaticamente um endereo aleat5rio dentro da fai#a !8-.-.-.#!, sem 3ue oc6 precise especificar a confi+urao de cada um manualmente% pull Bemos a3ui um e#emplo de confi+urao completa do seridor, utilizando a interface tun, especificando uma porta A'P alternatia e utilizando as noas opes% proto udp port ,,,,, de tun server (0$0$0$0 )55$)55$)55$0 push .route (9)$(/0$($0 )55$)55$)55$0. tls-serer d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(seridor.crt *ey (etc(openpn(*eys(seridor.*ey ; confi+urao correspondente para o cliente seria% remote +uiado)ardIare.no-ip.or+ proto udp port ,,,,, c!ient pu!! de tun tls-client d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(cliente8.crt *ey (etc(openpn(*eys(cliente8.*ey 0om essa confi+urao, o seridor passa a ser capaz de receber cone#es a partir de $rios clientes simultaneamente. O OpenVPN / capaz de +erenciar todas as cone#es utilizando a mesma porta. Para adicionar um noo cliente P VPN, oc6 precisaria apenas +erar um noo certificado, usando o comando !.(build-*ey! e copiar os 3uatro ar3uios para dentro da pasta !(etc(openpn(*eys! 2al/m de instalar o OpenVPN, naturalmente4. :m resumo, os comandos para +erar um noo certificado so% & cd (etc(openpn(easy-rsa( & source ars & .(build-*ey noocliente ; confi+urao / a mesma 3ue foi usada para o primeiro cliente, mudando apenas os ar3uios dos certificados. 0om isso, cada cliente recebe um endereo diferente dentro da fai#a !8-.-.-.#! e pode acessar o seridor atra/s do endereo !8-.-.-.8!. ` necess$rio tamb/m atiar, no seridor, a re+ra de fireIall 3ue roteia os pacotes proenientes dos clientes da VPN para a interface de rede local. 0omo a+ora estamos utilizando endereos atribudos automaticamente, e no mais endereos est$ticos, especificamos a fai#a de endereos, em ez de especificar diretamente o endereo usado pelo cliente% & ec)o 8 ] (proc(sys(net(ipJ(ip@forIard & iptables -t nat -s 8-.-.-.-(,J -; PO"B9OAB7NE -o et)- -j <;"aA:9;': :stes dois comandos precisam ser e#ecutados pelo seridor a cada boot. Voc6 pode inclu-los no seu script de fireIall, ou em al+um dos scripts de inicializao do sistema. Ama opo Ztil ao usar $rios clientes / a opo !ifconfig#poo!#persist!. :la faz com 3ue o OpenVPN passe a armazenar uma lista com os endereos 7P usados por cada cliente da VPN e faa o possel para atribuir sempre os mesmos endereos em futuras cone#es. 7sso no impede 3ue os endereos mudem, mas torna as mudanas muito menos fre3Rentes. :sta opo / includa apenas na confi+urao do seridor, especificando um ar3uio de te#to onde a lista ser$ sala, como em% ifconfi+-pool-persist (etc(openpn(ipp.t#t O ar3uio / criado e atualizado automaticamente pelo OpenVPN. ; Znica e#i+6ncia / 3ue ele dee ser criado dentro do diret5rio !(etc(openpn!, ou outra pasta P 3ual o usu$rio !openpn! 2usado pelo daemon4 ten)a acesso. Ama opo 3ue aumenta a se+urana dos clientes / a !reote#cert#t!s server!, 3ue faz com 3ue os clientes erifi3uem o certificado do seridor no momento da cone#o. :la / mais uma opo destinada a prote+er os clientes contra ata3ues man-in-t)e-middle. :sta opo / adicionada apenas na confi+urao dos clientes% remote-cert-tls serer Ama obserao importante / 3ue esta opo / suportada apenas pelo OpenVPN erso ,.8 2final4 em diante. "e o cliente usar uma erso anterior 2como o OpenVPN ,.8@rcJ, usado no 'ebian :tc)4, a opo muda para !ns#cert#t"pe server!% ns-cert-type serer Voc6 pode erificar 3ual / a erso do OpenVPN usada, e assim descobrir 3ual das duas opes dee ser utilizada, usando o comando% & openpn --ersion Asar a opo !remote-cert-tls serer! em um cliente com uma erso anti+a do OpenVPN faz com 3ue o serio simplesmente dei#e de funcionar, at/ 3ue oc6 a substitua pela !ns-cert-type serer!. Outro problema comum / com relao ao uso da banda pelos usu$rios da VPN. "e uma Znica cone#o Ieb / diidida entre o uso da VPN e o acesso P Ieb, oc6 ai proaelmente 3uerer restrin+ir o uso de banda da VPN, para eitar 3ue c5pias de +randes ar3uios e outras atiidades 3ue enolam +rande uso de banda saturem a cone#o. 7sso / feito usando a opo !s)aper!, 3ue limita a banda total de sada usada pela VPN a um determinado olume de tr$fe+o. "e oc6 usa um lin* ;'"G com X8, *bits 2ou seja, WJ *bytes4 de upload, oc6 poderia restrin+ir o uso de banda pela VPN a X- *bytes, por e#emplo, de forma a dei#ar pelo menos uma pe3uena poro da banda reserada para outros usos. ; opo !s)aper! pode ser includa na confi+urao do seridor 2para 3ue seja aplicada ao tr$fe+o de sada somado de todos os clientes conectados a ele4, na confi+urao dos clientes 2limitando assim o tr$fe+o de sada permitido por cada um4 ou em ambos. Dasta especificar o limite desejado, em bytes, como em% s)aper X8,-- Voc6 pode tamb/m limitar o nZmero de clientes simult=neos 3ue sero aceitos pelo seridor usando a opo !ax#c!ients!, especificando o nZmero de clientes desejados, como em% ma#-clients 8- Ama Zltima opo, 3ue pode ser usada para prote+er sua VPN contra ata3ues 'o" e oferecer uma camada adicional de se+urana / a opo !t!s#auth!. 0om ela, uma c)ae compartil)ada / usada para criar uma se+unda camada de encriptao sobre os pacotes j$ encriptados usando os certificados. O seridor s5 aceita pedidos de cone#o encriptados com a c)ae compartil)ada, o 3ue faz com 3ue pedidos de cone#o de pessoas no autorizadas 23ue no tero a c)ae4 se3uer sejam processados. Para utilizar a opo, / necess$rio criar uma c)ae est$tica, usando o comando !openpn --+en*ey --secret!, o mesmo 3ue utilizamos no inicio para +erar a c)ae est$tica usada na nossa VPN inicial. :ste ar3uio pode ser armazenado no diret5rio !(etc(openpn(*eys!, junto com os ar3uios dos certificados% & cd (etc(openpn(*eys & openpn --+en*ey --secret c)ae.*ey O ar3uio +erado dee ser ento copiado para todos os clientes. O pr5#imo passo / adicionar a opo, tanto na confi+urao do seridor 3uanto na dos clientes, especificando a localizao do ar3uio, como em% tls-aut) (etc(openpn(*eys(c)ae.*ey Note 3ue, nesse caso, a c)ae no permite acessar a VPN. :la / apenas um pr/-re3uisito para poder eniar re3uisies de cone#o para o seridor, ou seja, apenas uma acamada adicional de proteo. ;l/m dela, / necess$rio ter os J ar3uios com o certificado e as c)aes, como nos e#emplos anteriores. Bemos a3ui um e#emplo final de confi+urao para o seridor, utilizando todas as opes 3ue imos at/ a3ui% & (etc(openpn(serer.conf proto udp port ,,,,, de tun serer 8-.-.-.- ,XX.,XX.,XX.- pus) !route 81,.8W\.8.- ,XX.,XX.,XX.-! comp-lzo *eepalie 8- 8,- persist-*ey persist-tun float ifconfi+-pool-persist (etc(openpn(ipp.t#t ma#-clients 8- s)aper X8,-- tls-serer d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(seridor.crt *ey (etc(openpn(*eys(seridor.*ey tls-aut) (etc(openpn(static.*ey ;3ui ai o ar3uio de confi+urao correspondente para os clientes% & (etc(openpn(client.conf remote +uiado)ardIare.no-ip.or+ proto udp port ,,,,, client pull de tun comp-lzo *eepalie 8- 8,- persist*ey persisttun float tls-client d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(cliente8.crt *ey (etc(openpn(*eys(cliente8.*ey tls-aut) (etc(openpn(static.*ey "e oc6 j$ est$ com o seridor OpenVPN atio, precisa apenas reiniciar o serio para 3ue a noa confi+urao entre em i+or, como em% & (etc(init.d(openpn restart ou% & serice openpn restart "e oc6 receber um !"tartin+ irtual priate netIor* daemon% serer2.;7G:'4.!, erifi3ue todas as opes e c)e3ue se os ar3uios dos certificados foram +erados e copiados corretamente. 0omo comentei anteriormente, o conteZdo do ar3uio de confi+urao nos clientes MindoIs / e#atamente o mesmo, mudando apenas as lin)as com as localizaes dos ar3uios com os certificados. No MindoIs, so usadas barras inertidas ao indicar a localizao de ar3uios e isso se aplica tamb/m P confi+urao do OpenVPN. :ntretanto, as barras inertidas so tamb/m usadas como caracteres de escape no s)ell, por isso 2por estran)o 3ue possa parecer4, ao indicar localizaes de ar3uios na confi+urao do OpenVPN no MindoIs oc6 dee duplicar todas as barras inertidas e colocar a localizao entre aspas, como em% static !0%^;r3uios de pro+ramas^OpenVPN^*eys^static.*ey! Am Zltimo tru3ue / 3ue, em um seridor com $rias cone#es, ou no caso de uma rede com $rios seridores de VPN 2onde os clientes podem se conectar a 3ual3uer um dos seridores para obter acesso P rede4, oc6 pode criar um sistema simples de redund=ncia e de balanceamento de car+a especificando os endereos de todos os seridores na confi+urao dos clientes 2criando $rias lin)as !remote!4 e adicionando a opo !reote#rando!, como em% remote +uiado)ardIare.no-ip.or+ remote +d)n.com.br remote +d)press.com.br remote-random 7sso faz com 3ue o cliente escol)a aleatoriamente entre os tr6s endereos especificados a cada cone#o, tentando os outros dois caso o primeiro esteja inacessel. 0omo cada cliente escol)er$ um seridor diferente a cada cone#o, a car+a acabar$ sendo diidida i+ualmente entre os seridores. 1evogando certificados e b!o2ueando c!ientes Ama parte importante do +erenciamento dos certificados no OpenVPN / a reo+ao dos certificados 3ue no deem mais ser utilizados. 7ma+ine o caso de um noteboo* 3ue foi roubado, por e#emplo. "e os certificados no forem reo+ados, 3ual3uer um em posse deles poder$ 2a menos 3ue oc6 inclua uma sen)a ao +erar os certificados4 se conectar P VPN e, a partir da, ter acesso P rede interna da empresa. O processo de reo+ao dos certificados consiste em criar um ar3uio contendo a lista dos certificados reo+ados e confi+urar o seridor para utiliz$-lo. ; partir da, no importa mais se os ar3uios do certificado reo+ados sejam distribudos, j$ 3ue eles no tero mais serentia al+uma. Para criar a lista, acesse o diret5rio !(etc(openpn(easy-rsa! no seridor 2ou na m$3uina 3ue estier usando para +erar os certificados4 e carre+ue as ari$eis do ar3uio !ars!% & cd (etc(openpn(easy-rsa & source ars :#ecute o comando !reo*e-full!, especificando o certificado 3ue ser$ reo+ado, como em% & .(reo*e-full cliente8 Asin+ confi+uration from (etc(openpn(easy-rsa(openssl.cnf 9eo*in+ 0ertificate -\. 'ata Dase Apdated Asin+ confi+uration from (etc(openpn(easy-rsa(openssl.cnf cliente8.crt% (0CD9("BC"P(OCE'F(0NCcliente8(email;ddressCfooHbar.com error ,T at - dept) loo*up%certificate reo*ed ; mensa+em !error ,T! indica 3ue o certificado foi reo+ado com sucesso, ou seja, ela no / e#atamente uma mensa+em de erro e sim uma confirmao. O comando +era o ar3uio !cr!$pe!, dentro do diret5rio !(etc(openpn(easy-rsa(*eys!. O pr5#imo passo / copiar o ar3uio para o diret5rio !/etc/openvpn/&e"s! do seridor, a mesma pasta utilizada pelos ar3uios com os certificados. Para 3ue ele passe a ser utilizado pelo OpenVPN, adicione o par=metro !crl-erify! na confi+urao do seridor, especificando a localizao do ar3uio, como em% crl-erify (etc(openpn(*eys(crl.pem Para 3ue a alterao entre em i+or, reinicie o OpenVPN% & (etc(init.d(openpn restart 0om isso, o cliente perde imediatamente o acesso P VPN e passa a receber um erro !BG" :rror% BG" )ands)a*e failed! ao tentar se conectar noamente. Para reo+ar mais c)aes, repita o processo, no se es3uecendo de copiar o ar3uio atualizado para a pasta !(etc(openpn(*eys! do seridor a cada alterao. "e oc6 est$ +erando as c)aes usando o pr5prio seridor, pode tamb/m especificar diretamente o ar3uio na pasta !(etc(openpn(easy- rsa(*eys! na opo[ assim oc6 elimina a necessidade de copiar manualmente o ar3uio a cada alterao. Am e#emplo de confi+urao seria% crl-erify (etc(openpn(easy-rsa(*eys(crl.pem Para 3ue o OpenVPN leia o ar3uio atualizado, use o par=metro !reload! do serio. 7sso atualiza a confi+urao sem derrubar os clientes conectados% & (etc(init.d(openpn reload Criando bridges no OpenVPN ; confi+urao 3ue imos at/ a+ora faz com 3ue o tr$fe+o seja roteado atra/s da VPN. 7sso mel)ora o desempen)o, pois elimina a transmisso do tr$fe+o de broadcast e de 3ual3uer outro protocolo de rede 3ue no seja o B0P(7P. ; desanta+em / 3ue, sem a transmisso do tr$fe+o de broadcast, recursos como a nae+ao no ambiente de redes 2nos clientes MindoIs4 ou a instalao autom$tica de impressoras compartil)adas atra/s do 0ups 2nos clientes Ginu#4 dei#em de funcionar. "e oc6 est$ disposto a sacrificar parte do lin* para 3ue a VPN se comporte como uma rede local, como se todos os micros estiessem conectados ao mesmo sIitc), e#iste a opo de criar um brid+e, unindo a interface irtual da VPN e a interface da rede local. 0om isso, o seridor passa a usar o mesmo endereo, tanto na rede local 3uanto na VPN e os clientes conectados P VPN podem receber um endereo dentro da fai#a usada na rede local. 0om isso, eles passam a no apenas acessar, mas tamb/m a serem acessados pelos demais micros. Para isso, precisaremos de um pacote adicional, o !bridge#uti!s!, 3ue dee ser instalado no seridor. :ste / um pacote padro, 3ue est$ disponel em todas as principais distribuies e pode ser instalado usando o +erenciador de pacotes, como em% & apt-+et install brid+e-utils ou% & yum install brid+e-utils :m se+uida, precisamos fazer al+umas alteraes na confi+urao do seridor. ; primeira delas / a criao de dois scripts, um para atiar e o outro para desatiar o brid+e. :stes scripts sero e#ecutados juntamente com o OpenVPN, na atiao e desatiao do serio. O primeiro deles / o script !/etc/openvpn/bridge#start!, 3ue cont/m os comandos 3ue atiam o brid+e. Veja 3ue este script cont/m uma s/rie de par=metros 23ue colo3uei em ne+rito4, 3ue precisam ser alterados de acordo com a confi+urao do seridor% &b(bin(bas) & (etc(openpn(brid+e-start brC!br-! tapC!tap-! eth3.eth0. eth4ip3.(9)$(/0$($(0(. eth4g53.(9)$(/0$($(. eth4netas&3.)55$)55$)55$0. eth4broadcast3.(9)$(/0$($)55. for t in Utap[ do openpn --m*tun --de Ut done brctl addbr Ubr brctl addif Ubr Uet) for t in Utap[ do brctl addif Ubr Ut done for t in Utap[ do ifconfi+ Ut -.-.-.- promisc up done ifconfi+ Uet) -.-.-.- promisc up ifconfi+ Ubr Uet)@ip netmas* Uet)@netmas* broadcast Uet)@broadcast route add default +I Uet)@+I de Ubr iptables -; 7NPAB -i tap- -j ;00:PB iptables -; 7NPAB -i br- -j ;00:PB iptables -; .O9M;9' -i br- -j ;00:PB ; ari$el !et)! inclui o deice da placa de rede e a !et)@ip! cont/m o endereo utilizado pelo seridor 2nesse e#emplo, o seridor utiliza um endereo de rede interna, pois acessa atra/s de uma cone#o compartil)ada, onde apenas a porta do OpenVPN / roteada para ele4. ; ari$el !et)@+I! inclui o +ateIay da rede 2utilizado pelo seridor4, en3uanto a !et)@netmas*! e !et)@broadcast! incluem a m$scara e o endereo de broadcast da rede. Os tr6s comandos finais incluem re+ras no fireIall para permitir o tr$fe+o nas interfaces. :m se+uida, temos o script !/etc/openvpn/bridge#stop!, respons$el por desatiar o brid+e. 'iferente do primeiro, os par=metros so fi#os, mudando apenas em confi+uraes especiais% &b(bin(bas) & (etc(openpn(brid+e-stop brC!br-! tapC!tap-! ifconfi+ Ubr doIn brctl delbr Ubr for t in Utap[ do openpn --rmtun --de Ut done 'epois de criar os dois scripts, transforme-os em e#ecut$eis usando o comando !c)mod K#!, como em% & c)mod K# (etc(openpn(brid+e-start & c)mod K# (etc(openpn(brid+e-stop :m se+uida, temos as mudanas na confi+urao do seridor. ; primeira mudana / 3ue o brid+e utiliza a interface !tap! em ez da !tun! 2o tap transmite pacotes de broadcast e o tun no4, por isso, substitumos a lin)a !de tun! por !de tap-!. ; lin)a !serer 8-.-.-.- ,XX.,XX.,XX.-! dos e#emplos anteriores dei#a de ser usada, dando lu+ar ao par=metro !serer-brid+e!, 3ue cont/m um conjunto mais e#tenso de par=metros% serer-brid+e 81,.8W\.8.8-8 ,XX.,XX.,XX.- 81,.8W\.8.,8- 81,.8W\.8.,,- O primeiro par=metro 281,.8W\.8.8-84 inclui o endereo 7P do seridor, se+uido pela m$scara. Os dois endereos se+uintes 281,.8W\.8.,8- 81,.8W\.8.,,-4 especificam uma fai#a de endereos 3ue ser$ fornecida aos clientes remotos. 'iferente dos e#emplos anteriores, usamos uma fai#a de endereos dentro da fai#a usada na rede local, por isso / importante 3ue oc6 resere uma fai#a de endereos 3ue no seja usada por outros micros da rede e 3ue esteja fora da fai#a de endereos fornecidos pelo seridor 'F0P. ; lin)a Lpus) !route 81,.8W\.8.- ,XX.,XX.,XX.-!L 23ue define a re+ra de roteamento respons$el por permitir o acesso P rede local por parte dos clientes remotos4 tamb/m dei#a de ser usada, j$ 3ue com o brid+e eles passam a ter acesso direto P rede, sem necessidade de usar roteamento. Bemos a3ui um e#emplo de ar3uio de confi+urao completo para o seridor% proto udp port ,,,,T de tap- serer-brid+e 81,.8W\.8.,XJ ,XX.,XX.,XX.- 81,.8W\.8.,8- 81,.8W\.8.,,- comp-lzo *eepalie 8- 8,- ifconfi+-pool-persist (etc(openpn(ipp.t#t tls-serer d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(seridor.crt Na confi+urao dos clientes, a Znica mudana em relao aos e#emplos anteriores / a substituio da lin)a !de tun! por !de tap! 2note 3ue, diferente do seridor, usamos !de tap! e no !de tap-!4. Bemos a3ui um e#emplo de confi+urao completo. Veja 3ue continuamos usando a lin)a !pull!, 3ue faz com 3ue o cliente obten)a a confi+urao de rede a partir do seridor% remote +uiado)ardIare.no-ip.or+ proto udp port ,,,,T client pull de tap comp-lzo *eepalie 8- 8,- tls-client d) (etc(openpn(*eys(d)8-,J.pem ca (etc(openpn(*eys(ca.crt cert (etc(openpn(*eys(cliente,.crt *ey (etc(openpn(*eys(cliente,.*ey ns-cert-type serer 'epois de ajustada a confi+urao, falta apenas atiar o brid+e. Para isso, desatiamos o serio do OpenVPN, e#ecutamos o script 3ue atia o brid+e e, por Zltimo, atiamos noamente o serio do OpenVPN% & (etc(init.d(openpn stop & c)mod K# (etc(openpn(brid+e-start & (etc(init.d(openpn start "e oc6 estier acessando o seridor remotamente, ai perceber 3ue ele ficar$ al+uns se+undos sem responder. 7sso acontece por3ue o sistema precisa !aprender! os endereos dos )osts li+ados a cada uma das interfaces 3ue compe o brid+e. :ntretanto, se ele no oltar depois de uns T- se+undos, / pro$el 3ue oc6 dei#ou al+um par=metro incorreto na confi+urao, 3ue acabou desconectando o seridor da rede. Nesse caso, oc6 ai precisar reiniciar o seridor, ou se lo+ar localmente nele para er o 3ue deu errado. 'epois de atiado o brid+e, o seridor ficar$ com tr6s interfaces de rede. ; interface !et)-! ficar$ sem endereo definido, assim como a interface !tap-!, usada pela VPN. Ama terceira interface, a !br-! ficar$ com a confi+urao da rede, substituindo ambas. 7sso acontece por3ue a !br-! / justamente a interface irtual do brid+e, 3ue combina o tr$fe+o da rede local e da VPN, fazendo com 3ue todo o tr$fe+o 3ue c)e+a em uma, seja retransmitido na outra. ;o usar o brid+e, no / usado o roteamento de pacotes, por isso no / necess$rio rodar o comando !ec)o 8 ] (proc(sys(net(ipJ(ip@forIard! no seridor, nem nen)um comando adicional no cliente. O sistema simplesmente passa a escutar as duas interfaces e encamin)ar todo o tr$fe+o de uma interface para a outra, tratando as duas interfaces como se fossem uma s5. No cliente, a confi+urao / ainda mais simples. Voc6 precisa apenas reiniciar o serio do OpenVPN para 3ue a alterao na confi+urao entre em i+or e a VPN seja restabelecida% & (etc(init.d(openpn restart Ama ez 3ue o cliente remoto se conecta P brid+e, ser$ criada a interface !tap-!, utilizando um dos endereos da fai#a definida na confi+urao do seridor, como em !81,.8W\.8.,,-!. 9odando o comando !route! 2no cliente4, oc6 er$ 3ue o sistema automaticamente incluiu uma rota, associando a interface tap P rede !81,.8W\.8.-!. ; partir da, o cliente pode acessar normalmente todos os demais micros da rede local, incluindo outros clientes remotos, e tamb/m ser acessado por eles. ; Znica +rande limitao / a elocidade do lin*, j$ 3ue em ez de 8-- me+abits com lat6ncia inferior a 8- milisse+undos, como em uma cone#o de rede local, oc6 passar$ a ter uma lin)a ;'"G com apenas ,XW ou X8, *bits de upload e uma lat6ncia muito mais alta. 0om isso, o acesso a compartil)amentos de ar3uios e outros recursos pode ficar realmente muito lento, utiliz$el apenas para a transfer6ncia de pe3uenos ar3uios. Outra dica / 3ue pode demorar al+uns minutos at/ 3ue outros micros da rede ten)am acesso ao cliente, pois o sistema precisa receber cone#es dos endereos antes de coloc$-los na tabela. ` normal 3ue oc6 no consi+a acessar um cliente 3ue acabou de se conectar P rede 2o brid+e ainda no aprendeu sobre ele4 e consi+a se conectar normalmente al+uns minutos depois. Veja s5% U ss) 81,.8W\.8.,8- ss)% connect to )ost 81,.8W\.8.,8- port ,,% No route to )ost U ss) 81,.8W\.8.,8- & 2dois minutos depois4 B)e aut)enticity of )ost L81,.8W\.8.,8- 281,.8W\.8.,8-4L canLt be establis)ed. 9"; *ey fin+erprint is ba%cT%88%cd%eX%cX%c,%-\%JW%We%d\%cJ%-,%f\%W,%1-. ;re you sure you Iant to continue connectin+ 2yes(no4Q "e oc6 tier muitos micros com o MindoIs 1X(1\(<: na rede, o desempen)o da VPN tamb/m ser$ bastante penalizado pelo tr$fe+o do protocolo NetD7O" 2o compartil)amento de ar3uios e impressoras4. ; mel)or soluo para minimizar o problema / confi+urar o seridor de ar3uios da rede como seridor M7N" e confi+urar todos os clientes para utiliz$-lo. O uso do seridor M7N" / tamb/m a soluo se oc6 3uiser 3ue os clientes remotos ten)am acesso aos compartil)amentos com a VPN utilizando interfaces tun, onde o tr$fe+o / roteado. 'epois de testar a cone#o, oc6 pode automatizar a e#ecuo dos scripts para atiar e desatiar o brid+e adicionando as duas lin)as abai#o ao ar3uio de confi+urao do seridor% up (etc(openpn(brid+e-start doIn (etc(openpn(brid+e-stop Asando esta confi+urao, o brid+e dee ser atiado automaticamente durante a inicializao do seridor e 2se oc6 est$ mantendo o serio do OpenVPN atio nos clientes, em ez de conectar manualmente4 eles deem se conectar P VPN automaticamente assim 3ue al+uma cone#o estier disponel. 0omo todo o tr$fe+o da VPN / encriptado e os certificados priados no so transmitidos durante o estabelecimento da cone#o, oc6 pode usar a VPN sem medo, mesmo ao acessar atra/s de redes inse+uras, como redes Iireless pZblicas ou redes de terceiros. ;final, esta / justamente a +rande anta+em de utilizar uma VPN. %4