Site menu OpenVPN - parte 4

OpenVPN - parte 4

Configurando o OpenVPN

Para a configuração do OpenVPN, iremos criar o diretório /etc/openvpn, e iremos colocar lá todas as configurações referentes a ele, inclusive os certificados de segurança. Por esse motivo, restrinja o acesso a esse diretório apenas para o super-usuário.

[root@matriz root]# mkdir /etc/openvpn
[root@matriz root]# chmod 700 /etc/openvpn

Em nosso primeiro exemplo, essa será a topologia de trabalho.

Figura 1: Topologia de rede

A empresa XYZ possui em sua Matriz um link permanente com a internet, e sua filial possui um link ADSL com ip dinâmico. Em ambos os lados, existe um servidor Linux rodando o OpenVPN. A Matriz possui vários servidores, desde SQL até NFS, todos rodando em cima do TCP/IP. Começaremos pela configuração da Matriz.

Em primeiro lugar, vamos criar os certificados publico e privado da Matriz. É através dele que a filial irá criptografar os dados que serão enviados pela VPN. Para isso, gere os certificados com os comandos

openssl req -nodes -new -keyout matriz.key -out matriz.csr
openssl ca -out matriz.crt -in matriz.csr

O primeiro comando, cria um pedido de certificado, e o segundo, faz com que a CA assine o certificado, concordando que o certificado é válido. Da maneira que iremos configurar o OpenVPN, ele irá aceitar qualquer conexão que tenha um certificado válido assinado pela sua CA. Por isso a segurança da sua CA é tão importante. Se ela for comprometida, sua VPN pode entrar em apuros.

[root@toti certificados]# openssl req -nodes -new \
    -keyout matriz.key -out matriz.csr

Generating a 2048 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) [AU]:BR
State or Province Name (full name) [Some-State]:SANTA CATARINA
Locality Name (eg, city) []:JOINVILLE
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    ARP INFORMATICA
Organizational Unit Name (eg, section) []:MATRIZ
Common Name (eg, YOUR name) []:VPN
Email Address []:INFO@ALTORIOPRETO.COM.BR

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@toti certificados]# openssl ca -out matriz.crt -in matriz.csr
Using configuration from /etc/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Oct 31 00:30:24 2003 GMT
            Not After : Oct 30 00:30:24 2006 GMT
        Subject:
            countryName               = BR
            stateOrProvinceName       = SANTA CATARINA
            organizationName          = ALTO RIO PRETO INFORMATICA
            organizationalUnitName    = MATRIZ
            commonName                = VPN
            emailAddress              = INFO@ALTORIOPRETO.COM.BR
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                F1:4A:6C:C7:7D:EB:FD:13:BE:2B:6B:16:91::BA:DE:E4:02
            X509v3 Authority Key Identifier:
                keyid:D7:3B:97:76:AE:AE:E2:C8:5D:46:D7:71:65:36:C5
                DirName:/C=BR/ST=SANTA CATARINA/L=JOINVILLE
                        /O=ALTO RIO PRETO INFORMATICA
			/OU=VPN/CN=ARP
                        /emailAddress=INFO@ALTORIOPRETO.COM.BR
                serial:00

Certificate is to be certified until Oct 30 00:30 2006 GMT (1095 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@toti certificados]#

Com isso você criou 3 arquivos. O matriz.crt, matriz.csr e matriz.key. Você deve copiar os arquivos matriz.crt e matriz.key para o diretório /etc/openvpn do servidor da matriz. O arquivo matriz.csr pode ser descartado. Os arquivos my-ca.crt e dh.pem também devem estar no mesmo diretório! Não se esqueça de copiar eles com alguma segurança, via scp por exemplo. Toda a segurança da sua VPN está nesses arquivos.

Você terá que fazer isso para cada túnel que criar. É tecnicamente possível, usar os mesmos certificados para todos os túneis, entretanto, isso quebraria o esquema de segurança que o OpenSSL fornece.

Agora crie o arquivo de configuração do túnel. Na matriz, chamaremos o arquivo simplesmente de matriz.conf. Se você tiver vários tuneis, pode chamar os arquivos e certificados de joinville-sao_paulo.conf, joinville-florianopolis.crt....

# Exemplo de configuração do OpenVPN
# para a Matriz, usando o modo SSL/TLS e 
# chaves RSA.
#
# '#' ou ';' são comentarios.
#
# Obs: Tradução livre do arquivo
# sample-config-files/tls-office.conf
# no diretorio de sources do OpenVPN.

# Usar como interface o driver tun.
dev tun

# 10.10.0.1 é o nosso IP local (matriz).
# 10.10.0.2 é o IP remoto (filial).
ifconfig 10.10.0.1 10.10.0.2

# Diretorio onde estão todas as configurações
cd /etc/openvpn

# O OpenVPN irá executar esse script
# quando o tunel estiver carregado.
# Ideal para setar as rotas
up ./matriz.up

# No modo SSL/TLS a matriz irá
# assumir a parte do servidor,
# e a filial será o cliente.
tls-server

# Parametros Diffie-Hellman (apenas no servidor)
dh dh.pem

# Certificado da CA
ca my-ca.crt

# Certificado publico da Matriz
cert matriz.crt

# Certificado privado da Matriz
key matriz.key

# OpenVPN usa a porta 5000/UDP por padrão.
# Cada tunel do OpenVPN deve usar
# uma porta diferente.
# O padrão é a porta 5000
; port 5000

# Mudar UID e GID para
# "nobody" depois de iniciado
# para uma segurança exta.
; user nobody
; group nobody

# Envia um ping via UDP para a parte
# remota a cada 15 segundos para manter
# a coneção em firewall statefull
# Muito recomendado, mesmo se você não usa
# um firewall baseado em statefull.
 ping 15

# Nivel dos logs.
# 0 -- silencioso, exeto por erros fatais.
# 1 -- quase silencioso, mas mostra erros não fatais da rede.
# 3 -- médio, ideal para uso no dia-a-dia
# 9 -- barulhento, ideal para solução de problemas
verb 3

É necessário que exista um arquivo chamado matriz.up, que será executado quando a vpn estiver ativa. Vamos usar ele para setar a rota para a rede remota. Ele é chamado com algumas opções via linha de comando. A principio só precisamos saber que o parametro $5 é o ip da VPN da parte remota.

#!/bin/bash
route add -net 10.10.1.0 netmask 255.255.255.0 gw $5

Com o arquivo de configuração criado, e com os certificados copiados, você pode rodar o programa.

[root@matriz root]# /usr/local/sbin/openvpn --config \
     /etc/openvpn/matriz.conf --daemon

[root@matriz root]#

Você deve ter estranhado não ter feito nenhuma saída. Entretanto o OpenVPN já deve estar rodando e esperando por uma conexão remota. Você pode verificar isso, visualizando os logs do sistema.

[root@matriz root]# tail /var/log/messages
Nov  1 00:48:23 matriz openvpn[22083]: OpenVPN 1.4.3
	i686-pc-linux-gnu [SSL] built on Oct 13 2003
Nov  1 00:48:23 matriz openvpn[22083]: UDP link local (bound):
	[undef]:5000
Nov  1 00:48:23 matriz openvpn[22083]: UDP link remote: [undef]
Nov  1 00:48:23 matriz openvpn[22083]: Diffie-Hellman initialized
	with 2048 bit key
Nov  1 00:48:23 matriz openvpn[22083]: Data Channel MTU parms
	[ MUITOS PARAMETROS ]
Nov  1 00:48:23 matriz openvpn[22083]: Control Channel MTU parms
	[ MUITOS PARAMETROS ]
Nov  1 00:48:23 matriz openvpn[22083]: TUN/TAP device tun0 opened
Nov  1 00:48:23 matriz openvpn[22083]: /sbin/ifconfig tun0 10.1.0.1
	pointopoint 10.1.0.2 mtu 1259
Nov  1 00:48:23 matriz openvpn[22083]: ./matriz.up tun0 1259 1300
	10.1.0.1 10.1.0.2
[root@matriz root]#

Agora já podemos configurar a filial.

Parte 5: Configurando a filial -->