Instalando e Configurando o OpenVPN no Debian Squeeze

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

  1. IP Externo da matriz: 200.200.200.1 IP Externo da filial: 200.200.200.2
  2. Rede interna da Matriz: 192.168.10.0/24
  3. Rede interna da filial: 192.168.11.0/24
  4. Rede da vpn 10.254.0.0/24
  5. Interface da vpn: tun0
  6. Liberar o roteamento caso precise acessar outra maquina fora as pontas da vpn echo 1 > /proc/sys/net/ipv4/ip_forward
  7. Não esquecer de mascarar as redes se necessário. iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Matriz

Vamos instalar o openvpn na Matriz primeiramente.

Vamos fazer um update dos repositórios e um upgrade do sistema e depois instalar o nosso openvpn.

aptitude update && aptitude dist-upgrade -y && aptitude install openvpn -y

Vamos copiar alguns arquivo que precisamos para o /etc/openvpn

cp -Rfa /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa

Agora vamos editar o arquivo /etc/openvpn/easy-rsa/vars que contem as variáveis globais que vamos utilizar para todas as chaves.

vim /etc/openvpn/easy-rsa/vars
[...]
export KEY_SIZE=2048

# In how many days should the root CA key expire?
export CA_EXPIRE=3650

# In how many days should certificates expire?
export KEY_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="Curitiba"
export KEY_ORG="Douglas"
export KEY_EMAIL="douglas.q.santos@gmail.com"

Agora temos que carregar as variáveis no ambiente

cd /etc/openvpn/easy-rsa
. ./vars
./clean-all

Agora vamos gerar 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

./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]: ENTER
State or Province Name (full name) [PR]: ENTER
Locality Name (eg, city) [Curitiba]: ENTER
Organization Name (eg, company) [Douglas]: ENTER
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) [douglas]:server
Name []:server
Email Address [douglas.q.santos@gmail.com]: ENTER

Vamos agora gerar as chaves e os certificados do servidor

./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]: ENTER
State or Province Name (full name) [PR]: ENTER
Locality Name (eg, city) [Curitiba]: ENTER
Organization Name (eg, company) [Douglas]: ENTER
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) [server]: ENTER
Name []:server
Email Address [douglas.q.santos@gmail.com]: ENTER

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ENTER
An optional company name []:Douglas
Using configuration from /etc/openvpn/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:'PR'
localityName          :PRINTABLE:'Curitiba'
organizationName      :PRINTABLE:'Douglas'
organizationalUnitName:PRINTABLE:'IT'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'server'
emailAddress          :IA5STRING:'douglas.q.santos@gmail.com'
Certificate is to be certified until Jun 19 11:56:33 2021 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

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

./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...+.................+...................................................................................................................................
.+..................+....................................................................................................................................
...........................................................+.............................................+...................................+...........
......................+.....................................................+..........+................................................................
...........................................+...............................................................................................................
...................+.......................................................................................................................................
................................................................................................................+...............+.........................
.............+................+....+..................................+........................................................................+.......
...........................+.................................................................+.........................................+................
.........................................................................................................................................+................
.....................+...................+...............................................................................................................
.............................................................................+...+.......................................................................
..........................................................................+.....................................+............+..........................
............................................................................................+...........................++*++*

Agora vamos criar uma chave compartilhada.

Criando uma chave compartilhada para servir de tls.

openvpn --genkey --secret keys/shared.key

Arquivo de configuração da matriz arquivo /etc/openvpn/server.conf

vim /etc/openvpn/server.conf
# porta usada para os clientes conectarem no servidor
port    1194

# protocolo usado na conexao
proto   tcp

#Melhorar aplicações remotas
mssfix 1400

# 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.254.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.11.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.10.0 255.255.255.0"

# Redireciona todo o trafego pela vpn utilizando a vpn como default gw do cliente
#push "redirect-gateway def1"

# Podemos definir quais servidor dns e qual servidor wins o cliente vai ter que utilizar
#push "dhcp-option DNS 192.168.10.248"
#push "dhcp-option DNS 192.168.10.249"
#push "dhcp-option WINS 192.168.10.248"

# 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

Agora vamos configurar as chaves e certificados para a nossa filial

cd /etc/openvpn/easy-rsa
./build-key filial1
Generating a 2048 bit RSA private key
.........................................................................................+++
.............................................................................................+++
writing new private key to 'filial1.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]: ENTER
State or Province Name (full name) [PR]: ENTER
Locality Name (eg, city) [Curitiba]: ENTER
Organization Name (eg, company) [Douglas]: ENTER
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) [filial1]: ENTER
Name []:filial1
Email Address [douglas.q.santos@gmail.com]: ENTER

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ENTER
An optional company name []:filial1
Using configuration from /etc/openvpn/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:'PR'
localityName          :PRINTABLE:'Curitiba'
organizationName      :PRINTABLE:'Douglas'
organizationalUnitName:PRINTABLE:'IT'
commonName            :PRINTABLE:'filial1'
name                  :PRINTABLE:'filial1'
emailAddress          :IA5STRING:'douglas.q.santos@gmail.com'
Certificate is to be certified until Jun 19 12:08:46 2021 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

