OpenVPN

Publicado: abril 22, 2008 em Tutoriais

Tutorial: OpenVPN
Autor: Fábio Rafael (moiza)
Email: fabio.ctba@gmail.com

Necessidade:
A empresa se comunicar com suas filiais e distribuidoras, e até mesmo para o acesso remoto por parte dos membros da empresa (diretoria, vendas, etc).
Umas das grandes vantagens que a VPN nos traz é a redução dos custos, pois utiliza a rede pública (Internet) para tráfego de dados. Devido à existência desta necessidade procuramos implantar um sistema baseado na tecnologia Open Source. O OpenVpn que oferece uma verdadeira segurança para comunicação de dados corporativos. Através deste sistema, todas as conexões são criptografadas e autenticadas, inviabilizando qualquer tentativa de captura dos dados trafegados na rede.
Com este processo implantado, caso algum indivíduo consiga capturar os dados trafegados nesta VPN, este não conseguirá ter acesso ao seu conteúdo, pois os mesmo são criptografados com uma chave forte em bits.

Síntese:‭
Utilização de redes de comunicação não confiáveis para trafegar informações de forma segura. ‭VPN é a abreviatura de Virtual Private Network ou Rede Privada Virtual, é assim chamada por utilizar uma rede pública para trafegar dados privados.

Descrição:
‬As redes públicas são consideradas não confiáveis,‭ ‬tendo em vista que os dados que nelas trafegam estão sujeitos a interceptação e captura.‭ ‬Em contrapartida,‭ ‬estas tendem a ter um custo de utilização inferior aos necessários para o estabelecimento de redes proprietárias,‭ ‬envolvendo a contratação de circuitos exclusivos e independentes. Este é um fator que levou-nos a esse projeto, migrando as unidades interligadas através de MPLS para uma solução mais econômica, não perdendo em performance e segurança. Este projeto teve grande ligação com outro em paralelo o “controle de trafego” que poderá ser consultado aqui mesmo na categoria howto/tutoriais.

Implementação:
A implementação desse serviço envolve a configuração do servidor, a definição dos recursos a serem utilizados e a configuração dos “clientes”.

Pré-requisitos:
* Servidor GNU/Linux Debian instalado, ou outra distro de preferência.
* Pacote OpenVpn
* Iptables

Obs: É aconselhável verificar a versão do Kernel do seu sistema, versões mais novas dos pacotes a serem utilizadas e atualizar seu repositório e depois fazer um bom uso do apt-get.

Instalação:
Para instalar o OpenVPN no Debian Etch, execute o comando debian:
# apt-get install openvpn

Criação dos certificados e das chaves
debian:/# cd /usr/share/doc/openvpn/examples/easy-rsa/

É recomendavel criar um backup do diretório onde vamos criar as chaves
debian:/usr/share/doc/openvpn/examples/easy-rsa# cp -r 2.0/ 2.0-default

Edite o arquivo vars e altere os dados necessários. Abaixo um exemplo
debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0# vi vars

===========================================
# generation process
export KEY_SIZE=1024

# In how many days should the root CA key expire?
export CA_EXPIRE=3650

# These are the default values for fields
# which will be placed in the certificate.
# Don’t leave any of these fields blank.
export KEY_COUNTRY=”BR”
export KEY_PROVINCE=”PR”
export KEY_CITY=”Umuarama”
export KEY_ORG=”Home Moiza”
export KEY_EMAIL=”fabio.ctba@gmail.com”
===========================================

#####################
Gerando as chaves para o servidor:
#####################

###Primeiro Passo###

debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0# . ./vars

debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./clean-all

debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-ca
Generating a 1024 bit RSA private key
……………….++++++
…………………..++++++
writing new private key to ‘ca.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [BR]:
State or Province Name (full name) [PR]:
Locality Name (eg, city) [Umuarama]:
Organization Name (eg, company) [Home Moiza]:
Organizational Unit Name (eg, section) []:Depto Informatica
Common Name (eg, your name or your server’s hostname) [Home Moiza CA]:
Email Address [fabio.ctba@gmail.com]:
debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0#

