Servidor de OpenVPN con PfSense. Configuración y uso

February 6th, 2022

En este artículo te mostramos una guía paso a paso para configurar un servidor de OpenVPN sobre un appliance de PfSense. Nos enfocaremos en el uso de la VPN para dar acceso a los empleados de tu empresa a la red corporativa. En este caso, vamos a configurar en modo Point to Site, es decir, los usuarios podrán conectarse a los recursos disponibles en la red de la empresa desde sus equipos.

pfsense1

Pfsense es una distribución personalizada de FreeBSD adaptada para su uso como Firewall, router, servidor y cliente de VPN, balanceador de carga, etc, pero a pesar de sus diversas utilidades nosotros nos centraremos en su uso como servidor VPN, más concretamente en OpenVPN, aunque también puede utilizarse para VPN Ipsec, L2TP y otras funcionalidades de redes.

Hay que destacar que el Pfsense también se vende en formato hardware como cualquier otro router bajo en nombre de Netgate.

pfsense2

Lo primero que necesitaremos es un lugar donde desplegar la máquina virtual, nosotros para el ejercicio lo haremos en un VirtualBox, para obtener la última versión community disponible lo puedes descargar de la web de PfSense.

En el caso de ponerlo en producción puede ser interesante optar por la versión de pago PfSense Plus con algún paquete de soporte.

En este caso nos descargaremos el instalador de 64 bits en formato ISO que será lo más cómodo.

pfsense3pfsense4

Creamos una MV en este caso con VirtualBox indicando que el sistema operativo es un BDS de 64 bits y el resto de parámetros por defecto, 1Gb de RAM y un disco de 16GB.pfsense

pfsense5

Una vez tenemos la MV antes de arrancarla le mostraremos el disco de instalación que acabamos de descargar de PfSense, previamente descomprimido (ha de ser un archivo .iso).

Se realiza en las propiedades de la nueva máquina virtual, en Almacenamiento seleccionamos la unidad óptica y en el icono del disco Seleccionar un archivo de disco...

pfsense6

También debemos cambiar la configuración de la red para que se conecte a nuestra red sin NAT para poder acceder desde nuestra red al servidor, para eso seleccionamos la opción Conectado a: Adaptador puente.

pfsense7

Al iniciar la MV comenzará la instalación del Pfsense.

pfsense8

Aceptamos los términos y condiciones y seleccionamos la opción Install.

pfsense9

Te recomiendo que selecciones el idioma correcto de tu teclado, sino después puedes tener problemas al poner las contraseñas.

pfsense10

Optaremos por un particionado del disco automático con ZFS:pfsense

pfsense11

Dejamos los siguientes valores por defecto:

pfsense12

Y como hemos puesto un único disco utilizamos stripe.

pfsense13

Ya es aceptar los avisos de que estamos seguros y esperar a que termine la instalación

pfsense14

No es necesario modificar ningún archivo tras la instalación, debemos reiniciar y después desmontar la ISO de la unidad de Cdrom para que no vuelva a iniciar la instalación.

pfsense15

Durante el primer arranque del Pfsense es cuando comienza realmente la configuración.

Primero nos preguntará si necesitamos definir VLANs, en este caso le indicaremos que no.

pfsense16

Nos preguntará qué interfaz tiene la salida a internet WAN, en este caso como queremos utilizar el Pfsense como servidor de VPN no como router solo le hemos puesto una única interfaz de red (por defecto) que será la que tenga la salida a internet desde nuestra red, por lo escribiremos el nombre de nuestra interfaz que amablemente nos sugiere el instalador, en este caso em0.

pfsense17

Después nos pedirá la interface en la puesta la LAN que en nuestro caso va a ser la misma por lo que no indicaremos nada y pulsaremos enter directamente.

pfsense18

Finalmente, confirmamos la configuración.

pfsense19

Una vez finalizada la instalación inicial del Pfsense llegaremos a esta pantalla en donde podemos ver la IP que ha obtenido por DHCP. En nuestro caso nos sirve una IP dinámica ya que es solo para un ejercicio, pero lo normal es utilizar la opción 2 para definir una IP estática para el servidor, no tiene más que seguir las indicaciones del asistente.

pfsense20

Pero nosotros nos vamos a conectar directamente a la web Pfsense con la IP que se muestra (en este caso la 192.168.88.110) y aceptaremos el aviso por la utilización de un certificado autofirmado.

pfsense21

El usuario y contraseña para el primer login es admin Pfsense.  

