Instalar OpenVPN en Ubuntu

Desde hace rato quería redactar este artículo, pero siempre lo posponía. Ahora que necesitamos más del teletrabajo, llegó la hora. Voy a explicarte cómo instalar y poner en marcha una VPN con OpenVPN, en Ubuntu.

Una VPN es una Red Privada Virtual que se despliega desde la infraestructura informática de una empresa, hacía unos nodos externos. Los nodos externos pueden ser otras oficinas satélites, sedes o simplemente un empleado teletrabajando.

En este tipo de red la comunicación entre los nodos se encripta, por eso se dice que una VPN es un túnel que envía la información de manera segura a través de Internet.

Una VPN es muy útil para teletrabajar. Con una solución de éstas, el empleado ya sea desde su casa, desde la calle o desde cualquier sitio, puede disponer de los recursos informáticos internos de la empresa. Recursos tales como una impresora de red, una Base de Datos interna, una carpeta compartida, etc, pueden ser aprovechados con esta solución.

Topología de una VPN


Puedes tener tu servidor VPN detrás de un firewall o funcionando en el mismo firewall. Si tu servidor VPN está detrás de un firewall, debes habilitar su correspondiente puerto. Para OpenVPN es el puerto 1194.

La dirección IP interna del servidor es la 192.168.0.72

También puedes instalar tu OpenVPN en el mismo firewall, como yo, que tengo un firewall configurado con IPTABLES en Ubuntu. Para mí, esta es la mejor topología, porque el mismo firewall hace las veces de puerta de enlace, así, todos los dispositivos internos de la LAN pueden tener interacción directa con la red de la VPN, sin necesidad de configurarles rutas adicionales a todos ellos.

Este artículo está basado en está topología.

IPTABLES con ejemplos, aquí

Alcances de una VPN


Algunos administradores de sistemas implementan una VPN solo para que los teletrabajadores accedan a alguna base de datos interna de la compañia. Pero a veces las empresas necesitan que algunos teletrabajadores realicen transacciones financieras en portales bancarios, que solo pueden hacer bajo la dirección IP pública de la empresa (los bancos por seguridad asocian la IP pública de la compañia a su respectiva cuenta). Eso significa que requieren acceso completo a Internet por medio de la VPN, y eso es lo que vamos a configurar en este artículo.

Instalación de OpenVPN como servidor


Este proceso es un poco largo, asi que pizza y gaseosa a la mano, tronemonos los dedos y manos a la obra!

1- Abrimos nuestra terminal y escribimos:

_# apt-get install openvpn easy-rsa

A partir de este punto nos dedicarémos a generar los certificados de seguridad y llave pública para establecer la conexión VPN entre el cliente y el servidor. Es un poco largo, pero es necesario:

2- Copiamos el archivo de configuración de ejemplo al directorio /etc/openvpn:

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

3- Copiamos la carpeta easy-rsa dentro del directorio /etc/openvpn:

_# cp -r /usr/share/easy-rsa /etc/openvpn

4- Creamos la carpeta keys:

_# mkdir /etc/openvpn/easy-rsa/keys

5- Entramos a la carpeta easy-rsa:

_# cd /etc/openvpn/easy-rsa

6- Editar archivo vars:

_# nano vars

Modificar las siguientes variables:

export KEY_COUNTRY=»US»
export KEY_PROVINCE=»CA»
export KEY_CITY=»SanFrancisco»
export KEY_ORG=»Fort-Funston»
export KEY_EMAIL=»[email protected]»
export KEY_OU=»MyOrganizationalUnit»

Por nuestras variables:

export KEY_COUNTRY=»CO»
export KEY_PROVINCE=»VAC»
export KEY_CITY=»CALI»
export KEY_ORG=»EMPRESA_ERWIN»
export KEY_EMAIL=»[email protected]»
export KEY_OU=»Unidad Organizativa (puede ser contabilidad, sistemas)»

En la variables KEY_NAME ponemos un nombre cualquiera. Yo pondré “server”.

7- Generamos los parámetros Diffie-Hellman:

_# openssl dhparam -out /etc/openvpn/dh2048.pem 2048

8- Iniciamos la PKI (Infraestructura de Clave Pública). En el comando se ven dos puntos separados por un espacio:

_# . ./vars

Al terminar el comando anterior, saldrá un mensaje así: NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

Por cada cambio que se haga en “vars”, se debe ejecutar . ./vars

9- Borrar todas las posibles claves de ejemplo:

_# ./clean-all

10- Construimos el certificado de autoridad. Confirmamos cada variable:

_# ./build-ca

11- Justo aquí generamos los certificados de seguridad y la clave para el servidor:

_# ./build-key-server server