###Segundo Passo###

debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-key-server server
Generating a 1024 bit RSA private key
……………++++++
…++++++
writing new private key to ‘server.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) [PR]:
Locality Name (eg, city) [Umuarama]:
Organization Name (eg, company) [Home Moiza]:
Organizational Unit Name (eg, section) []:Depto Informatica
Common Name (eg, your name or your server’s hostname) [server]:
Email Address [fabio.ctba@gmail.com]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ——— Não entre com nenhuma senha
An optional company name []: —— Não entre com nenhuma senha

Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’BR’
stateOrProvinceName :PRINTABLE:’PR’
localityName :PRINTABLE:’Umuarama’
organizationName :PRINTABLE:’Home Moiza’
organizationalUnitName:PRINTABLE:’Depto Informatica’
commonName :PRINTABLE:’server’
emailAddress :IA5STRING:’fabio.ctba@gmail.com’
Certificate is to be certified until Apr 20 12:41:25 2018 GMT (3650 days)
Sign the certificate? [y/n]:y ——– Coloque y (yes)

1 out of 1 certificate requests certified, commit? [y/n]y ——- Coloque y (yes)
Write out database with 1 new entries
Data Base Updated
debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0#

####################
Gerando as chaves para o Cliente:
####################

Obs: Usa-seo mesmo procedimento para criar para outros clientes, neste ex. estamos criando para o “cliente1”.

debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-key cliente1
Generating a 1024 bit RSA private key
….++++++
………….++++++
writing new private key to ‘cliente1.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) [PR]:
Locality Name (eg, city) [Umuarama]:
Organization Name (eg, company) [Home Moiza]:
Organizational Unit Name (eg, section) []:Depto Informatica
Common Name (eg, your name or your server’s hostname) [cliente1]:
Email Address [fabio.ctba@gmail.com]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ——- Não entre com nenhuma senha, apenas
An optional company name []: —— Não entre com nenhuma senha, apenas
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’BR’
stateOrProvinceName :PRINTABLE:’PR’
localityName :PRINTABLE:’Umuarama’
organizationName :PRINTABLE:’Home Moiza’
organizationalUnitName:PRINTABLE:’Depto Informatica’
commonName :PRINTABLE:’cliente1′
emailAddress :IA5STRING:’fabio.ctba@gmail.com’
Certificate is to be certified until Apr 20 12:49:36 2018 GMT (3650 days)
Sign the certificate? [y/n]:y ——- Coloque y (yes)

1 out of 1 certificate requests certified, commit? [y/n]y ——- Coloque y (yes)
Write out database with 1 new entries
Data Base Updated
debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0#

Verificando a criação das Chaves elas ficam criadas em:
debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0/keys# —— Caminho

debian:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
……………………………………………………….
……………………………………………………….
………………..+…………+……………….+……….

##########################
Arquivo de configuração do Server/Gateway
##########################

Obs: O arquivo de configuração do gateway, a ser criado em /etc/openvpn/, poderá ter qualquer nome, desde que a extensão de tal arquivo seja .conf (aqui vamos usar server.conf)

No Debian, após instalar o pacote OpenVPN, é criado o diretório /usr/share/doc/openvpn/, que conterá diversas informações é um guia de exemplo, comentado, do arquivo de configuração do OpenVPN.

debian:/# vi /etc/openvpn/server.conf
================INICIO================
port 1194
proto udp
dev tun

ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem

client-config-dir ccd

server 10.8.0.0 255.255.255.0
push “route 192.168.1.0 255.255.255.0”
up ./server.up

ifconfig-pool-persist ipp.txt
client-to-client

keepalive 10 120

cipher AES-128-CBC

comp-lzo
max-clients 15
user nobody
group nobody

persist-key
persist-tun
verb 3
status /var/log/openvpn-status.log ——- verifique a criação desse arquivo.
log /var/log/openvpn.log ——- verifique a criação desse arquivo.
log-append /var/log/openvpn.log ——- verifique a criação desse arquivo.

================FIM===============

