Configurando VPN site-to-site com OpenVPN

· 11 minutos de leitura

Irei mostrar uma configuração básica de uma VPN Site-to-Site com o OpenVPN

Iremos seguir esse esquema de rede que fiz no GNS3

screenshot

Estou utilizando um SVP - Servidor Virtual Privado (VPS - Virtual Private Server) para demonstrar a instalação e configuração, meu ambiente de instalação é um Debian 8.2.

Distributor ID: Debian Description: Debian GNU/Linux 8.2 (jessie) Release: 8.2 Codename: jessie

Resumo

O OpenVPN é um software livre e open-source para criar redes privadas virtuais do tipo ponto-a-ponto ou server-to-multiclient através de túneis criptografados entre computadores. Ele é capaz de estabelecer conexões diretas entre computadores mesmo que estes estejam atrás de Nat Firewalls sem necessidade de reconfiguração da sua rede. Ele foi escrito por James Yonan e publicado sob licença GNU General Pulic Licence (GPL)

Instale o OpenVPN e também o easy-rsa

1
apt-get install openvpn easy-rsa

Agora entramos no diretório do OpenVPN, utilizamos o comando make-cadir (disponibilizado pelo pacote easy-rsa) para criar um diretório chamado easy-rsa que conterá vários scripts úteis. Entramos no diretório easy-rsa e editamos o arquivos chamado vars.

1
2
3
4
root@wolf:~# cd /etc/openvpn/
root@wolf:/etc/openvpn# make-cadir easy-rsa
root@wolf:/etc/openvpn# cd easy-rsa/
root@wolf:/etc/openvpn/easy-rsa# nano vars

Agora vá ate o final e edite os seguintes valores

1
2
3
4
5
6
7
8
9
# 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="Espirito-Santo"
export KEY_CITY="Vila-Velha"
export KEY_ORG="Butecopensource"
export KEY_EMAIL="[email protected]"
export KEY_OU="buteco.tech"

Após editar o arquivo use:

1
source vars

e depois

1
./clean-all

Criando os certificados

Durante esse processo você será perguntado dos valores para alguns campos, os quais definimos no arquivo vars que ficarao entre colchetes, quando for o Common Name utilize o nome da máquina.

Gerando o certificado da sua unidade certificadora

