Claudio Borges

Technical blog about Linux, BSD, Mac OS X, Games and etc.

Configurando um servidor de openvpn parte 1

with 8 comments

OpenVPN é um solução completa de VPN. A mesma utiliza SSL para encriptar o tráfego, possui versões para os mais diversos sistemas, tais como: Linux, Todos os BSDs e derivados (isto inclui o Mac OS X e Solaris), Windows 2000/XP/2K3/Vista/7 e sua licença é GPL.

Uma de suas principais vantagens é que você pode trabalhar com qualquer porta tcp/udp, além de poder utilizá-la através de nat. Sua configuração é simples e intuitiva e não necessita de aplicação de patch no kernel.

Este artigo é baseado em debian, mas caso queira, os procedimentos de configuração se aplicam tanto para linux quanto para os bsd, levando em conta claro parâmentos como interface, usuário, grupo e arquivos de log.

Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:

IP Externo da matriz: 189.47.25.20
Rede interna da Matriz: 192.168.0.0/24
Rede interna da filial: 192.168.1.0/24
Interface da vpn: tun0

A instalação do openvpn é bem simples, quem está acostumado com debian bastar utilizar o apt:

server:~# apt-get install -y openvpn

Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”.

Copie o diretório /usr/share/doc/openvpn/examples/easy-rsa para o seu /root/:

server:~# cp -a /usr/share/doc/openvpn/examples/easy-rsa /root/

Edite o arquivo /root/easy-rsa/vars e altere as variáveis a seu gosto:

export KEY_SIZE=2048

export KEY_COUNTRY=BR
export KEY_PROVINCE=SP
export KEY_CITY="Sao Paulo"
export KEY_ORG="Personal OpenVPN Server"
export KEY_ORGNAME="POS"
export KEY_EMAIL="but3k4@gmail.com"

Carregue as variáveis no ambiente:

server:~# cd easy-ca
server:~/easy-rsa# . ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys

Obs: é . ./ mesmo.

Rode o comando clean-all:

server:~/easy-rsa# ./clean-all

Gerando os certificados e chaves:

Certificado de autoridade (CA). Você irá verificar que os valores estão pré-estabelecidos, faltando apenas o Organizational Unit Name e Common Name:

server:~/easy-rsa# ./build-ca
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) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:
server:~/easy-rsa#

Chaves e certificados do servidor

server:~/easy-rsa# ./build-key-server server
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) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           : PRINTABLE:'BR'
stateOrProvinceName   : PRINTABLE:'SP'
localityName          : PRINTABLE:'Sao Paulo'
organizationName      : PRINTABLE:'Personal OpenVPN Server'
organizationalUnitName: PRINTABLE:'POS'
commonName            : PRINTABLE:'server'
emailAddress          : IA5STRING:'but3k4@gmail.com'
Certificate is to be certified until Aug  9 14:41:55 2018 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
server:~/easy-rsa#

Parâmetros Diffie Hellman

Os parâmetros Diffie Hellman são utilizados para a troca encriptada de informações

server:~/easy-rsa# ./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time

....... e espere pois isso pode demorar ........

server:~/easy-rsa#

Chave compartilhada

Criando uma chave compartilhada para servir de tls:

server:~/easy-rsa# openvpn --genkey --secret keys/shared.key
server:~/easy-rsa#

Criando o /etc/openvpn/openvpn.conf:

# /etc/openvpn/openvpn.conf matriz configuration file

# diretorio onde esta os arquivos de configuracao / certificados
cd /etc/openvpn

# porta usada para os clientes conectarem no servidor
port	1194

# protocolo usado na conexao
proto	udp

# device usado pelo openvpn
dev	tun

# Habilita conexoes tls
# Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn
tls-server

# arquivo de chave compartilhada usado pelo tls-server
# O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls
tls-auth	keys/shared.key 0

# Certificado de autoridade
# Tem que ser o mesmo em todos os hosts
# que conectarem a sua vpn
ca	certs/ca.crt

# Certificado e chave privada do servidor
# Cada maquina tem que ter seu certificado e chave
cert	certs/server.crt
key	keys/server.key

# Parametros Diffie-Hellman
dh	keys/dh2048.pem

# Rede usada pelo tunel openvpn
server	10.8.0.0 255.255.255.0

# define o arquivo onde sera guardados os ips que os clientes
# obtiverem na conexao, assim os mesmos sempre irao pegar os 
# mesmos ips
ifconfig-pool-persist	ipp.txt