O arquivo /etc/openvpn/ipp.txt é o arquivo responsável por setar qual será o ip do cliente na rede Vpn.

debian:/etc/openvpn# cat ipp.txt
cliente1,10.8.0.10

O arquivo /etc/openvpn/server.up é o arquivo responsável para setar a rota server para o client, deixe-o com permissão de execução (#chmod 777 /etc/openvpn/server.up)

debian:/etc/openvpn# cat server.up
route add -net 192.168.2.0 netmask 255.255.255.0 dev tun0

Dentro da pasta /etc/openvpn deve conter um diretório com o nome ccd e dentro desse um subdiretório contendo um arquivo para cada cliente especificando a rota para o cliente server.

debian:/etc/openvpn/ccd# cat cliente1
ifconfig-push 10.8.0.10 10.8.0.1
iroute 192.168.2.0 255.255.255.0

Agora precisamos mover as chaves do server para o diretório /etc/openvpn/keys
OBS: As chaves se encontram em /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys

debian:/etc/openvpn# mv /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/ .

Inicialização do serviço:

Para inicializar o serviço, utilize o comando a seguir:
Obs: Antes de inicializar verifique o se possui o group nobody em seu /etc/group ;-)

debian:/# /etc/init.d/openvpn start
Starting virtual private network daemon: server(OK).

Caso o OpenVPN não tenha inicializado corretamente, verifique o motivo no log (/var/log/openvpn.log)
Verifique se o OpenVPN no gateway inicializou corretamente. Utilize o comando:

debian:/# ps ax |grep openvpn
4076 ? Ss 0:00 /usr/sbin/openvpn –writepid /var/run/openvpn.server.pid –daemon ovpn-server –cd /etc/openvpn –config /etc/openvpn/server.conf

Agora basta mascarar a Lan, veja o exemplo abaixo com o Iptables:
Crie um script em /etc/init.d/firewall.sh com o seguinte conteúdo abaixo, de permissão de execução, e coloque no boot do sistima para iniciar automaticamente.

===============INICIO================
#!/bin/bash
stop ()
{
echo “0” > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -F -t nat
}

start ()
{

echo 1 > /proc/sys/net/ipv4/ip_forward

# Regras para OpenVpn
iptables -A INPUT -i eth0 -p tcp –dport 1194 -j ACCEPT
iptables -A INPUT -i eth0 -p udp –dport 1194 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 1194 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp –sport 1194 -j ACCEPT

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -o tun+ -j ACCEPT

# Habilitando Masquerade
iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE

}

if [ $# -lt 1 ]; then
echo “$1 { start | stop | restart }”;
exit 1;
fi

if [ $1 == “start” ]; then
echo “Iniciando o servidor firewall … “;
start;
fi

if [ $1 == “stop” ]; then
echo “Parando o servidor firewall … “;
stop;
fi

if [ $1 == “restart” ]; then
echo “Parando o servidor firewall … “;
stop;
echo “Iniciando o servidor firewall … “;
start;
fi

===============FIM================

##############################
Configuração dos Clientes OpenVPN em GNU/Linux
##############################

Obs: Cada máquina cliente terá que ser configurada, individualmente:
Lembre-se que já havíamos criado a chave e certificados para o cliente1:

Assim como no Server/Gateway a estrutura dos diretórios podem seguir o mesmo esquema.
Então copie as chaves criadas para /etc/openvpn/keys

cliente1.crt ——- Certificado do cliente
cliente1.key —— Chave privada do cliente
ca.crt —— Certificado raiz da CA

Altere as permissões dos arquivos gerados para ter mais segurança:

# chmod 644 /etc/openvpn/keys/cliente1.crt
# chmod 400 /etc/openvpn/keys/cliente1.key
# chmod 644 /etc/openvpn/keys/ca.crt

Instalação do OpenVPN:

Da mesma forma que foi feito no servidor, instale o OpenVPN com o comando a seguir:

debian:/# apt-get install openvpn

Arquivo de configuração do cliente:

debian:/# vi /etc/openvpn/client.conf

===============INICIO================
client
dev tun
proto udp

remote 200.XX.XX.XX 1194
resolv-retry infinite
nobind
ping 15

persist-key
persist-tun

ca keys/ca.crt
cert keys/parati.crt
key keys/parati.key

cipher AES-128-CBC

ns-cert-type server
comp-lzo
verb 3

status /var/log/openvpn-status.log ——- verifique a criação desse arquivo.
log /var/log/openvpn.log ——- verifique a criação desse arquivo.
log-append /var/log/openvpn.log ——– verifique a criação desse arquivo.

===============FIM================

Inicialização do cliente OpenVPN em GNU/Linux:

Para inicializar o serviço, utilize o comando a seguir:
Obs: Antes de inicializar verifique o se possui o group nobody em seu /etc/group ;-)