1
root@wolf:/etc/openvpn/easy-rsa# ./build-ca
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Generating a 2048 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) [Espirito-Santo]:
Locality Name (eg, city) [Vila-Velha]:
Organization Name (eg, company) [Butecopensource]:
Organizational Unit Name (eg, section) [buteco.tech]:
Common Name (eg, your name or your server's hostname) [Butecopensource CA]:
Name [EasyRSA]:
Email Address [[email protected]]:
root@wolf:/etc/openvpn/easy-rsa#

Gerando chave para o Servidor

Gerando a chave para o servidor. Utilize o comando build-key-server seguido do nome do servidor (hostname).

1
root@wolf:/etc/openvpn/easy-rsa# ./build-key-server server
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Generating a 2048 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) [Espirito-Santo]:
Locality Name (eg, city) [Vila-Velha]:
Organization Name (eg, company) [Butecopensource]:
Organizational Unit Name (eg, section) [buteco.tech]:
Common Name (eg, your name or your server's hostname) [server]:
Name [EasyRSA]:
Email Address [[email protected]]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'BR'
stateOrProvinceName :PRINTABLE:'Espirito-Santo'
localityName :PRINTABLE:'Vila-Velha'
organizationName :PRINTABLE:'Butecopensource'
organizationalUnitName:PRINTABLE:'buteco.tech'
commonName :PRINTABLE:'server'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'[email protected]'
Certificate is to be certified until Jan 2 22:29:18 2026 GMT (3650 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
root@wolf:/etc/openvpn/easy-rsa#

Agora vamos gerar uma chave Diffie-Hellman e que será utilizada pelo cliente e servidor durante a troca de chave, pode demorar um certo tempo. Obs: Não gere chave com valor igual o menor que 1024 bits, por padrão esse script gera em 2048 bits

1
root@wolf:/etc/openvpn/easy-rsa# ./build-dh
1
2
3
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
............................+++

Gerando chave para o cliente

Nesse tutorial iremos gerar somente uma chave, para a filial, porém dependendo de como você irá implementar sua VPN você pode criar mais.

1
root@wolf:/etc/openvpn/easy-rsa# ./build-key filial
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Generating a 2048 bit RSA private key
..............................................................................................................+++
......................+++
writing new private key to 'filial.key'
-----
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows/code>
countryName :PRINTABLE:'BR'
stateOrProvinceName :PRINTABLE:'Espirito-Santo'
localityName :PRINTABLE:'Vila-Velha'
organizationName :PRINTABLE:'Butecopensource'
organizationalUnitName:PRINTABLE:'buteco.tech'
commonName :PRINTABLE:'filial'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'[email protected]'
Certificate is to be certified until Jan 2 23:13:45 2026 GMT (3650 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
root@wolf:/etc/openvpn/easy-rsa#

Excluar os arquivos desnecessários

1
rm keys/*.csr

Pronto, agora precisamos pegar os arquivos no servidor e passar cliente,

1
2
3
4
5
root@wolf:/etc/openvpn/easy-rsa# cd keys
root@wolf:/etc/openvpn/easy-rsa/keys# ls
01.pem ca.key filial.key index.txt.attr.old serial.old
02.pem dh2048.pem index.txt index.txt.old server.crt
ca.crt filial.crt index.txt.attr serial server.key

Iremos precisar dos arquivos, filial.crt,  filial.key, dh2048.pem

Você pode copiar esses arquivos com softwares como FileZilla (Linux e Windows) ou WinSCP (Windows).

Configuração do OpenVPN para o servidor

Crie o arquivo /etc/openvpn/server.conf

Caso você cria o nome do servidor direrente de “server”, lembre de mudar o nome do “crt” e “key”

Veja o arquivo de configuração.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
##############################
####### OpenVPN Server #######
####### Site-to-Site##########
##############################
####### DANIEL MAGEVSKI ######
##############################


# Para testar os arquivos de configuracao:
# openvpn --config /etc/openvpn/arquivo.conf

# Para fazer NAT, execute:
# sysctl -w net.ipv4.ip_forward=1
# iptables -t nat -s $IP_REDE/$MASCARA_REDE -A POSTROUTING -o $PORTA_INTERNET -j MASQUERADE


##############################
#     Dados da conexão
##############################


# Interface da VPN
dev tun0
# Endereço IP servidor/filial
ifconfig  $Ip-Servidor $IpFilial

# Protocolo
proto udp

# Porta VPN
port 1194

# Parametro necessario para utilizar conexão com certificados X509
tls-server

# Caminho para o arquivo contendo parametros Diffie Hellman
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

# Local do arquivo de certificado (.crt) da unidade certificadora
ca /etc/openvpn/easy-rsa/keys/ca.crt

# Local do arquivo de certificado (.crt) do servidor
cert /etc/openvpn/easy-rsa/keys/$server.crt

# Local da chave (.key) do servidor. Este arquivo deve ser mantido secreto
key /etc/openvpn/easy-rsa/keys/$server.key

##############################
#   Qualidade da conexão
##############################


# Pinga o host remoto a cada $x segundos sem atividade na rede, se ele
# nao responder por $z segundos a conexão é reiniciada.
# Quando a conexão é interrompida o cliente tenta restabelece-la  periodicamente
# Uso: keepalive $x $z
keepalive 10 120

# Compacta os dados da conexão utilizando o pacote lzo (deve estar
# instalado no host)
# Se estiver habilitado no servidor, o cliente também deve habilitar
comp-lzo

# mantem as chaves carregadas mesmo durante o reinicio do serviço.
persist-key

# mantem o tunel aberto mesmo durante o reinicio do serviço.
persist-tun

# Fica tentando, indefinidamente, resolver o nome do host do servidor. Útil
# em hosts que não estão permanentemente conectados à internet.
resolv-retry infinite

# Mantem o tunel aberto mesmo se o ip do outro host mudar
float

# É uma boa prática diminuir os privilégios do OpenVPN após a inicialização.
user nobody 
group nogroup

# Define o quão verboso será o log.
# 0 é silencioso, exceto por erros fatais
# 4 é rasoável para o uso geral
# 5 e 6 podem ajudá-lo a debugar problemas de conexão
# 9 é extremamente verboso
verb 3


# Informações de status da conexão
status /var/log/openvpn/matriz-staus.log
# Arquivo de log
log-append /var/log/openvpn/matriz.log

##############################
####    Referências   ########
##############################

# http://tobias.ws/blog/acesso-seguro-a-internet-atraves-do-openvpn/
# http://openvpn.net/howto.html#mitm
# http://www.hardware.com.br/tutoriais/openvpn_2/

Agora vamos adicionar a rota, criando um arquivo dentro do diretório /etc/init.d:

1
echo "route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.8.0.1 dev tun0" > /etc/init.d/rota && chmod +x rota && update-rc.d rota defaults

Após criada a rota, será iniciado o serviço:

1
service openvpn start

Precisamos compartilhar a internet do servidor, execute:

1
sysctl -w net.ipv4.ip_forward=1
1
iptables -t nat -s 10.8.0.0/24 -A POSTROUTING -o eth0 -j MASQUERADE

10.8.0.0/24 é a rede da VPN e eth0 é a interface do servidor que está conectada com a internet.

Configuração no cliente

Crie o arquivo client.ovpn e lembre de substituir e $Cliente nos parâmentos cert e key, $Servidor no remote.

Veja o arquivo de configuração.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
##############################
####### OpenVPN Server #######
####### Site-to-Site##########
##############################
####### DANIEL MAGEVSKI ######
##############################

##############################
##### Dados da conexão  ######
##############################


# Define que esta máquina é um cliente
client

# Endereço do servidor
remote  $Servidor 1194 #Por padrão a porta é 1194

# Interface da VPN
dev tun0

# Endereço IP filial/servidor
ifconfig $IpFilial $Ip-Servidor 

# Protocolo
proto udp

nobind

# Se você está conetando à internet através de um proxy HTTP, defina o parâmetro
# http-proxy.
# http-proxy-retry faz com que uma nova tentativa seja feita em casa de falha
# de conexão
;http-proxy-retry
;http-proxy $ip $porta


##############################
#      Certificados X509
##############################

# Local do arquivo dh.pem
dh dh2048.pem

# Local do arquivo de certificado (.crt) da unidade certificadora
ca ca.crt

# Local do arquivo de certificado (.crt) do cliente
cert filial.crt

# Local da chave (.key) do cliente. Este arquivo deve ser mantido secreto
key filial.key


##############################
#   Qualidade da conexão
##############################

# Pinga o host remoto a cada $x segundos sem atividade na rede, se ele
# nao responder por $z segundos a conexão é reiniciada.
# Quando a conexão é interrompida o cliente tenta restabelece-la  periodicamente
# Uso: keepalive $x $z
keepalive 10 120

# Compacta os dados da conexão utilizando o pacote lzo (deve estar
# instalado no host)
# Se estiver habilitado no servidor, o cliente também deve habilitar
comp-lzo

# mantem as chaves carregadas mesmo durante o reinicio do serviço.
persist-key

# mantem o tunel aberto mesmo durante o reinicio do serviço.
persist-tun

# Fica tentando, indefinidamente, resolver o nome do host do servidor. Útil
# em hosts que não estão permanentemente conectados à internet.
resolv-retry infinite

# mantem o tunel aberto mesmo se o ip do outro host mudar
float

##############################
#           Outros
##############################

# Define o quão verboso será o log.
# 0 é silencioso, exceto por erros fatais
# 4 é rasoável para o uso geral
# 5 e 6 podem ajudá-lo a debugar problemas de conexão
# 9 é extremamente verboso
verb 3

# Informações de status da conexão
status openvpn-status.log
#status /var/log/openvpn/matriz-staus.log
# Arquivo de log
;log         openvpn.log
;log-append  openvpn.log


##############################
####    Referências   ########
##############################

# http://tobias.ws/blog/acesso-seguro-a-internet-atraves-do-openvpn/
# http://openvpn.net/howto.html#mitm
# http://www.hardware.com.br/tutoriais/openvpn_2/

Agora vamos adicionar a rota crie um arquivo rota

1
echo "route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.8.0.2 dev tun0" > /etc/init.d/rota && chmod +x rota && update-rc.d rota defaults

Agora vamos acessa-la, entra dentro do diretório onde está as chaves e digite,

1
openvpn client.ovpn

Ele irá imprimir na tela os dados na conexão, se tudo ocorreu bem aparecerá, Initialization Sequence Completed

Qualquer dúvida escreva nos comentários.