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

sobre o openvpn

openvpn utilizando certificados

openvpn para múltiplos clientes, utilizando certificados

Ferramentas pessoais