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/
Parabéns pelo Arquivo, foi muito útil… Obrigado.