Tutorial: Implementación de VPN "Cliente-Servidor" con OpenVPN y pfSense

En el siguiente tutorial se explica como implementar la funcionalidad de VPN "Cliente-Servidor" con OpenVPN y pfsense.

Versión de pfSense:

Introducción

Sobre OpenVPN

OpenVPN fué creado en 2001, y actualmente es el estandar a nivel seguridad y performance habiendo desplazado a protocolos como PPTP y L2TP que demostraron ser vulnerables y no tan rápidos.
En los siguientes links puedes encontrar comparativas entre OpenVPN, L2TP y PPTP: link1 y link2
OpenVPN es actualmente compatible con todos los sistemas operativos.

Autenticación

OpenVPN implementa SSL/TLS mediante certificados RSA que se considera mucho más seguro que la utilización de claves precompartidas. Es posible también la implementación de OpenVPN en conjunto con LDAP o Radius para el manejo de usuarios y permisos, pero en este tutorial se utilizará la autenticación Local en el pfSense.

Vamos a necesitar:

  • Certificado Raiz: utilizado para generar los certificados clientes, en nuestro caso generaremos uno propio, por lo tanto seremos nuestra propia entidad certificadora, sin embargo también se podría utilizar una CA externa.
    [A partir de ahora: OpenVPN-CA]

  • Certificado Cliente para el pfSense: que únicamente deberá estar en el pfSene.
    [A partir de ahora: OpenVPN-Servidor]

  • Certificados Clientes para usuarios, es necesario un certificado para cada usuario que acceso.
    [A partir de ahora: OpenVPN-Usuario]

Clientes

Para conectarse al Servidor, es necesario un cliente de conexión. Vamos a utilizar el paquete “OpenVPN Client Export Utility” que nos permite generar instaladores y packs de configuración para cada nuevo usuario desde el pfSense:
El paquete está conformado por:

  • El instalador de openvpn (software)
  • El archivo de configuración con los datos de la vpn
  • Los certificados necesarios para conectarse al servidor Sin embargo, el módulo no siempre mantiene las últimas versiones de los instaladores de OpenVPN; por lo que es importante chequearlo. Para evitar este problema, utilizaremos el módulo exportador únicamente para generar un zip con la configuración para de usuario (certificados + archivo de configuración), e instalaremos OpenVPN a mano. Luego simplemente hay que copiar en la carpeta de configuración del cliente dichos archivos.
Servidor

Es importante tener en cuenta, que en pfSense es posible configurar uno o más "servicios" o servidores de OpenVPN con diferentes configuraciones (por ejemplo diferentes métodos de autenticación, diferente puerto de escucha, diferentes redes a las que dará acceso, etc) y mantenerlos funcionando a la vez, lo que nos permite una máxima flexibilidad a la hora de diseñar los accesos a nuestra red.

Topología

Nuestro pfSense cuenta con 3 Interfaces: WAN (numeración pública), LAN (segmento de usuarios en la red) y DMZ (segmento de servidores en la red). La configuración que crearemos dará acceso a la red LAN (192.168.1.0/24).

Resumen

Los pasos que vamos a seguir para la implementación son:

  1. Creación de Certificado Raiz (CA)

  2. Creación de Certificado Servidor

  3. Configuración del Servidor

  4. Creación de Usuario + Certificado

  5. Instalación de Cliente

Implementación

Los pasos 1, 2 y 3 los realizaremos mediante el asistente de pfSense. Para comenzar vamos al menú VPN, luego OpenVPN y por último a la solapa Wizards, que nos abrirá el asistente de configuración.

  1. Seleccionamos el tipo de Servidor, que en nuestro caso será Local User Access, ya que los usuarios los crearemos y manejaremos mediante el pfSense. Como explicamos antes, también es posible configurarlo con un servidor LDAP o Radius. Next.

  2. El próximo paso será la configuración del Certificado Raiz (la entidad certificadora).Este certificado será utilizado para luego crear el certificado del servidor y los certificados de usuarios.

Si ya existen CAs cargados en el pfSense el asistente nos dejará seleccionar uno (los mismos se pueden crear desde el menú System –> Cert Manager) o también crear uno nuevo; y en caso de no existir ninguno como en el nuestro, directamente nos llevará a la creación de uno:

Completar la información requerida respecto a la organización, el Key Lenght recomiendo utilizar 2048 ya que es optimizado entre seguro y performante, y el Lifetime es el tiempo de validez. Add new CA.

  1. Ahora es necesario crear el certificado para el servidor, que será creado a partir de la entidad certificadora creada en el paso anterior.

