Openvpn

Introducción

OpenVPN es un cliente / servidor de VPN muy simple de configurar que permite establecer conexiones seguras a través de un medio NO seguro como es internet.
OpenVPN utiliza para realizar los túneles -por donde los datos viajan encriptados/cifrados- a partir de TLS/SSL.

Instalación

Tanto para el cliente como el servidor debe realizarse lo siguiente:

#apt-get install openvpn

Generar certificados para el Cliente

Para configurar un cliente de la VPN se deben generar en el servidor los certificados, luego transferir los mismos a los clientes y configurar el cliente con estos certificados.

Ahora vamos a ver cómo generar un certificado y configurar el archivo que el OpenVPN leerá para levantar la conexión.

Dar de alta un certificado en 10 pasos:

1).- Conectarse al servidor de VPN

2).- Ingresar al directorio "/etc/openvpn/easy-rsa/"

3).- Ejecutar el comando "source vars"

4).- Ejecutar el comando "./build-key <nombre_cliente_vpn>"

5).- Aceptar todos los valores por defecto hasta llegar a "Common name", el dato que se debe ingresar es el "nombre_cliente_vpn" que usamos al ejecutar "build-key"

6).- Seguir ingresando los valores por defecto (incluso, no poner "challenge password") hasta que el sistema pregunta "Sign the certificate?", responder "y"

7).- Responder "y" a la pregunta "…commit?"

8).- Ingresar al subdirectorio "keys/"

9).- Generar un archivo tar.gz con los archivos: ca.crt y "nombre_cliente.*"

10).- Enviar dicho archivo tar.gz al cliente para que configure su software de conexión.

Configurar el archivo cliente

La configuración del archivo cliente debe estar basada en el archivo de ejemplo que trae el openvpn ubicado bajo la siguiente ruta:
/usr/share/doc/openvpn/examples/sample-config-files/client.conf

Al siguiente archivo de configuración se le han quitado los comentarios para hacerlo mas legible, el mismo debe ser ubicado bajo el directorio /etc/openvpn/, cuando el demonio se inicia lee todos los archivos con extensión .conf que se encuetran en su directorio para intentar realizar las conexiones.

#Archivo /etc/openvpn/client.conf

#Aca le decimos que es la config del cliente
client

#Que use el protocolo tcp, podria ser udp
proto tcp

#El tipo de interfaz que genera cuando se levanta la vpn
dev tun

#Las claves y los certificados, ubicados en el mismo dir que este archivo
ca ca.crt
cert clienteXYZ.crt
key clienteXYZ.key

#La IP o nombre del servidor
remote cliente.com.ar

#El tipo de cifrado
cipher AES-128-CBC

#El usuario y grupo con que se conecta
user nobody
group nogroup

#Y estas otras boludeces
verb 2
mute 20
keepalive 10 120
comp-lzo
persist-key
persist-tun
float
resolv-retry infinite
nobind

Configuración del lado del Servidor

Una vez instalado, el paquete nos deja el directorio completamente vacío. Debemos basarnos en los ejemplos y scripts ubicados en /usr/share/doc/openvpn/

Configurar certificados

#cd /etc/openvpn
#cp -a /usr/share/doc/openvpn/examples/easy-rsa .
#cd easy-rsa
#gunzip openssl.cnf.gz

Los scripts que vienen dentro de este directorio nos van a ayudar para
configurar los certificados necesarios, lo primero que hay que hacer
es editar el archivo "vars" algunas variables de interés:

#Increase this to 2048 if you
#are paranoid.  This will slow
#down TLS negotiation performance
#as well as the one-time DH parms
#generation process.
export KEY_SIZE=2048
# 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=AR
export KEY_PROVINCE=Santa-Fe
export KEY_CITY=Santa-Fe
export KEY_ORG="NN"
export KEY_EMAIL="emiliano.lopez@tu-dominio.com.ar"

Estos valores son los que van a ser tomados por defecto por los
comandos de generación de certificados, luego empezamos a crearlos:

etc/openvpn/easy-rsa# . vars
/etc/openvpn/easy-rsa# ./clean-all
/etc/openvpn/easy-rsa# ./build-ca
Using configuration from /etc/openvpn/test/openssl.cnf
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) [AR]:
State or Province Name (full name) [Santa-Fe]:
Locality Name (eg, city) [Santa-Fe]:
Organization Name (eg, company) [NN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:NN-CA
Email Address [emiliano.lopez@tu-dominio.com.ar]:

Con esto lo que hicimos fue crear el certificado de autoridad, luego debemos generar el certificado del servidor, notar que en «Common Name» debe ir server:

/etc/openvpn/easy-rsa# ./build-key-server server
Using configuration from /etc/openvpn/test/openssl.cnf
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) [AR]:
State or Province Name (full name) [Santa-Fe]:
Locality Name (eg, city) [Santa-Fe]:
Organization Name (eg, company) [LUNIX]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:server
Email Address [emiliano.lopez@tu-dominio.com.ar]:
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/test/openssl.cnf
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName           :PRINTABLE:'AR'
stateOrProvinceName   :PRINTABLE:'Santa-Fe'
localityName          :PRINTABLE:'Santa-Fe'
organizationName      :PRINTABLE:'NN'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'emiliano.lopez@tu-dominio.com.ar'
Certificate is to be certified until May  4 20:51:25 2015 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

