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
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:
e depois
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
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:
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,
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.