debian:/# /etc/init.d/openvpn start
Starting virtual private network daemon: server(OK).

Verifique se o OpenVPN no cliente inicializou corretamente. Utilize o comando:
debian:/# ps ax |grep openvpn

Caso o OpenVPN não tenha inicializado corretamente, verifique o motivo no log /var/log/openvpn.log.

Teste da conexão:
Para testar a conexão, “pingue” um endereço IP que pertença à rede a ser acessada.

Pode-se montar a mesma configuração do server para mascaramento.

#################################
Configuração dos clientes OpenVPN em MS Windows XP
#################################

Obs: Cada máquina cliente terá que ser configurada, individualmente:
Lembre-se Já havíamos criado a chave e certificados para o cliente1: (vamos usar o mesmo para exemplo).

Baixe e instale o pacote OpenVPN GUI para MS Windows versão estável, aconselhável fazer a instalação padrão, que deverá ocorrer em C:\Arquivos de Programas\OpenVPN

A instalação dos certificados e das chaves no cliente deverão ficar no diretório C:\Arquivos de Programas\OpenVPN\config:

cliente1.crt —— Certificado do cliente
cliente1.key —— Chave privada do cliente
ca.crt —— Certificado raiz da CA

Um exemplo do arquivo de configuração do cliente:

O arquivo C:\Arquivos de Programas\OpenVPN\sample-config\client.ovpn é um exemplo, comentado, de arquivo de configuração do OpenVPN. É com base nele que deverá ser gerado o arquivo de configuração da vpn no cliente. O arquivo final também ficará em C:\Arquivos de Programas\OpenVPN\config\ e a sua extensão tem que ser .ovpn.

Abaixo, um exemplo do arquivo de configuração do cliente:

===============INICIO================
client
dev tun
proto udp

remote 200.XX.XX.XX 1194
resolv-retry infinite
nobind
ping 15

persist-key
persist-tun

ca keys/ca.crt
cert keys/parati.crt
key keys/parati.key

cipher AES-128-CBC

ns-cert-type server
comp-lzo
verb 3

status openvpn-status.log # comente esta linha se for utilizar o OpenVPN GUI
log openvpn.log # comente esta linha se for utilizar o OpenVPN GUI
log-append openvpn.log # comente esta linha se for utilizar o OpenVPN GUI

===============FIM================

Inicialização do cliente Windows XP:

Para inicializar o cliente pelo OpenVPN GUI (método aconselhado), clique com o botão direito do mouse sobre o ícone do mesmo, existente no SysTray, conforme e escolha a opção Connect

Caso o OpenVPN não tenha inicializado corretamente, verifique o motivo no log openvpn.log em C:\Arquivos de Programas\OpenVPN\config

Teste da conexão
Para testar a conexão, “pingue” um endereço IP que pertença à rede ou tente acessar um site da mesma.

========
Referências:
http://openvpn.net/howto.html
http://eriberto.pro.br/wiki/index.php?title=Interliga%C3%A7%C3%A3o_de_redes_com_OpenVPN
http://eriberto.pro.br/wiki/index.php?title=Autoridade_Certificadora_%28CA%29_com_o_OpenSSL
http://www.gta.ufrj.br/grad/01_2/mpls/mpls.htm
http://openvpn.se/

comentários
  1. Parabéns pelo Arquivo, foi muito útil… Obrigado.

Deixe um comentário