# define o diretorio onde irao ficar as configuracoes individuais para cada
# cliente, assim você podera habilitar as duas redes se comunicarem.
client-config-dir	ccd

# Define a rota para a rede da matriz poder enxergar a rede da filial
route 192.168.1.0 255.255.255.0

# Define a rota para a rede da filial poder enxergar a rede da matriz
push "route-delay 2 600"
push "route 192.168.0.0 255.255.255.0"

# Aceita os clientes se comunicarem entre si sem a necessidade de um outro tunnel
client-to-client

# Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz
# esta no ar, usado para manter a conexao ativa
ping-timer-rem
keepalive 10 120

# Tipo de criptografia usada
cipher	DES-EDE3-CBC

# habilita compressão no link VPN
comp-lzo

# Numero maximo de clientes (filiais)
max-clients	10

# usuário e grupo sob o qual o openvpn ira rodar
user	nobody
group	nogroup

# Permite um restart sem fechar a conexão e re-ler as chaves
persist-key
persist-tun

# Log de status das conexoes
status	/var/log/openvpn/status.log

# define um arquivo de log, pois o default é o /var/log/syslog
log	/var/log/openvpn/openvpn.log
log-append	/var/log/openvpn/openvpn.log

# Nivel de log
# 0 silencioso, exceto para erros fatais
# 4 razoavel para uso geral
# 5 e 6 podem ajudar a debugar problemas de conexoes
# 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba
verb	3

# desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia
# acima de 20, ele dropa.
mute	20

Por hoje acho que está bom, na parte 2 do artigo irei mostrar como configurar o client e fazer os ajustes finais para você ter um servidor openvpn que atenda matriz, filial e clientes remotos pelo Brasil a fora.

Written by but3k4

January 10th, 2010 at 8:22 pm

Posted in Linux

Tagged with , , ,

8 Responses to 'Configurando um servidor de openvpn parte 1'

Subscribe to comments with RSS or TrackBack to 'Configurando um servidor de openvpn parte 1'.

  1. Claudio muito bom seu artigo, mas coomo ficaria no caso de uma matriz de 2 filiais, 3 redes distintas.

    Elmerson

    28 Jul 10 at

  2. Elmerson, a lógica é igual, crie outro certificado igual fez para a filial1 só que agora com o nome de filial2, depois disto, adicione a rota da filial2, supondo que a rede é 192.168.0.2:

    echo “iroute 192.168.2.0 255.255.255.0” > /etc/openvpn/ccd/filial2

    Restarte o openvpn e tudo vai estar funcionando.

    but3k4

    28 Jul 10 at

  3. Claudio, boa noite, fiz um lab com seu artigo e funciona muito bem a vpn consegui ate resolve nomes pois inicial as estações so respondiam por ip como no meu lab exite um dc coloquei win para registrar as maquinas e funcionou legal.
    Bom agora criei um novo problema no meu lab tenho 2 internet um velox e outra o virtua da net, você poderia me indicar como fazer redundancia de link tenho uma maquina com 3 placas de rede 2 conectadas ao serviço banda larga e a outra na rede interna. Desde já agradeço a sua atenção.

    Elmerson

    23 Sep 10 at

  4. Olá Elmerson,

    Assim possível irei publicar um artigo sobre esta sua dúvida, pois já recebi emails de várias outras pessoas que tem a mesma dificuldade. Recomendo você dar uma lida em iptables mark e tentar utilizar o iproute2 para criar tabelas e assim balancear os links.

    Abraços.

    but3k4

    30 Sep 10 at

  5. Claudio… só consegui montar com duas ou mais filiais colocando uma PORTA diferente para cada filial. não dá para todas se conectarem apenas no 1194? abraços

    Igor

    16 Feb 11 at

  6. Sim dá, segue os mesmos passos para criar uma outra filial mudando apenas os certificados que irá funcionar.

    but3k4

    16 Feb 11 at

  7. Amigo criei os route redefilial 255.255.255.0 e a filial acessa a matriz mais não o inverso, a maquina servidor só pinga no ip da vnp não no local, sabes o que pode ser?

    bruno

    26 Aug 11 at

  8. Peço que reviste todo o artigo, pois você deve ter esquecido de algum passo. Ajudaria bastante se você me mostrasse o resultado do comando route -n tanto no seu servidor quanto no client.

    but3k4

    1 Sep 11 at

Leave a Reply