Si ya existieran certificados creados podríamos simplemente seleccionar uno, en nuestro caso, nos llevará directo a la creación de uno. La mayoría de los datos ya estarán completos basados en los datos de la CA. Faltaría completar el nombre y un correo.

Con los datos completos le damos click a Create new Certificate.
  1. A cotinuación el asistente nos lleva a la configuración del Servidor, que se divide en 4 categorías:

a. General OpenVPN Server Information:

Contiene la configuración de la interface que atenderá las conexiones (en nuestro caso llegarán desde internet a la interface wan), el puerto y el protocolo que utilizaremos, en nuestro caso los default (en caso de cambiarlos, será necesario también cambiarlos en los clientes). No está demás aclarar, que si quisieramos agregar otro Servidor VPN (algo así como otra instancia de OpenVPN), tendremos que elegir otro puerto.

También será necesario una regla de firewall que permita las conexiones entrantes a ese puerto y procolo en la interface WAN, que crearemos luego.

b. Cryptographic Settings:

La configuración criptográfica que utilizaremos es la default, ya que nuevamente consideramos que brinda un buen nivel de seguridad y de performance.

c. Tunnel Settings:

Aquí setearemos la configuración propia del tunel, esta configuración es importante.

Tunnel Network, será la red que crearemos para los clientes que se conecten. Por lo tanto, con esta configuración estamos definiendo el rango de numeración que se le asginarán a los clientes al conectarse y también la ip de la interface virtual que será la primera de dicha red. Se deberá utilizar una red que no esté ya utilizada para evitar problemas de ruteo. En nuestro caso utilizaremos 10.0.1.0/24 (entonces, la interfaz virtual que se creará tendrá la 10.0.1.1 y los clientes que se conecten tendrán una dirección asignada entre la 10.0.1.2 y la 10.0.1.254).

Local Network, define la red a la que daremos acceso y que por ende, será ruteada en los clientes a través de la vpn. En nuestro caso, tal cual los descripto en el apartado Topología, configuraremos la red 192.168.1.0/24.

También se puede utilizar la opción Redirect Gateway, que lo que hará básicamente es rutear todo el tráfico del cliente por la VPN, esto hará que todas las conexiones que se generen se envien al tunel, incluso por ejemplo las peticiones a numeración pública (navegación web por ejemplo), entonces utilizará la salida del pfSense también para navegar. A veces se utiliza este método para dar un mayor nivel de seguridad a la red, evitando que el usuario “puentee” su salida a internet con la red a la que se está conectando saltéandose las restricciones que por ejemplo puedan estar configuradas en el proxy de navegación web. Nosotros no utilizaremos está opción para evitar que se utilice nuestra salida a internet para navegar u otros, y que el usuario únicamente nos envíe el tráfico destinado a nuestra red.

Podemos agregar un límite de conexiones concurrentes como medida de seguridad adicional o para asegurar la performance del equipo (cuanto más usuarios conectados, mayor uso de procesador).

También habilitaremos la compresión que hace mucho más performante la conexión.

d. Client Settings:

Por último las configuraciones que afectarán a los clientes que se conecten. Setearemos la opción Adress Pool, que afirma la configuración del Tunnel Network, o sea, hahbilita a que los clientes reciban una ip de la red definida (10.0.1.0/24). Si no caerían con su numeración pública, y esto es algo que no queremos porque perdemos control, por ejemplo a nivel acls.

Además setearemos el servidor dns, que en nuestro caso es el propio pfSense, para que el cliente pueda resolver nombres internos.

No necesitamos setear nada más, por lo que damos a la opción Next.

  1. El próximo paso nos permite agregar automáticamente la regla que permite el tráfico desde internet al puerto y protocolo configurado en el paso anterior.

Además nos permite agregar o no, una regla en la nueva interface que creará el pfSense, la 10.0.1.0/24, donde caerán los usuarios conectados, si seleccionamos esta opción, la regla que se creará sera de origen ANY, destino ANY, y puerto y protocolo también ANY. Ya que nosotros no quremos dar acceso a los usuarios que se conecten a la red DMZ y sólamente a la red LAN, no seleccionaremos esta opción y crearemos la regla a mano. Pueden seleccionar esta opción si no desean aplicar restricciones.

Cuando le demos Next, el asistente finaliza e indica que fué configurado el servidor correctamente.

  1. Si ahora vamos al menú Firewall, y luego a Rules, veremos que se ha agregado la regla en la interface WAN, que permite todas las conexiones al puerto UDP/1194 y además que se ha creado una nueva solapa OpenVPN, donde manejaremos las reglas asociadas a todos los servidores OpenVPN:

Cuando vayamos a la solapa OpenVPN, estará vacía sin ninguna regla, pero en caso de que hayan seleccionado la opción que crea la regla automáticamente, aparecerá una regla permitiendo todo el tráfico. Nosotros creamos la regla a mano y quedará de la siguiente forma:

Usuarios

Ahora crearemos un usuario habilitad0 para conectarse, en nuestro caso también generaremos un grupo OpenVPN, para incluir en el a este usuario y a todos los que creemos para conectarse a la VPN. Esto sirve para que administrativamente sepamos que usuarios tienen acceso a la VPN, además de poder asginar permisos de pfSense a todos los usuarios a la vez, por ejemplo para permitir el acceso a algún módulo de pfSense como el de cambio de Password.

  1. Vamos al menú System, User Manager y luego a la solapa Groups. Allí buscamos el ícono de agregar (+) y creamos el grupo:

Le damos Save para crear.

  1. Para crear un usuario, volvemos a la solapa Users, y nuevamente vamos al ícono de agregar (+):

Configuraremos las opciones básicas como el nombre de usuario, el nombre completo, la contraseña, la asociación al grupo que creamos antes, y en nuestro caso también seteamos una fecha de expiración que será a fin de año.

Seleccionamos la opción de crear certificado, y nos expanderá más opciones:

Debemos poenerle un nombre al certificado y elegir la entidad certificadora que creamos anteriormente.

Le damos Save y nos creará el usuario y su certificado automáticamente.

Podemos ir luego al menú System, a la opción Cert Manager para comprobarlo.

En la solapa CA, veremos la entidad certificadora que creamos:

Y en la solapa Certificates veremos el certificado del Servidor que creamos anteriormente, y el certificado del usuario gabriel que acabamos de crear. (También veran un certificado default que es que se utilizan al conectarse vía HTTPS al WebConfiurator).

Clientes:

El servidor ya se encuentra configurado y el usuario creado, ahora nos toca configurar el cliente que se conectará con el usuario gabriel.

Para esto es necesario instalar el cliente OpenVPN en el o los equipos que se conectarán y luego cargarle la configuración del servidor y la del usuario.

Para ayudarnos en la configuración de los clientes, instalaremos también el paquete “OpenVPN Client Export Utility” que nos permite exportar los zips de configuración para cada usuario de manera muy sencilla.

Por lo tanto, en primer lugar, instalemos el paquete desde el menú System, opción Packages y luego la solapa Available Packages. Buscamos el paquete y le damos al ícono de agregar (+).

Una vez instalado, se agrega en el apartado de OpenVPN (menú VPN, opción OpenVPN), una nueva solapa Client Export:

Si hicimos todo bien, verán también en la última parte de la página, los nombres de usuario que están asociados al certificado de la VPN y de donde podremos exportar los clientes para cada sistema operativo, o la “Standard Configuration” que nos da un zip con el archivo de configuración de openvpn (*.opvn) y los certificados del usuario para permitir la conexión. Este zip debe incorporarse a la carpeta de configuración del cliente OpenVPN de la pc que va a realizar la configuración y con esto ya se podrá conectar.

Instalación de Cliente OpenVPN en Windows

  1. Descargamos el Cliente OpenVPN desde el sitio oficial http://openvpn.net/index.php/open-source/downloads.html. Tenemos disponible la versión de 32 o 64 bit, según corresponda. Descargamos la necesaria.

    Es importante mantener el cliente de conexión actualizado, para asegurar la máxima protección del enlace.

  2. Realizar la instalación. La misma instalará una nueva interface, por lo tanto será necesario permisos de administrador para hacerlo, que solicitará durante el proceso.

  3. Debemos exportar con el módulo instalado anteriormente los archivos de configuración para el usuario que se va a conectar.

  4. Finalizada la instalación, hay que ir al PATH de instalación y a la carpeta Config, en nuestro caso es C:\Program Files\OpenVPN\config, allí copiamos los archivos de configuración y certificados que descargamos con el OpenVPN Client Export Utility.

  5. Ejecutamos el cliente OpenVPN GUI, que se abrirá y se mantendrá minimizado en la barra del reloj. Al hacer click con el boton derecho sobre el mismo, tendremos la opción Connect (en caso de que tengamos más de una configuración VPN, veremos todas las disponibles con su respectiva opción Conect).

    Hacemos click con el boton derecho y en la opción Conect para conectarnos.

    La conexión se establece y vemos que nos asigna una ip del rango que habíamos configurado en la configuración del Servidor:

Si revisamos como quedó la tabla de ruteo en la PC conectada, veremos que se ha agregado la ruta a la red 192.168.1.0/24 por la interface de VPN:

Námaste !

Gabriel Soltz

Read more