Dejamos en blanco las siguientes opciones que aparecen:

A challenge password []:
An optional company name []:

Confirmar firma de certificado:

Sign the certificate? [y/n] y

Confirmar salida:

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

12- Copiamos los certificados y la clave recién generados en /etc/openvpn :

_# cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

13- Abrimos el archivo de configuración del servidor OpenVPN, server.conf, y verificamos la dirección IP (la misma IP pública si lo estamos instalando en el mismo firewall), puerto de escucha del servidor, así como también especificar el archivo Diffie Hellman, los certificados y el direccionamiento IP interno de la VPN:

local «tu_ip_publica»
proto tcp
port 1194
server 20.8.0.0 255.255.255.0 #Direccionamiento IP de la VPN
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
client-config-dir ccd

14- Descomentemos también la directiva «push redirect-gateway def1 bypass-dhcp«, junto con «push dhcp-option DNS 208.67.222» y «push dhcp-option DNS 208.67.220.220«, y cambiemos esas direcciones IP por las de nuestro servidor DNS de nuestra red local, o por los DNS de nuestros ISP. Mi directiva para para la configuración del DNS, quedó así:

push dhcp-option DNS 192.168.0.1

15- También descomenta la línea push «route 192.168.0.0 255.255.255.0» y colocale la dirección de red de LAN de la empresa, con su respectiva máscara. Esto es para que los clientes basados en Linux puedan alcanzar la red de la empresa.

16- Descomentemos ;user nobody y ;group nogroup (solo para Linux y Unix), y adicionalmente estas

keepalive 10 120
persist-key
persist-tun
status openvpn-status.log
verb 3

17- Creamos el archivo de registros (logs) para hacerle seguimiento al comportamiento del servicio, y lo declaramos en el mismo archivo

log /var/log/openvpn.log
log-append /var/log/openvpn.log

18- Crea una regla IPTABLES para que los usuarios de la VPN puedan navegar través del Internet de la empresa (o si prefieres, colocales el Proxy en su navegador):

_# iptables -t nat -A POSTROUTING -s 20.8.0.0/24 -o enp6s4f1 -j MASQUERADE

La interfaz de red enp6s4f1 es la que conecta con el Internet.

19- Iniciamos el servicio VPN:

_# /etc/init.d/openvpn start

20- Si el anterior comando no te funciona, intentalo con este otro:

_# openvpn –config /etc/openvpn/server.conf –key /etc/openvpn/server.key –ca /etc/openvpn/ca.crt –dh /etc/openvpn/dh2048.pem –cert /etc/openvpn/server.crt &

PARA TOMAR EN CUENTA ESTE CASO


Te comento algo, si el direccionamiento IP de la LAN del router casero del teletrabajador, coíncide con el direccionamiento IP de la LAN de la empresa (por ejemplo, ambas con la subred 192.168.0.0/24), puede que el cliente tenga problemas de resolución de nombres de dominio para navegar.

En este caso, si la dirección IP de la puerta de enlace (default gateway) del cliente Windows coincide con la IP del servidor DNS de la empresa, seguramente el teletrabajador no va a poder navegar en Internet usando la VPN.

Bueno, mira a lo que me refiero. La siguiente imagen muestra la dirección IP del DNS del router casero de Claro, que no necesariamente es la misma de la puerta de enlace del mismo router:

Si le indicamos al servidor VPN que le proporcione a sus clientes la IP del servidor DNS de la LAN, 192.168.0.1 (con la directiva push dhcp-option DNS 192.168.0.1), el cliente Windows intentará infructuosamente consultar los dominios a la puerta de enlace, en vez de al DNS local de la empresa, por lo que nunca tendrá respuesta.

Así no sea tu caso, yo te recomiendo que en la directiva push dhcp-option DNS pongas la IP del mismo servidor VPN, así:

push dhcp-option DNS 192.168.0.72

Luego, create una regla IPTABLES en el servidor VPN para que las consultas DNS que le lleguen desde la red VPN, las redireccione al servidor DNS local:

_# iptables -t nat -A PREROUTING -s 20.8.0.0/24 -p udp –dport 53 -j DNAT –to 192.168.0.1
_# iptables -t nat -A PREROUTING -s 20.8.0.0/24 -p tcp –dport 53 -j DNAT –to 192.168.0.1

 

Instalar Openvpn como cliente


Para sistemas basados en GNU/Linux, solo basta con el comando apt install openvpn. Para Windows, usa el instalador que puedes conseguir en https://openvpn.net/community-downloads/