Vamos criar alguns diretórios que são necessários e copiar alguns arquivos.

mkdir /etc/openvpn/{certs,ccd,keys}
cp /etc/openvpn/easy-rsa/keys/*.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa/keys/*.key /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn/keys/

Agora vamos criar o arquivo de rotas

O arquivo /etc/openvpn/ccd/filial1 é responsável por definir rotas individuais para os clientes, ou seja, sem ele, o servidor não vai saber que as maquinas de ambos os lados querem se comunicar e com isso a comunicação fica restrita apenas aos servidores.

echo "iroute 192.168.11.0 255.255.255.0" > /etc/openvpn/ccd/filial1

Agora vamos ajustar as permissões de arquivos e diretórios

cd /etc/openvpn
chown -R nobody:nogroup keys certs ccd
chmod 0400 keys/* certs/* ccd/*

Criando o diretório de log

Precisamos criar o diretório de log, pois nossa configuração salva estas informações em arquivos específicos.

mkdir /var/log/openvpn

Vamos iniciar o nosso servidor openvpn

/etc/init.d/openvpn restart
Stopping virtual private network daemon:.
Starting virtual private network daemon: server.

Agora vamos analisar os logs.

tail -f /var/log/openvpn/openvpn.log 
Wed Jun 22 09:14:26 2011 /sbin/route add -net 10.254.0.0 netmask 255.255.255.0 gw 10.254.0.2
Wed Jun 22 09:14:26 2011 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Wed Jun 22 09:14:26 2011 GID set to nogroup
Wed Jun 22 09:14:26 2011 UID set to nobody
Wed Jun 22 09:14:26 2011 TCPv4 link local (bound): [undef]
Wed Jun 22 09:14:26 2011 TCPv4 link remote: [undef]
Wed Jun 22 09:14:26 2011 MULTI: multi_init called, r=256 v=256
Wed Jun 22 09:14:26 2011 IFCONFIG POOL: base=10.254.0.4 size=62
Wed Jun 22 09:14:26 2011 IFCONFIG POOL LIST
Wed Jun 22 09:14:26 2011 Initialization Sequence Completed

O Lado servidor já está ok.

Agora vamos configurar o lado da filial1, ainda no servidor, pois vamos mover as configurações para a filial via scp ou rsync.

cd /etc/openvpn
mkdir -p filial1/{certs,keys}
cp certs/{ca.crt,filial1.crt} filial1/certs/
cp keys/{filial1.key,shared.key} filial1/keys/

Agora vamos criar o arquivo de configuração da filial /etc/openvpn/filial1/filial1.conf

vim /etc/openvpn/filial1/filial1.conf
# Especifica que este certificado eh de um cliente
client

# Define o ip do servidor para o cliente conectar
remote  200.200.200.1

# porta usada para os clientes conectarem no servidor
port    1194

# protocolo usado na conexao
proto   tcp

#Melhorar aplicações remotas
mssfix 1400

# device usado pelo openvpn
dev tun

# Diz que o certificado foi assinado pelo servidor
ns-cert-type    server

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

# 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 1

# 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/filial1.crt
key keys/filial1.key

# 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

# Ativa a opcao de se conectar, caso o cliente nao esteja na internet, ou
# o mesmo tenha perdido a conexao.
resolv-retry    infinite

# Nao especifica uma porta local para o cliente ouvir.
nobind

# 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/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

Agora vamos empacotar a nossa configuração da filial e enviar para ela as configurações

tar -czvf filial1.tar.gz filial1/
filial1/
filial1/filial1.conf
filial1/keys/
filial1/keys/filial1.key
filial1/keys/shared.key
filial1/certs/
filial1/certs/ca.crt
filial1/certs/filial1.crt

Agora vamos enviar essa configuração para a nossa filial

scp filial1.tar.gz 200.200.200.2:/tmp

Filial

Agora na filial

aptitude update && aptitude dist-upgrade -y && aptitude install openvpn -y
cd /tmp
tar -xzvf filial1.tar.gz
mv filial1/* /etc/openvpn/
rm -rf /tmp/filial1*

Agora vamos criar o diretório que vai armazenas os logs

mkdir /var/log/openvpn

Agora vamos reiniciar a nossa openvpn

/etc/init.d/openvpn restart
Stopping virtual private network daemon:.
Starting virtual private network daemon: filial1.

Agora vamos analisar os logs.

tail -f /var/log/openvpn/openvpn.log 
Wed Jun 22 09:25:19 2011 OPTIONS IMPORT: route-related options modified
Wed Jun 22 09:25:19 2011 ROUTE default_gateway=10.0.0.254
Wed Jun 22 09:25:19 2011 TUN/TAP device tun0 opened
Wed Jun 22 09:25:19 2011 TUN/TAP TX queue length set to 100
Wed Jun 22 09:25:19 2011 /sbin/ifconfig tun0 10.254.0.6 pointopoint 10.254.0.5 mtu 1500
Wed Jun 22 09:25:22 2011 /sbin/route add -net 192.168.10.0 netmask 255.255.255.0 gw 10.254.0.5
Wed Jun 22 09:25:22 2011 /sbin/route add -net 10.254.0.0 netmask 255.255.255.0 gw 10.254.0.5
Wed Jun 22 09:25:22 2011 GID set to nogroup
Wed Jun 22 09:25:22 2011 UID set to nobody
Wed Jun 22 09:25:22 2011 Initialization Sequence Completed

Vamos efetuar testes

Da filial vamos tentar pingar o ip interno da matriz 192.168.10.1

ping 192.168.10.1 -c 3
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_req=1 ttl=64 time=1.42 ms
64 bytes from 192.168.10.1: icmp_req=2 ttl=64 time=1.01 ms
64 bytes from 192.168.10.1: icmp_req=3 ttl=64 time=1.05 ms

--- 192.168.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.015/1.166/1.428/0.187 ms

Tabela de rotas da nossa filial

route -n
Tabela de Roteamento IP do Kernel
Destino         Roteador        MáscaraGen.    Opções Métrica Ref   Uso Iface
10.254.0.5      0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.254.0.0      10.254.0.5      255.255.255.0   UG    0      0        0 tun0
192.168.11.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.10.0    10.254.0.5      255.255.255.0   UG    0      0        0 tun0
10.0.0.0        0.0.0.0         255.255.254.0   U     0      0        0 eth0
0.0.0.0         10.0.0.254      0.0.0.0         UG    0      0        0 eth0

Agora na matriz vamos tentar pingar a rede interna da filial 192.168.11.1

ping 192.168.11.1 -c 3
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
64 bytes from 192.168.11.1: icmp_req=1 ttl=64 time=0.454 ms
64 bytes from 192.168.11.1: icmp_req=2 ttl=64 time=0.853 ms
64 bytes from 192.168.11.1: icmp_req=3 ttl=64 time=0.804 ms

--- 192.168.11.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.454/0.703/0.853/0.180 ms

Tabela de rotas da nossa matriz

route -n
Tabela de Roteamento IP do Kernel
Destino         Roteador        MáscaraGen.    Opções Métrica Ref   Uso Iface
10.254.0.2      0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.254.0.0      10.254.0.2      255.255.255.0   UG    0      0        0 tun0
192.168.11.0    10.254.0.2      255.255.255.0   UG    0      0        0 tun0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.0.0.0        0.0.0.0         255.255.254.0   U     0      0        0 eth0
0.0.0.0         10.0.0.254      0.0.0.0         UG    0      0        0 eth0

NÃO ESQUEÇA DE LIBERAR ROTAMENTO NOS SERVIDORES SE VOCÊ PRECISAR ACESSAR OUTRA MAQUINA FORA AS DUAS PONTAS DA VPN.

echo 1 > /proc/sys/net/ipv4/ip_forward

E CASO ACHE NECESSÁRIO MASCARE AS REDES

iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE

Pronto, seu openvpn esta instalado e matriz/filial estao se comunicando. Não esqueça de liberar no fw da matriz a porta 1194 tcp de sua interface externa e tudo na interface da vpn que é tun0.

Caso necessite configurar mais uma filial, basta seguir os passos da criação das configurações para a filial, alterando é claro o nome de filial1 para filial2 e mais os passos abaixo.

Também não esqueça de inserir mais uma entrada como abaixo no arquivo server.conf.

route 192.168.11.0 255.255.255.0 -> filial1
route 192.168.12.0 255.255.255.0 -> filial2

E precisamos tambem criar mais uma entrada no diretório ccd com a rota para a nova filial

echo "iroute 192.168.12.0 255.255.255.0" > /etc/openvpn/ccd/filial2

Caso precise passar mais rotas para as filiais faça como abaixo.

push "route 192.168.10.0 255.255.255.0"
push "route 192.168.9.0 255.255.255.0"

Caso uma filial precise acessar a outra podemos fazer da seguinte forma.

  1. Filial 3 192.168.3.0/24
  2. Filial 4 192.168.3.0/24

A filial 3 precisa chegar na 4, então vamos inserir a seguinte linha no arquivo de configuração da VPN da filial 3

vim /etc/openvpn/filial3.conf
[...]
route 192.168.4.0 255.255.255.0

E agora no arquivo de configuração da filial4 precisamos fazer o mesmo procedimento

vim /etc/openvpn/filial4.conf
[...]
route 192.168.3.0  255.255.255.0

Com isso as filiais já tem rotas uma para a outra por causa do parâmetro client-to-client na configuração do servidor.

Aqui não podemos de incluir as outras configuração padrões no servidor principal de openvpn, caso precise acessar os servidores das filiais não podemos esquecer de habilitar o repasse de pacotes com o seguinte comando

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

Também precisamos mascarar a rede da vpn que em nosso caso é 10.254.0.0/24 nas filiais com o seguinte comando.

iptables -t nat -A POSTROUTING -s 10.254.0.0/24 -j MASQUERADE

Referências