OpenVPN Pantaneiro
De gutocarvalho.net
OpenVPN à moda pantaneira.
O que é uma VPN?
Uma Rede Privada Virtual (Virtual Private Network - VPN) é uma rede de comunicações privada normalmente utilizada por uma empresa ou um conjunto de empresas e/ou instituições, construída em cima de uma rede de comunicações pública (como por exemplo, a Internet). O tráfego de dados é levado pela rede pública utilizando protocolos padrão, não necessariamente seguros.
VPNs seguras usam protocolos de criptografia por tunelamento que fornecem a confidencialidade, autenticação e integridade necessárias para garantir a privacidade das comunicações requeridas. Quando adequadamente implementados, estes protocolos podem assegurar comunicações seguras através de redes inseguras.
Deve ser notado que a escolha, implementação e uso destes protocolos não é algo trivial, e várias soluções de VPN inseguras são distribuídas no mercado. Adverte-se os usuários para que investiguem com cuidado os produtos que fornecem VPNs. Por si só, o rótulo VPN é apenas uma ferramenta de marketing.
Leia mais em http://pt.wikipedia.org/wiki/VPN
Quais as vantagens em utilizar um VPN?
Vamos estudar um cenário, vamos supor que você tenha uma empresa em Salvador/BA e uma filial em Belo Horizonte/MG, a filial precisa acessar certos sistemas internos que estão disponíveis apenas na rede da Matriz em Salvador/BA, você estudou vários produtos para criar um rede privada e em um primeiro momento o investimento se tornaria muito alto. Bom nós temos a grande rede de computadores, chamada de internet, o problema é a segurança, os dados trafegando livremente na internet, o seu sistema aberto na internet, isso não é sábio, tão pouco seguro, podemos então trafegar dados de forma segura na internet? Podemos!
Usando tecnologia VPN (rede privada virtual) nós podemos criar uma rede segura dentro da internet, entre 2 pontos, utilizando criptografia, desta forma seus dados trafegam seguros, criptografados, fazendo com que tanto a rede da filial, quanto a rede da matriz fiquem seguras, elas não estarão abertas na grande rede.
Um outro cenário importante que se configura está ligado a necessidade de suporte remoto, vamos imaginar que você tenha um servidor ou uma máquina que está atrás de um roteador, gateway, firewall, máquina esta que não possui um ip público na internet. Como você poderia se conectar nesta máquina para fazer manutenção? Bom neste caso precisamos que o servidor tenha um ip público na internet, caso isto ocorra bastará configurar normalmente o cliente para criar um túnel entre o servidor VPN em um ip público e o cliente com ip reservado, isto facilita muito para dar suporte em projetos sociais que dependem de conexão via satélite, onde todos os seus hosts são ips reservados da rede interna da operadora.
A grande vantagem é que você vai estar utilizando uma ferramenta que usa a infra-estrutura da internet, minimizando seus custos.
Sobre o OpenVPN
O OpenVPN é uma implementação livre da tecnologia VPN, com ele podemos criar túneis ponto-a-ponto encriptados entre computadores. Ele foi desenvolvido por James Yonan e publicado sob licença livre GNU GPL.
Traduzido de http://en.wikipedia.org/wiki/OpenVPN
Como funciona o OpenVPN ?
O OpenVPN permite autenticação por chaves compartilhadas/estática, certificados ou usuário/senha. Ele utiliza encriptação advinda da biblioteca OpenSSL e protocolos conhecidos como SSLv3/TSLv1. Ele está disponível para sistemas Solaris, Linux, OpenBSD, FreeBSD, NetBSD, MAC OS X e até mesmo para sistemas proprietários como o Windows 2000/XP. Ele dispõe de vários recursos de controle e segurança. Ele não é baseado em WEB VPNs, e não é compatível com IPSEC ou qualquer outro tipo de pacotes VPN. Todo o Pacote do OpenVPN consiste em um binário para conexões tanto para o cliente e servidor, um arquivo de configurações opcional, e uma ou mais chaves dependendo da forma de autenticação escolhida.
Traduzido de http://en.wikipedia.org/wiki/OpenVPN
OpenVPN ou VTUN ?
O projeto VTUN foi descontinuado em 2003, ele funciona, porém há muito tempo não sofre atualizações e correções, por isto é aconselhável utilizar o OpenVPN, pois é um projeto com uma grande comunidade evolvida, sofre correções e atualizações constantes, além de ser leve, fácil de configurar e flexível.
Procure tirar dúvidas deste tutorial no fórum apropriado: http://gutocarvalho.net/phpBB3
Conteúdo |
[editar] método simples: chave estática ou compartilhada
vantagens e desvantagens...
[editar] instalando e configurando no servidor
cenário
- Servidor: Ubuntu 7.04
- Cliente: Ubuntu 7.10
200.200.200.1 = suposto ip público da matriz
200.200.200.2 = suposto ip público da filial
instalando o daemon
root@servidor:~# apt-get install openvpn
vamos trabalhar com autenticação do tipo chave compartilhada
para gerar a chave use o comando abaixo
root@servidor:~# openvpn --genkey --secret /etc/openvpn/filial-riodejaneiro.key
agora vamos criar o arquivo de configuração do servidor
root@servidor:~# vim /etc/openvpn/filial-riodejaneiro-daemon.conf
# Usar como interface o driver TUN dev tun # 10.0.0.1 ip que será assumido na matriz # 10.0.0.2 ip remoto, ou seja, esse será o ip da filial ifconfig 10.0.0.1 10.0.0.2 # Entra no diretório onde se encontram os arquivos de configuração cd /etc/openvpn # Indica que esse túnel possui uma chave de criptografia secret filial-riodejaneiro.key # OpenVPN usa a porta 5000/UDP por padrão. # Cada túnel do OpenVPN deve usar # uma porta diferente. # O padrão é a porta 5000 port 5000 # Usuário que rodará o daemon do OpenVPN user nobody # Grupo que rodará o daemon do OpenVPN group nogroup # Usa a biblioteca lzo comp-lzo # Envia um ping via UDP para a parte # remota a cada 15 segundos para manter # a conexão de pé em firewall statefull # Muito recomendado, mesmo se você não usa # um firewall baseado em statefull. ping 15 # Nível de log verb 3
arquivo criado, agora vamos iniciar o daemon
root@servidor:~# openvpn --config /etc/openvpn/filial-riodejaneiro-daemon.conf -daemon
você pode colocar isto no /etc/rc.local para iniciar automaticamente
para checar se está tudo certo, veja se a interface tun0 subiu
root@servidor:~# ifconfig tun0
tun0 Link encap:Point-to-Point Protocol
inet addr:10.0.0.1 P-t-P:10.0.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1255 Metric:1
RX packets:1383257 errors:0 dropped:0 overruns:0 frame:0
TX packets:1144968 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:82865921 (79.0 Mb) TX bytes:383951667 (366.1 Mb)
se ela subiu vai receber informações similares a esta acima.
[editar] instalando e configurando o openpvn no cliente
envie a chave cliente-riodejaneiro.key por ssh para o cliente
caso o cliente não possua ip público na internet como este cenário proposto, envie a chave por e-mail, de preferência use GPG e criptografe a mensagem, ou então leve em um pendrive para a filial, bom enfim, tome cuidado com essa chave.
root@servidor:~# scp /etc/openvpn/filial-riodejaneiro.key 200.200.200.2:/etc/openvpn
voltando ao cliente, instalando o openvpn
root@cliente:~# apt-get install openvpn
vamos criar o arquivo de configuração do cliente
root@cliente:~# vim /etc/openvpn/filial-riodejaneiro-client.conf
# Usar como interface o driver TUN dev tun # 10.0.0.1 ip que será assumido na matriz # 10.0.0.2 ip remoto, ou seja, esse será o ip da filial ifconfig 10.0.0.2 10.0.0.1 # Indica onde está o ip da Matriz (essa é a única linha que acrescentamos # no arquivo de configuração da filial), o resto é tudo igual. remote 200.200.200.1 # Entra no diretório onde se encontram os arquivos de configuração cd /etc/openvpn # Indica que esse túnel possui uma chave de criptografia secret filial-riodejaneiro.key # OpenVPN usa a porta 5000/UDP por padrão. # Cada túnel do OpenVPN deve usar # uma porta diferente. # O padrão é a porta 5000 port 5000 # Usuário que rodará o daemon do OpenVPN user nobody # Grupo que rodará o daemon do OpenVPN group nogroup # Usa a biblioteca lzo comp-lzo # Envia um ping via UDP para a parte # remota a cada 15 segundos para manter # a conexão de pé em firewall statefull # Muito recomendado, mesmo se você não usa # um firewall baseado em statefull. ping 15 # Nível de log verb 3
vamos iniciar o openvpn no cliente para que ele se conecte na servidor.
root@cliente:~# openvpn --config /etc/openvpn/filial.conf -daemon
para checar se está tudo certo, veja se a interface tun0 subiu
root@cliente:~# ifconfig tun0
tun0 Link encap:Point-to-Point Protocol
inet addr:10.0.0.2 P-t-P:10.0.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1255 Metric:1
RX packets:1383257 errors:0 dropped:0 overruns:0 frame:0
TX packets:1144968 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:82865921 (79.0 Mb) TX bytes:383951667 (366.1 Mb)
se ela subiu vai receber informações similares a esta acima.
Agora vamos testar
root@cliente:~# ping 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=63 time=11.9 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=63 time=6.09 ms 64 bytes from 10.0.0.1: icmp_seq=3 ttl=63 time=5.93 ms 64 bytes from 10.0.0.1: icmp_seq=4 ttl=63 time=8.15 ms 64 bytes from 10.0.0.1: icmp_seq=5 ttl=63 time=6.19 ms
vá no servidor
root@servidor:~# ping 10.0.0.2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=63 time=11.9 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=63 time=6.09 ms 64 bytes from 10.0.0.2: icmp_seq=3 ttl=63 time=5.93 ms 64 bytes from 10.0.0.2: icmp_seq=4 ttl=63 time=8.15 ms 64 bytes from 10.0.0.2: icmp_seq=5 ttl=63 time=6.19 ms
se houve resposta em ambos os lados a coisa está funcionando.
[editar] método seguro: certificados digitais
vantagens e desvantagens
[editar] instalando e configurando no servidor
root@servidor:~# apt-get install openvpn
antes de gerar os certificados vamos acertar o openssl
edite o arquivo /etc/ssl/openssl.cnf
root@servidor:~# vim /etc/ssl/openssl.cnf
vamos acertar as seguintes variaveis, configure como está abaixo
dir = /etc/openvpn # Where everything is kept new_certs_dir = $dir # default place for new certs certs = $dir # Where the issued certs are kept crl_dir = $dir # Where the issued crl are kept certificate = $dir/raiz.crt # The CA certificate private_key = $dir/raiz.key # The private key RANDFILE = $dir/.rand # private random number file default_days = 1460 # how long to certify for
agora vamos criar o arquivo index.txt
root@servidor:~# touch /etc/openvpn/index.txt
e o arquivo serial
root@servidor:~# touch /etc/openvpn/serial
vamos adicionar uma linha no arquivo serial
root@servidor:~# echo 01 > /etc/openvpn/serial
beleza, agora vamos gerar o certificado principal, raiz
root@servidor:~# cd /etc/openvpn/
gerando certificado válido por 4 anos
root@servidor:/etc/openvpn# openssl req -nodes -new -x509 -keyout raiz.key -out raiz.crt -days 1460
Generating a 1024 bit RSA private key ...................++++++ .................................++++++ writing new private key to 'raiz.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) [AU]:BR State or Province Name (full name) [Some-State]:MS Locality Name (eg, city) []:CGR Organization Name (eg, company) [Internet Widgits Pty Ltd]:minhaempresa Organizational Unit Name (eg, section) []:cpd Common Name (eg, YOUR name) []:meu nome Email Address []:nome@minhaempresa.com.br
gerando certificado da matriz
root@servidor:/etc/openvpn# openssl req -nodes -new -keyout matriz.key -out matriz.csr
exemplo de saida
Generating a 1024 bit RSA private key ..................++++++ ................................++++++ writing new private key to 'matriz.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) [AU]:BR State or Province Name (full name) [Some-State]:MS Locality Name (eg, city) []:CGR Organization Name (eg, company) [Internet Widgits Pty Ltd]: minhaempresa Organizational Unit Name (eg, section) []:matriz Common Name (eg, YOUR name) []:meu nome Email Address []:nome@minhaempresa.com.br Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:acesso livre An optional company name []:matriz
gerando certificado da filial
root@servidor:/etc/openvpn# openssl req -nodes -new -keyout filial.key -out filial.csr
exemplo de saida
Generating a 1024 bit RSA private key ..................++++++ ................................++++++ writing new private key to 'filial.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) [AU]:BR State or Province Name (full name) [Some-State]:MS Locality Name (eg, city) []:DOS Organization Name (eg, company) [Internet Widgits Pty Ltd]: minhaempresa Organizational Unit Name (eg, section) []:filial Common Name (eg, YOUR name) []:meu nome Email Address []:nome@minhaempresa.com.br Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:acesso livre An optional company name []:filial
gerando chave privada da matriz
root@servidor:/etc/openvpn# openssl ca -out matriz.crt -in matriz.csr
exemplo de saída
root@servidor:/etc/openvpn# openssl ca -out matriz.crt -in matriz.csr
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 26 21:06:13 2007 GMT
Not After : Dec 23 21:06:13 2017 GMT
Subject:
countryName = BR
stateOrProvinceName = MS
organizationName = minhaempresa
organizationalUnitName = matriz
commonName = meu nome
emailAddress = nome@minhaempresa.com.br
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
EC:21:5A:1C:DB:06:76:1C:5D:AE:F4:0B:7A:5E:20:E7:CB:38:40:98
X509v3 Authority Key Identifier:
keyid:8F:18:83:4C:EF:D9:F0:FD:1A:0E:36:F0:F0:A4:51:53:1F:DC:FC:7E
Certificate is to be certified until Dec 23 21:06:13 2017 GMT (1460 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
gerando chave privada da filial
root@servidor:/etc/openvpn# openssl ca -out filial.crt -in filial.csr
exemplo de saída
root@servidor:/etc/openvpn# openssl ca -out filial.crt -in filial.csr
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 26 21:06:13 2007 GMT
Not After : Dec 23 21:06:13 2017 GMT
Subject:
countryName = BR
stateOrProvinceName = MS
organizationName = minhaempresa
organizationalUnitName = filial
commonName = meu nome
emailAddress = nome@minhaempresa.com.br
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
EC:21:5A:1C:DB:06:76:1C:5D:AE:F4:0B:7A:5E:20:E7:CB:38:40:98
X509v3 Authority Key Identifier:
keyid:8F:18:83:4C:EF:D9:F0:FD:1A:0E:36:F0:F0:A4:51:53:1F:DC:FC:7E
Certificate is to be certified until Dec 23 21:06:13 2017 GMT (1460 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Enviar o arquivo filial.crt filial.key e raiz.crt para a filial.
caso o cliente não possua ip público na internet como este cenário proposto, envie a chave por e-mail, de preferência use GPG e criptografe a mensagem, ou então leve em um pendrive para a filial, bom enfim, tome cuidado com esses arquivos.
para enviar por ssh
root@servidor:~# scp /etc/openvpn/filial.crt /etc/openvpn/filial.key /etc/openvpn/raiz.crt 200.200.200.2:/etc/openvpn
no cliente vamos gerar parâmetros Diffie Hellman para o servidor
root@servidor:/etc/openvpn# openssl dhparam -out dh1024.pem 1024
arquivo de configuração do servidor, matriz
root@servidor:/etc/openvpn# vim tsl-matriz.cnf
# # Exemplo de arquivo de configuração do OpenVPN para o # escritório usando modo SSL/TLS e certificados/chaves RSA. # # '#' ou ';' podem ser usados para delimitar comentarios. # Usa um device dinamico tun. # Para Linux Kernel 2.2 ou não linux, # você deve usar um device numérico # explicito como "tun1". # OpenVPN também suporta device ethernet # "tap" virtual. dev tun # 10.0.0.1 é o endereço local final da VPN (matriz). # 10.0.0.2 é o endereço remoto final da VPN (filial). ifconfig 10.0.0.1 10.0.0.2 # Esse script irá setar as rotas # assim que a VPN for ativada. ;route add -net 10.0.0.0 netmask 255.255.255.0 gw $5 # Em uma troca de chaves SSL/TLS, matriz irá # assumir a parte do servidor, e a filial # irá assumir a parte do cliente. tls-server # Parametros Diffie-Hellman (apenas no tls-server) dh dh1024.pem # Certificado da Entidade Certificadora ca raiz.crt # Nossa chave publica cert matriz.crt # Nossa chave privada key matriz.key # O OpenVPN usa por padrão a porta 5000 UDP. # Cada tunel OpenVPN deve usar # um numero de porta diferente. # lport ou rport podem ser usados # para configurar diferentes portas # para local e remoto. port 5000 # Muda o UID e GID para # "nobody" depois do inicio # para uma segurança extra. user nobody group nogroup # Se você compilou o OpenVPN com # a compactação LZO, descomente a # linha a seguir. comp-lzo # Envia um ping UDP para a outra ponta # a cada 15 segundos para manter # firewalls stateful connection # ativos. Descomente isso se você usa # um firewall stateful ping 15 # Descomente essa seção para uma detecção mais confiavel de quando # um sistema perde sua conecxão. Por exemplo para modems, ou notebooks # que viajam para outros lugares. ; ping 15 ; ping-restart 45 ; ping-timer-rem ; persist-tun ; persist-key # Nivel de log. # 0 -- silencioso, exeto para erros fatais. # 1 -- quase silencioso, mas mostra erros de rede não fatais. # 3 -- médio, ideal para uso diário. # 9 -- barulhento, ideal para procura de erros. verb 3
[editar] instalando e configurando no cliente
root@cliente:~# apt-get install openvpn
root@cliente:~# cd /etc/openvpn
coloque as os arquivos recebido por e-mail ou do seu pendrive no diretorio do openvpn
arquivo de configuração do cliente
root@cliente:/etc/openvpn# vim tsl-filial.cnf
# # Exemplo de arquivo de configuração do OpenVPN para o # escritório usando modo SSL/TLS e certificados/chaves RSA. # # '#' ou ';' podem ser usados para delimitar comentarios. # Usa um device dinamico tun. # Para Linux Kernel 2.2 ou não linux, # você deve usar um device numérico # explicito como "tun1". # OpenVPN também suporta device ethernet # "tap" virtual. dev tun # 10.1.0.1 é o endereço local final da VPN (matriz). # 10.1.0.2 é o endereço remoto final da VPN (filial rio de janeiro). ifconfig 10.1.0.2 10.1.0.1 # Esse script irá setar as rotas # assim que a VPN for ativada. ;route add -net 10.0.0.0 netmask 255.255.255.0 gw $5 # Em uma troca de chaves SSL/TLS, Escritório irá # assumir a parte do servidor, e a Casa # irá assumir a parte do cliente. tls-client # Certificado da Entidade Certificadora ca raiz.crt # Nossa chave publica cert filial.crt # Nossa chave privada key filial.key # O OpenVPN usa por padrão a porta 5000 UDP. # Cada tunel OpenVPN deve usar # um numero de porta diferente. # lport ou rport podem ser usados # para configurar diferentes portas # para local e remoto. port 5000 # Muda o UID e GID para # "nobody" depois do inicio # para uma segurança extra. user nobody group nogroup # Se você compilou o OpenVPN com # a compactação LZO, descomente a # linha a seguir. comp-lzo # Envia um ping UDP para a outra ponta # a cada 15 segundos para manter # firewalls stateful connection # ativos. Descomente isso se você usa # um firewall stateful ping 15 # Descomente essa seção para uma detecção mais confiavel de quando # um sistema perde sua conecxão. Por exemplo para modems, ou notebooks # que viajam para outros lugares. ; ping 15 ; ping-restart 45 ; ping-timer-rem ; persist-tun ; persist-key # Nivel de log. # 0 -- silencioso, exeto para erros fatais. # 1 -- quase silencioso, mas mostra erros de rede não fatais. # 3 -- médio, ideal para uso diário. # 9 -- barulhento, ideal para procura de erros. verb 3
[editar] considerações
O usuário nobody e grupo nogroup devem existir ou o daemon não inicia.
Lembre-se de liberar em sua firewall a porta 5000 UDP para conexões no servidor.
Lembre-se de liberar no OUTPUT da sua firewall caso tenha controle por interfaces o acesso as redes do OpenVPN.
Para acompanhar o log de conexões e se aconteceu algum erro de configuração, digite o comando abaixo e acompanhe a saída.
root@servidor:~# tail -f /var/log/daemon.log
[editar] referências
- http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2602
- http://www.istf.com.br/vb/showthread.php?t=8624
sobre o openvpn
openvpn utilizando certificados
openvpn para múltiplos clientes, utilizando certificados