Del lado del servidor lo que nos queda genera son los parámetros de Diffie Hellman, el algoritmo utilizado para establecer de forma segura una clave común entre dos extremos en un medio no amigable como es el éter citadino, este proceso toma MUCHOS ciclos de CPU, hacerlo en una PC poderosa!

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

…muchos puntitos y simbolitos…

Esto genera el archivo «dh2048.pem» en el mismo directorio que el
resto de las claves.

Por último creamos las claves para un cliente usando el comando «build-key» pasando por parámetro el nombre del cliente (juancito, por ejemplo), que deberá ser ingresado en «Common Name» también, de manera similar a la clave del servidor.

Todas las claves y certificados habrán quedado bajo el subdirectorio «keys/», se pueden dejar en ese directorio sin ningún problema, para las claves del cliente: juancito.crt, juancito.csr y juancito.key, el único archivo que el servidor necesita es el .csr, los demás deben copiarse al cliente (junto con ca.crt) y eliminarse (ca.crt NO!).

Configuración del servidor

El archivo de configuración del servidor se puede tomar del que viene como ejemplo en

/etc/openvpn# zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > server.conf

Después de esto cambiamos los siguientes parámetros para apuntar a los certificados que creamos anteriormente:

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key

dh /etc/openvpn/easy-rsa/keys/dh2048.pem

Además, cambiamos la configuración de la red virtual, definiendo el rango de direcciones asignado a esta VPN. El servidor tendrá asignada la primer dirección del rango:

server 192.168.101.0 255.255.255.0

Si hace falta hacer «push» de rutas a los clientes, se define de esta manera:

#Red perimetral
push "route 192.168.100.0 255.255.255.0"

Si los clientes poseen redes detrás de ellos, y queremos poder accederlas, definimos las siguientes primitivas:
client-config-dir ccd

# Buenos Aires
route 192.168.3.0 255.255.255.0

Además, para poder permitir a la red interna del cliente acceder a la VPN, debemos agregar su rango de IPs a un archivo especial. Supongamos que el cliente se llamará «bsas», entonces debemos editar el archivo «/etc/openvpn/ccd/bsas» para que contenga la siguiente línea:

iroute 192.168.3.0 255.255.255.0

Siguiendo con el archivo «server.conf», debemos establecer el algoritmo de cifrado de datos, descomentar la línea correspondiente para que quede de esta forma (tener que cuenta que debe coincidir con la configuración del cliente):

cipher AES-128-CBC # AES

Unas líneas debajo de esto, hay que corregir el nombre del grupo con el que va a correr el servidor:

group nogroup

Y con esto finaliza la configuración del servidor, nos queda activarlo.

Activación del servicio

Esto se realiza normalmente como cualquier servicio en Debian, pero vale aclarar que OpenVPN busca en el directorio «/etc/openvpn/» todos los archivos con extensión «.conf» y carga una instancia con cada configuración (tanto de servidor como cliente). Si necesitamos que al inicio del sistema sólo se inicie alguna VPN y no todas las definidas entonces debemos editar el archivo «/etc/default/openvpn» para reflejar nuestras preferencias.

Cliente OpenVPN wn windows

Vaya uno a saber por qué el fucking windows no anda con cualquier ip como extremo del tunel.
Las que están permitidas son las siguientes [cliente-servidor]:

[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]

[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]

[ 41, 42] [ 45, 46] [ 49, 50]  [ 53, 54] [ 57, 58]

[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]

[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]

[101,102] [105,106] [109,110] [113,114] [117,118]

[121,122] [125,126] [129,130] [133,134] [137,138]

[141,142] [145,146] [149,150] [153,154] [157,158]

[161,162] [165,166] [169,170] [173,174] [177,178]

[181,182] [185,186] [189,190] [193,194] [197,198]

[201,202] [205,206] [209,210] [213,214] [217,218]

[221,222] [225,226] [229,230] [233,234] [237,238]

[241,242] [245,246] [249,250] [253,254]

Estos son los valores que van en /etc/openvpn/ccd/clienteABC

ifconfig-push 192.168.101.17 192.168.101.18
push "route 10.54.34.0 255.255.255.0"
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License