pfsense22

Y automáticamente entraremos en el asistente de configuración web.

pfsense23

Continuamos en el aviso sobre el soporte, en la siguiente pantalla tendremos que poner un nombre al servidor y el dominio interno que vamos a utilizar. En los servidores DNS pondremos las IPs de nuestro controlador de dominio con el que luego integraremos la autenticación de la VPN, y si solo tenemos uno como secundario podremos cualquier DNS público.

pfsense24

Ponemos un servidor de NTP para España, suelo utilizar hora.roa.es e indicamos la zona horaria.

pfsense25

A continuación, configuramos la interfaz de red de la WAN (en nuestro caso la única), para este ejemplo lo dejaremos por DHCP, pero tendrías que establecer una IP estática seleccionando en SelectedType > Static y completando los datos del apartado de Static IP Configuration.

pfsense26

Pondremos una contraseña segura para el usuario admin.

pfsense27

Recargamos la configuración.

pfsense28

Y finalizamos el asistente, es buena opción buscar actualizaciones, aunque esté recién instalado.

pfsense29

Una vez terminado llegaremos a la pantalla principal de administración del Pfsense.

pfsense30

Para que luego sea más fácil la distribución a los clientes de sus conexiones de OpenVPN vamos a instalar un paquete que nos facilitará las acciones después con la distribución para los usuarios (openvpn-client-export).

Hay paquetes para muchos propósitos incluso agentes para algunos hipervisores, como vmWare, o para montar un servicio de balanceo de carga con haproxy, podéis curiosear un poco y veréis que se pueden añadir muchas funcionalidades al Pfsense que os pueden ser muy útiles.

Para ello vamos a System > Package Manager > Available Packages y buscamos el paquete openvpn-client-export y pulsamos en Install.

pfsense31

Tras esto vamos a configurar nuestro servidor de OpenVPN, para ello vamos a utilizar el Wizard que nos proporciona el propio PfSense y así no se nos olvida configurar nada.

Otra cosa que tenemos que preparar es como se va a realizar la autenticación en la VPN, en este ejemplo queremos que aparte de los certificados de cada usuario, que se utilizarán para identificarse, los usuarios tendrán que autenticarse con la utilización de su usuario y contraseña del dominio corporativo, Microsoft Active Directory en este caso.

Como paso previo necesitaremos un usuario del dominio corporativo (test.int) que va a utilizar el Pfsense para hacer las consultas LDAP, ha de ser un usuario solo para este propósito, con una contraseña fuerte y a ser posible que no le caduque la contraseña, respecto a los permisos basta con que pertenezca al grupo de usuarios del dominio.

Para mejorar la gestión crearemos también un grupo de seguridad en donde se incluirán los usuarios de dominio que van a tener permiso para conectarse a la VPN, de esta forma podremos restringir quién puede utilizar la VPN.

En el menú VPN > OpenVPN seleccionamos la pestaña Wizards y comenzará el asistente.

pfsense32

En el primer paso nos solicita el tipo de servidor de autenticación, como queremos que nuestros usuarios utilicen su contraseña del dominio corporativo, que reside en un Microsoft Active Directory, seleccionamos LDAP.

pfsense33

En la configuración del LDAP tendremos que completar los siguientes datos:

  1. Name. Un nombre descriptivo del servidor de autenticación.

  2. Hostname or IP address. La IP del servidor

  3. Peer Certificate Authority. Lo dejaremos global para que se pueda utilizar para autenticar los certificados emitidos por cualquier CA del Pfsense (puede interesarte tener más de una).

  4. Search Scope Base DN. El nombre de nuestro dominio con el formato base DN, es decir test.int se escribe como DC=test,DC=int. 

  5. Authentication Containers. Indicaremos las unidades organizativas donde se encuentran nuestros usuarios, también en base DN. Aquí solemos poner la ruta de la OU donde creamos los usuarios, como además tenemos otra OU donde creamos los grupos de seguridad, también indico esa ruta ya que vamos a utilizar el grupo de seguridad VPN. Para añadir más de una ruta las separamos por punto y coma. En nuestro ejemplo, que tenemos los usuarios en la OU user y el grupo de seguridad VPN creado en una OU Resources que contiene otra OU Groups, quedaría: OU=Groups,OU=Resources,DC=test,DC=int; CN=Users,DC=test,DC=int

  6. Enable Extended Query. Como no queremos que puedan autenticarse todos los usuarios sino solo los que pertenezcan al grupo de seguridad VPN, tenemos que marcar la casilla de Enable extended query.

  7. Extended Query. Aquí es donde definimos qué condiciones deben cumplir los usuarios, en este caso que pertenezcan al grupo VPN. memberOf=CN=VPN,OU=Groups,OU=Resources,DC=test,DC=int

  8. LDAP Bind User DN. El nombre del usuario que hemos creado para realizar las consulta LDAP en el dominio.

  9. LDAP Bind Password. La contraseña del usuario.

  10. User Naming Attribute. En este caso ponemos samAccountName.

  11. Member Naming Attribute. Aquí pondremos memberOf

