Skip to main content

Configurando o OpenVPN para múltiplos clientes

Muitas vezes precisamos interligar de forma segura diversos pontos que nao estao próximos fisicamente, ou, devido a algum imprevisto acabamos tendo que acessar remotamente e de forma segura os servidores de algum cliente.

Vou explicar aqui como configurar um servidor OpenVPN para aceitar conexões de múltiplos clientes utilizando certificados gerados com o OpenSSL.

  • Download e instalaçao do OpenVPN

  • Modelo do arquivo openssl.cnf

  • Gerando os certificados

  • Modelo do arquivo servidor.conf

  • Modelo do arquivo cliente.conf

Download e Instalaçao do OpenVPN

Aqui temos aquele mamao com açúcar que a grande maioria sabe de cor e salteado.

## Download do OpenVPN
wget http://openvpn.net/release/openvpn-2.0.9.tar.gz

## Descompactar o conteúdo do arquivo
tar -zxvf openvpn-2.0.9.tar.gz

## Isto é só para a organizaçao
mv openvpn-2.0.9/ /usr/src/

## Compilar e pronto
cd /usr/src/openvpn-2.0.9
./configure --prefix=/usr/local/openvpn
make && make install ## Ou ainda mais simples que tudo isso...
apt-get install openvpn</code>

Sou usuário do Debian e do Ubuntu, entao por questões de comodidade própria ;) vou prosseguir como se tivesse instalado via apt.

Modelo do arquivo openssl.cnf

Vou assumir que você já possui o OpenSSL instalado. Você pode alterar ou até mesmo usar o seu próprio openssl.cnf, estou fornecendo este pra deixar tudo bem completo =). Geralmente este arquivo encontra-se em /etc/ssl/openssl.cnf.

#
# OpenSSL example configuration file.
# This is mostly being used for generation of certificate requests.
#
RANDFILE                = /dev/arandom
[ca]
default_ca              = CA_default
[CA_default]
dir                     = /etc/openvpn
certificate             = $dir/xx.crt
private_key             = $dir/xx.key
serial                  = $dir/serial
database                = $dir/index.txt
new_certs_dir           = $dir/
default_md              = md5
policy                  = policy_match
default_days            = 3500
[policy_match]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
####################################################################
[ req ]
default_bits            = 1024
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
#countryName_default            = AU
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name)
#stateOrProvinceName_default    = Some-State
localityName                    = Locality Name (eg, city)
0.organizationName              = Organization Name (eg, company)
#0.organizationName_default     = Internet Widgits Pty Ltd
# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = CryptSoft Pty Ltd
organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName                      = Common Name (eg, fully qualified host name)
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64
[ req_attributes ]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20
unstructuredName                = An optional company name
[ x509v3_extensions ]
nsCaRevocationUrl               = http://www.cryptsoft.com/ca-crl.pem
nsComment                       = "This is a comment"
# under ASN.1, the 0 bit would be encoded as 80
nsCertType                      = 0x40
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
#nsCertSequence
#nsCertExt
#nsDataType</code>

Gerando os certificados

Certificado da entidade certificadora (apenas um)

openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 3650

Certificado do cliente (um para cada cliente)

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

Parametros Diffie Hellman no servidor.

openssl dhparam -out dh1024.pem 1024

Modelo do arquivo servidor.conf

Como o próprio nome diz, este é o arquivo de configuraçao do servidor. Este arquivo deve ficar localizado em /etc/openvpn. Lembrando que no servidor devemos ter os certificados da unidade certificadora, do servidor e as chaves públicas dos clientes.

port 443 #modifiquei a porta padrao do openvpn
proto tcp
dev tun
ca pmg.crt #certificado da unidade certificadora
cert xx.crt #chave pública do cliente
key xx.key #chave privada do cliente
dh dh1024.pem
client-config-dir ccd #criar o diretorio ccd diretorio no /etc/openvpn
route 10.0.1.0 255.255.255.0
server 10.0.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

Modelo do arquivo cliente.conf

Hum… em qual das máquinas vai este arquivo ?? ;) Claro que é na máquina cliente, no diretorio /etc/openvpn. Lembrando que no cliente devemos ter a chave publica da unidade certificadora, do servidor e as chaves publica e privada do proprio cliente.

dev tun0
proto tcp
remote 111.111.111.11 443 #endereco IP do servidor
nobind
persist-key
persist-tun
ca xx.crt #certificado do orgao certificador
cert xx.crt #certificado publico do cliente
key xx.key #chave privada do cliente
comp-lzo
verb 3

Com essas configurações podemos iniciar o openvpn e sair conectando os clientes. Os endereços IP serao atribua­dos dinamicamente.

openvpn --config /etc/openvpn/servidor.conf --daemon