Bueno, ya instalado Openvpn del lado del teletrabajador, vamos a configurarlo como cliente. Comenzamos generando los certificados de seguridad para cada uno de los clientes. Volvemos al servidor en el directorio /etc/openvpn/easy-rsa. Voy a generar los certificados para el cliente «andres»:

_# source vars

_# ./build-key andres

Confirmamos las variables.

Recomendación: Tenga en cuenta el valor del campo Common Name (CN), porque con ese mismo nombre podemos (opcional) crear otro archivo en el servidor, con el que podemos asignar una IP fija a cada cliente (repito, opcional):

instalar openvpn

Copiamos los archivos andres.crt, andres.key y ca.crt que acabamos de generar y los trasladamos al directorio /etc/openvpn/client/ (C:\Program Files\OpenVPN\config para Windows) del cliente.

Seguimos con la configuración del cliente. En uno tipo Windows debemos copiar el archivo de configuración client.ovpn de la carpeta sample-config, a la carpeta config de la carpeta OpenVPN donde se instaló:

En un cliente GNU/Linux debemos copiar el archivo de configuración de ejemplo, así:

_# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client/client.conf

Dentro del archivo de configuración del cliente, definimos la dirección IP pública del servidor VPN al que se va a conectar:

remote ip_publica 1194

Especifícale los nombres de los certifcados de seguridad:

Debemos verificar que el cipher sea el mismo en ambos lados (servidor y cliente). Para éste ejemplo configuré el cipher AES-256-CBC.

Establezcamos el protocolo TCP en ambos lados. Bueno, para agilizar la conectividad en una red VPN, la gente recomienda UDP, pero si los teletrabajadores van a trabajar con sitios web bancarios, mejor dejalo en TCP.

Verifiquemos que la compresión lzo (comp-lzo) esté habilitada o deshabilitada en ambos lados. Si la compresión se deja habilitada en un solo lado, no habrá trasmisión de paquetes.

Verifica que el enrutamiento esté habilitado en el servidor, con el bit 1 activado en ip_forward.

Cambiar la dirección IP del cliente


Si quieres fijar la IP de un cliente, utiliza este procedimiento. Solo funciona para clientes basados en Linux. No te preocupes por los clientes Windows, con lo expuesto hasta ahora el servidor le dará una IP dinámicamente (igual para los basados en Linux).

Para fijar una IP para cada cliente, debemos crear dentro del servidor un directorio llamado “ccd” bajo la ruta /etc/openvpn/. Luego, dentro de ese directorio creamos un archivo cuyo nombre debe ser el mismo del campo CN del certificado de seguridad de cada cliente (tal como lo vimos en la recomendación más arriba). Podemos verificar el valor del campo CN de los certificados de seguridad, así:

_# openssl x509 -in /etc/openvpn/client/andres.crt -noout -subject | sed -e ‘s/.*CN=\(.*\)\/.*/\1/’

El resultado debe ser parecido a esto:

andres/name=EVA

Creamos entonces el archivo:

_# touch ccd/andres

Definimos dentro de ese archivo la IP del cliente andres, así:

ifconfig-push 20.8.0.14 20.8.0.1

La dirección IP 20.8.0.15 es la del cliente y la 20.8.0.1 es la del propio servidor.

Por fín, iniciamos la conexión VPN desde el cliente basado en Linux, así:

_# openvpn –config /etc/openvpn/client/client.conf –key /etc/openvpn/client/andres.key –ca /etc/openvpn/client/ca.crt –dh /etc/openvpn/client/dh2048.pem –cert /etc/openvpn/client/andres.crt &

Configuración adicional para clientes basados en Linux


Si requieres que en el cliente Linux se ejecute alguna acción o algún comando después de establecerse la conexión VPN, create un script bash con esa acción y declaralo dentro del archivo client.conf, así:

script-security 2
up /etc/openvpn/client/comando.sh

Configuración adicional para clientes basados en Windows


– Activar openvpn con privilegios de Administrador.

– Configure la dirección IP del DNS de forma manual en la interfaz TAP.

– Verificar conectividad con ping.

– Los antivirus suelen bloquear tráfico entre diferentes subredes. Agregar una regla en el antivirus para que acepte tráfico del segmento de red de la VPN.

– A veces la conexión no se da. SI es su caso deshabilite y habilite el adaptador de túnel TAP en el lado Windows para que se normalice:

Por último, diríjase al icono del servicio OpenVPN en la parte inferior derecha de su pantalla, y dale clic derecho -> Conectar

Y eso es todo.  A teletrabajar!

Qué es el Teletrabajo? dale clic aquí

Comparte esto en
Publicado en Seguridad Informática.

Un comentario

  1. Pingback: 🥇 Teletrabajo en Colombia - ¿Qué es? - Conceptos y Consideraciones

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *