Linux Brasil

Instalação e configuração de uma VPN utilizando o OpenVPN

Olá a todos,

Estou a algum tempo sem postar nada no blog. Porém depois de todo esse tempo, eu vou postar uma informação que eu quebrei muito a cabeça para encontrar, pois eu não encontrei nada completo na net ou alguma configuração funcional.
Explicarei nesse post, como instalar e configurar o OpenVPN Server e Client, em topologia net30, que pelo que eu testei, foi a melhor solução para trabalhar com vários clientes Windows.

Antes de mais nada, essa instalação foi feita em um Debian Squeeze Gnu/Linux, porém a mesma configuração, é válida para Distros baseadas em Red Hat, SUSE, Slackware e, também funciona nos BSD’s (FreeBSD, OpenBSD e NetBSD)..

No Post, não vou entrar em detalhes de como instalar os pacotes do OpenVPN nas distros que não são derivadas do Debian. Caso alguém tenha dúvidas de como instalar os pacotes nas distros que não são baseadas em Debian, deixe sua dúvida que eu terei prazer em ajudá-lo.

Vamos começar, instalando os pacotes do OpenVPN e OpenSSL com isso, o aptitude instalará também o comp-lzo que é o responsável pela compactação dos dados no tunnel VPN.

# aptitude install openvpn openvpn-blacklist openssl openssl-blacklist
Após instalar os pacotes necessários, vamos começar com a configuração do OpenSSL que é o responsável pelos certificados SSL que utilizaremos.
Vamos editar o arquivo de configuração do OpenSSL (openssl.cnf)
# vi /etc/ssl/openssl.cnf
Vamos alterar o arquivo openssl.cnf conforme abaixo:

dir = /etc/ssl/certs
certs = $dir
crl_dir = $dir
database = $dir/index.txt
new_certs_dir = $dir
certificate = $dir/ca.crt
private_key = $dir/ca.key
countryName_default = BR
stateOrProvinceName_default = “SeuEstadoSemEspaço”
0.organizationName_default = “NomeDaEmpresa”
commonName_default = “SeuNome”
emailAddress = “emaildoadm@dominio.com.br”
Essas alterações no arquivo de configuração, nos tira a necessidade de digitar alguns campos na hora de gerar os certificados.

Primeiro vamos gerar o Certificado/Chave de Autoridade Certificadora (CA), porém, vamos fazer os comandos, dentro da pasta certs do OpenSSL para não ter que mover os arquivos depois..

# cd /etc/ssh/certs

Vamos criar dentro da pasta certs, os arquivos

# pwd
/etc/ssl/certs

# touch index.txt
# echo 01 > serial
Vamos ajustar as permissões da pasta da Autoridade Certificadora (CA)

# chmod -R 700 /etc/ssl/certs

Agora Iremos criar o certificado da Autoridade Certificadora (CA)

# openssl req -nodes -new -x509 -keyout ca.key -out ca.crt

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) [SaoPaulo]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Empresa]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
meuemail@qualquercoisa.com []:
Agora, vamos criar o Certificado/Chave da Matriz

# openssl req -nodes -new -keyout matriz.key -out matriz.csr

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) [BR]:
State or Province Name (full name) [SaoPaulo]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Empresa]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
meuemail@qualquercoisa.com []:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Após criar a chave, é necessário assinar a Chave.

# 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: Jun 7 14:55:41 2011 GMT
Not After : Jun 6 14:55:41 2012 GMT
Subject:
countryName = BR
stateOrProvinceName = SaoPaulo
organizationName = Empresa
commonName = AlexCarreira
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
96:BC:6C:0B:BB:77:56:42:11:50:47:63:2F:E2:03:B5:67:75:7C:10
X509v3 Authority Key Identifier:
keyid:C7:C0:44:D4:52:4A:DA:4C:12:CF:3F:26:5C:88:08:44:BB:D9:41:1B
Certificate is to be certified until Jun 6 14:55:41 2012 GMT (365 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

Para gerar Certificado/Chave da Filial

# openssl req -nodes -new -keyout filial.key -out filial.csr
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) [BR]:
State or Province Name (full name) [SaoPaulo]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Empresa]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) [AlexCarreira]:
meuemail@qualquercoisa.com []:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Como no procedimento da Matriz, aqui também necessita que o certificado/chave seja assinado.

# 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: 2 (0x2)
Validity
Not Before: Jun 7 14:58:11 2011 GMT
Not After : Jun 6 14:58:11 2012 GMT
Subject:
countryName = BR
stateOrProvinceName = SaoPaulo
organizationName = Empresa
commonName = AlexCarreira
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
96:BC:6C:0B:BB:77:56:42:11:50:47:63:2F:E2:03:B5:67:75:7C:10
X509v3 Authority Key Identifier:
keyid:C7:C0:44:D4:52:4A:DA:4C:12:CF:3F:26:5C:88:08:44:BB:D9:41:1B
Certificate is to be certified until Jun 6 14:58:11 2012 GMT (365 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

Depois de gerar os certificados, é necessário gerar o protocolo DH (Diffie Hellman) que é o algoritmo usado para a troca de chaves criptografadas durante a execução do OpenVPN.

# openssl dhparam -out dh1024.pem 1024
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
……………………++*++*++*

Vamos colocar uma camada extra de segurança na nossa VPN utilizando uma chave extra

# openvpn –genkey –secret ta.key

Pronto. Todos os certificados/chaves foram criadas. Agora vamos a parte de configuração da matriz.

# pwd
/etc/ssl/certs

# cp -p ca.crt /etc/openvpn
# cp -p matriz.key /etc/openvpn
# cp -p matriz.crt /etc/openvpn
# cp -p dh1024.pem /etc/openvpn
# cp -p ta.key /etc/openvpn

Vamos ajustar as permissões da chave da matriz: matriz.key

# pwd
/etc/openvpn

#chmod 600 matriz.key

Arquivo de configuração:
# Modo do servidor
mode server                        # Modo que o Daemon rodará
tls-server                             # Tipo de Segurança que o Servidor Utilizará na VPN

# Endereço, porta e protocolo
local 0.0.0.0                          # IP que o OpenVPN escutará – No caso Todos.
port 1194                              # Porta que o OpenVPN escutará
proto udp                             # Protocolo de rede utilizado

# Necessario para o funcionamento com Clientes WINDOWS
dev tun                                  # Dispositivo que o OpenVPN utilizará para criar o Tunnel VPN
topology net30                     # Topologia utilizada pelo OpenVPN “net30” utilizada no caso se ter vários clientes Windows

# Usuarios sem permissoes
user nobody                          # Usuário que o OpenVPN utilizarã no Daemon
group nogroup                      # Grupo que o OpenVPN utilizarã no Daemon

# Arquivos de configuraçao dos clientes
client-config-dir /etc/openvpn/clients                    # Arquivo com as configurações dos clientes

# Certificados
ca ca.crt                                   # Certificado geral
cert matriz.crt                          # Certificado do Servidor
key matriz.key                         # Chave de criptografia do servidor
dh /etc/openvpn/dh1024.pem # Parametros DH
tls-auth /etc/openvpn/ta.key 0 # Camada Extra de segurança 0 para server e 1 para client

# Criptografia
cipher AES-128-CBC               # Tipo de Criptografia utilizada

# Ativa persistencia (Key e TUN)
persist-key                                # Persiste na chave
persist-tun                                # Cria tunnel persistente

# Configuração das Redes
server 10.8.0.0 255.255.255.0   # Rede do Tunnel do Servidor
push “route 192.168.0.0 255.255.255.0” # Configura rota para rede
keepalive 10 120                        # Tempo da conexão
ifconfig-pool-persist ipp.txt     # Mantem o mesmo IP do cliente
client-to-client

# Habilitando Compressão no Tunel
comp-lzo                                       # Ativa compactação LZO

# Arquivo contendo o Status das Conexoes
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 6

(EOF)

vamos criar agora, o arquivo ipp.txt que será o arquivo responsável pela configuração de Ips dos clients.

# pwd
/etc/openvpn

# touch ipp.txt

Pronto, o nosso servidor OpenVPN já está funcionando. Vamos iniciá-lo

# invoke-rc.d openvpn start

Antes de falar da configuração do cliente, é necessário baixar o instalador do OpenVPN para Windows, no caso do cliente ser windows, no caso do client ser linux, os arquivos de configuração do openVPN, ficará dentro de “/etc/openvpn”

Para baixar o OpenVPN para Windows, clique em: http://swupdate.openvpn.net/community/releases/openvpn-2.2.0-install.exe

Após baixar, instale o OpenVPN no padrão Windows. Next, Next, Next and Finish. 🙂

Agora, vamos fazer a configuração do cliente. O arquivo de configuração, é muito parecido com o do Servidor, porém algumas linhas, não são necessárias. O arquivo cliente, chama-se “client.ovpn” e no Windows, esse arquivo tem que estar dentro da pasta config do OpenVPN, por exemplo: C:\Arquivos de Programas\OpenVPN\config” na instalação padrão do Windows. Se a sua instalação estiver em caminhos diferentes, altere a letra do drive, caso seja necessário.

mode client                        # Daemon

dev tun                               # Dispositivo utilizado pelo Daemon
proto udp                           # Protocolo utilizado pelo OpenVPN para criar o tunnel
remote 1.2.3.4                    # IP do servidor OpenVPN

resolv-retry infinite
;nobind

# Cria tunnel persistente
persist-key
persist-tun

# Certificados da Filial e arquivo de seguraça extra

ca ca.crt                                                         # Certificado da Autoridade Certificadora
cert filial.crt                                                   # Certificado da filial
key filial.key                                                  # Chave da Filial
tls-auth ta.key 1                                            # Camada Extra de segurança 1 para cliente 0 para servidor

# Criptograia utilizada
cipher AES-128-CBC
ns-cert-type server                                      # Faz comparacao de certificados com o Servidor
comp-lzo                                                        # Ativa compactação LZO

# Ativa Logs – Não funciona em clients Windows
;status %PROGRAMFILES(X86)%\OpenVPN\Log\OpenVPN-status.log
;log %PROGRAMFILES(X86)%\OpenVPN\Log\OpenVPN.log
;log-append %PROGRAMFILES(X86)%\OpenVPN\Log\OpenVPN.log

verb 3

(EOF)

Depois de criar o arquivo de configuração no cominho indicado acima, é necessário copiar o certificado e a chave da filial “filial.crt” e “filial.key”, arquivo “ca.crt” e “ta.key” para a pasta de configuração do cliente.
Depois de criar o arquivo de configuração e copiar os arquivos, vamos iniciar o OpenVPN e conectar na VPN criada.
Caso algum erro seja exibido no console, é necessário fechar o OpenVPN e executá-lo novamente “Como Administrador” para que as rotas de rede sejam criadas.

No caso do cliente ser derivado do Debian Gnu/Linux, pode-se também instalar o gnome-network-manager-openvpn para conectar na VPN pelo console gráfico. As outras distros que utilizam networkmanager GUI, acredito que também tenham um cliente OpenVPN para o console gráfico.

Bom galera, acho que é só. Qualquer dúvida, crítica ou elogios serão bem vindos.

Valeu! Até a próxima

7 Respostas

  1. Daniel Padula

    Muito bom.

    24 de maio de 2013 às 1:34

  2. jhonatan

    obrigado

    28 de maio de 2013 às 14:52

  3. Parabéns… Obrigado.

    20 de junho de 2013 às 9:44

  4. This is a topic that is close to my heart…
    Best wishes! Exactly where are your contact details though?

    25 de junho de 2013 às 1:01

Deixe uma resposta para Wellington Torrejais da Silva Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s