pfsense34pfsense35

A continuación, definimos la CA encargada de emitir los certificados que vamos a utilizar para los usuarios. En los campos a rellenar debemos poner lo que mejor describa a vuestra empresa (recordad que esta información no se podrá modificar a posteriori) y le damos a Add new CA.

pfsense36

Una vez tenemos la CA procedemos a emitir el certificado para el servidor de VPN.

pfsense37

Ahora ya configuramos las propiedades del servidor de OpenVPN.

  1. Protocol. Dejamos UDP on IPV4 only ya que consume menos recursos que las conexiones TCP.

  2. Local Port. Por defecto se suele utilizar el 1194, pero si ya lo utilizamos para otro propósito o si montamos más servidores de OpenVPN tendremos que ir cambiándolo por uno que no utilicemos.

  3. Cryptographic Settings. Dejaremos todas las opciones por defecto si no tenéis algún requerimiento específico de vuestra empresa.

  4. Tunnel Network. Tenéis que poner el segmento de red que se va a utilizar para la comunicación entre el servidor y el cliente, por lo que no puede coincidir con el segmento de red de la empresa ni de la red del usuario. La red del usuario es más difícil de saber a priori cual es, pero es mejor evitar la red 192.168.0.0/16. También debéis tener cuidado con el tamaño porque con un /24 solo podrías tener a 253 usuarios conectados a la vez por lo que puede que se te quede corto para un uso empresarial y necesites un /23 o  /22.

  5. Redirect Gateway. Nosotros somos partidarios de no marcar esta opción y que sólo vayan por la VPN las solicitudes con destino a la red de la empresa, si alguien ve un vídeo desde su casa no ha de pasar a través de la conexión de la empresa.

  6. Local Network. Aquí pondremos el segmento de red de nuestra empresa que queremos que sea accesible por los usuarios (también tiene que ser accesible por el servidor PfSense).

  7. Concurrent Connections. Podemos poner un límite de conexiones simultáneas para evitar quedarnos sin recursos (siempre han de ser menores al número de IPs disponibles del Tunnel).

  8. DNS Default Domain. Ponemos nuestro dominio de búsqueda, en este caso Test.local.

  9. DNS Server 1. En los primeros DNS a entregar ponemos vuestros controladores de dominio para poder resolver los nombres internos, siempre viene bien poner al final alguno público.

    pfsense38
pfsense39pfsense40

Como ya hemos comentado Pfsense no es solo un servidor de VPN, también es un Firewall. Por ese motivo el asistente en este paso se ofrece a crear automáticamente las reglas genéricas de firewall, para permitir que se conecten los usuarios a la VPN y que puedan llegar a la red de la empresa hemos de seleccionar las opciones de Firewall Rule y OpenVPN rule.

pfsense41

Con esto tendríamos configurado nuestro servidor de OpenVPN.

pfsense42

Una vez creado nuestro servidor con el asistente vamos a realizar unos pequeños ajustes, para ello vamos a VPN > Open > VPNServers y editamos nuestro servidor pulsando en el lápiz.

pfsense43

Primero vamos a cambiar el Server mode de Remote Access (User Auth) a Remote Access (SSL/TLS + User Auth) para que sea necesario tanto un certificado válido como el usuario y contraseña del dominio y le damos a Save y volvemos a editar la configuración así nos aparecerán nuevas opciones de configuración.

pfsense44

Peer Certificate Revocation list aquí podemos definir una lista en donde añadir certificados que queramos revocar (por ejemplo, algún usuario pierde un terminal que tiene la VPN configurada), si aún no hay ninguna creada la puedes crear con el enlace que muestra o ir a System > Certificate Manager > Certificate Revocation y pulsa sobre Add.

pfsense45

Y simplemente le pones un nombre.

pfsense46

Al volver a la edición de la configuración del servidor ya podremos elegir esta lista de certificados revocados.

