Lihuen
RSSRSS AtomAtom

Configurando Redes Privadas Virtuales con OpenVPN

OpenVPN es un producto que nos permite crear redes privadas virtuales (VPNs), el tráfico entre los nodos de esas redes se transmite cifrado en una conexión ssl. El servidor puede verificar que los clientes que se conectan sean clientes autorizados gracias al uso de certificados. De la misma manera los clientes pueden verificar que se están comunicando con el servidor real y no con otro equipo que pretende serlo.

Las VPNs son útiles para acceder a lugares protegidos por firewalls o que estén atrás de un router que implemente NAT de forma segura, esto las hace ideales para que los empleados puedan acceder a equipos en sus lugares de trabajo de forma segura.

Este documento será una guía muy breve de los primeros pasos para instalar openvpn, para aprender configuraciones más avanzadas es recomendable leer la documentación en el documentación sitio oficial de OpenVPN

Instalación

Simplemente es necesario instalar el paquete openvpn.

apt-get update
apt-get install openvpn

Como siempre este paquete también puede ser instalado desde el entorno gráfico con Synaptic

Planificando la configuración

OpenVPN asigna una dirección IP a cada nodo de la red, tendremos que elegir una red privada para que OpenVPN asigne direcciones dentro de esa red.

OpenVPN permite la utilización de udp o tcp como protocolos de la capa de transporte para el tráfico de la red privada virtual, dependiendo de las características de nuestra red debemos seleccionar el más apropiado (en general cualquiera de los dos funciona bien).

Es posible permitir o no permitir que los clientes puedan comunicarse entre si a través de la VPN, así que tendremos que elegir una de estas opciones.

Generando Certificados

OpenVPN utiliza certificados para identificar a los clientes y el servidor, antes de empezar a configurar debemos crearlos.

Debemos establecer una PKI (Public Key Infrastructure o Infraestructura de Claves Públicas), una PKI consiste de:

  1. Un certificado (conocido como clave pública) y una clave privada para el servidor y para cada cliente
  2. Una CA (Certificate Authority o Autoridad de Certificación) que se utilizará para firmar los certificados de los clientes y el servidor

Los clientes y el servidor autentican a otros hosts verificando si el certificado que envían fue firmado por la CA, luego una vez autenticado el certificado verifican el resto de la información contenida en él.

Para generar las claves privadas, públicas y la CA utilizaremos una serie de scripts provistos por OpenVPN. Estos scripts se encuentran en /usr/share/doc/openvpn/examples/easy-rsa/.

Primero debemos inicializar el entorno de los scripts cargando las variables guardadas en vars con el shell

cd /usr/share/doc/openvpn/examples/easy-rsa/
. vars

Podemos borrar claves antiguas con

./clean-all

Generamos la CA

./build-ca

Este script nos pide varios datos podemos dejar los valores por defecto para todos los que los tengan o poner los nuestros. El único dato obligatorio es Common Name este valor debe ser ingresado manualmente. Por ejemplo:

Country Name (2 letter code) [KG]:AR
State or Province Name (full name) [NA]:Buenos Aires
Locality Name (eg, city) [BISHKEK]:Florencio Varela
Organization Name (eg, company) [OpenVPN-TEST]:UNLP
Organizational Unit Name (eg, section) []:Lihuen
Common Name (eg, your name or your server's hostname) []:Lihuen-CA
Email Address [me@myhost.mydomain]:

Generamos el certificado para el servidor

./build-key-server

Nos pedirá los mismos datos que antes, en Common Name debemos ingresar la palabra server

Nos pide una contraseña (challenge password) que podemos dejar en blanco si no queremos que nos la pida al iniciar.

Luego hará 2 preguntas a las que debemos contestar y:

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

==Generamos certificados para los clientes Generaremos 2 certificados, notar que hay que para cada cliente hay que elegir un nombre único en Common Name, por ejemplo cliente1, cliente2, cliente3, etc...

./build-key cliente1
./build-key cliente2

Debemos completar los datos pedidos por este script de forma análoga que con el servidor, sólo que elegimos un Common Name distinto para identificar a cada cliente.