pfsense47

Strict User-CN Matching, esta opción es interesante activarla ya que te asegura que el nombre del certificado que se presenta en la conexión y el usuario del domino coinciden, para evitar que los usuarios se intercambien los certificados. La única precaución es que cuando demos de alta un nuevo usuario para la VPN el Common Name ha de ser igual que el nombre de usuario del dominio que tenga ese usuario.

pfsense48

Una vez realizados los cambios pulsar Save, tener en cuenta, sobre todo cuando ya esté en uso el servidor, que cada vez realicéis algún cambio en la configuración al guardarla se reiniciará el servidor de OpenVPN y se cortaran todas las conexiones durante unos segundos.

Ahora tendríamos que enrutar el tráfico del puerto 1194 UDP en la infraestructura de comunicaciones de nuestra empresa desde nuestra IP pública a la IP de nuestro servidor de PfSense. Esto va a depender de cómo esté montada la infraestructura de la empresa, puede ser desde tan simple como en el router de la compañía “abrir el puerto” como una serie de configuraciones más o menos complejas en routers, firewalls, VLANs, etc.

Ahora vamos a ver cómo crear un cliente para que se conecte un usuario.

Lo primero, una vez se ha creado su correspondiente usuario del dominio y se le a añadido al grupo de seguridad VPN, es crear su correspondiente certificado en el Pfsense con la CA que hemos configurado para el servidor de OpenVPN. Para ello nos vamos a System > Certificate Manager > Certificates y pulsamos Add/Sign.

pfsense49

Al crear el certificado dejamos todo por defecto, verificando que esta seleccionada la CA correcta en Certificate Authority (sobre todo en el caso de tener más de una CA) excepto:

Descriptive name en donde hay que poner un nombre, nosotros solemos poner el nombre y apellidos del usuario, y lo más importarte el Common Name, hay que poner el nombre exacto de la cuenta de Active Directory del usuario ya que se verificará que coincidan el Common Name del certificado con el usuario del AD que se autentifica.

pfsense50

Una vez que ya tenemos creado el certificado vamos a hacer uso del plugin de exportación que añadimos durante la instalación que nos simplifica enormemente la tarea, nos vamos a VPN > OpenVPN > Client Export

En este punto lo único destacable es que la primera vez deberéis configurar el Host Name Resolution, por defecto aparece Interface IP Address, pero solo es válido si la IP pública la tiene el propio Pfsense (por ejemplo, cuando se utiliza de firewall a internet). Como en nuestro caso no está directamente expuesto, sino que va a estar detrás de un NAT seleccionaremos Other y en Host Name pondremos la IP pública que tenemos, o mejor un registro de DNS público que apunte a ella, así si cambiamos de IP la podremos actualizar sin tener que editar los archivos de configuración de todos los clientes. Y pulsaremos sobre Save as default así no tendremos que rellenarlo cada vez que vayamos a descargar un cliente.

pfsense51

En el apartado OpenVPN Clients de esta página es donde podemos obtener distintos paquetes preparados para distribuir a usuario correspondiente, solo tendremos que buscar el nombre del usuario que deseemos (los nuevos aparecen al final de la lista) y podremos a descargar el paquete que necesitemos.

pfsense52

Para usuarios Windows no hay duda sería el Current Windows Installer normalmente para 64bits que corresponde con un instalador .exe, simplemente hay que correr en el equipo del destinatario como administrador y se encarga de instalar el cliente de OpenVPN GUI y configurar la conexión para que el usuario solo tenga que darle a conectar.

En el caso de macOS, es necesario instalar primero un cliente, nosotros solemos utilizar Tunnelblick que se puede descargar gratuitamente de aquí una vez instalado en el equipo simplemente sería descargar Bundled Configurations: Archive descomprimir el zip en el equipo del destino y hacer doble click en el archivo .ovpn y se agregará la conexión automáticamente al Tunnelblick.

Por último, para iOS y Android utilizamos la opción de Inline Configurations: OpenVPN Connect (iOS/Android) y solemos utilizar el cliente OpenVPN Connect que está disponible gratuitamente tanto en la Play Store como en la App Store en donde, tras instalar la aplicación solo hay que importar el archivo .ovpn.

Con esto tendríamos configurado nuestro servidor de OpenVPN en nuestro Pfsense, como hemos comentado varias veces a lo largo del artículo, esta es solo una funcionalidad más de PfSense y os recomiendo que continuéis investigando en las soluciones que os puede proporcionar.