Configuración de OpenVPN modo roadwarriors en openSUSE

OpenVPN permite implementar túneles de comunicación encriptados y establecer VPN's a través de Internet, que dependiendo de la configuración puede ser entre una o varias redes empresariales u hogareñas, o bien también entre una red y hosts específicos.

En esta guía se abarcará básicamente la configuración necesaria para que un equipo cliente o varios de ellos (Roadwarriors) pueden conectarse mediante Internet a los equipos de una red ubicada detrás del servidor OpenVPN que hace de pasarela.


Servidor OpenVPN para Roadwarriors

La denominación RoadWarrior se refiere a aquellos equipos que siempre están en movimiento y se encuentran conectados al extremo de un túnel VPN normalmente desde una IP dinámica (véase en wikipedia). Esta configuración no contempla una VPN bajo el esquema red a red, sino solamente equipo/s a red como se muestra a modo de ejemplo en el siguiente gráfico:


Finalizando esta sección, quisiera comentarles que primero se abarcarán las configuraciones correspondientes al servidor OpenVPN y posteriormente los pasos para configurar los equipos clientes.


Paquetes requeridos

  1. Debemos verificar que el paquete openvpn se encuentre instalado, lo podemos hacer mediante el siguiente comando:
    testsrv:~ # zypper search -i openvpn
  2. Si el paquete no se encuentra instalado lo instalamos de la siguiente manera:
    testsrv:~ # zypper install openvpn


Generación de llaves y certificados para CA y servidor

  1. Autoridad de Certificación: En este punto vamos a comenzar a realizar algunos ajustes y configuraciones para preparar la base del servicio OpenVPN. En los siguientes pasos necesitamos generar una llave y un certificado para la Autoridad de Certificación (de ahora en más llamado CA) que en este caso será el mismo equipo en el que va a correr el servidor OpenVPN. Lo primero que debemos hacer es crear en el directorio /etc/openvpn dos carpetas, la primera llamada rsa en la cual copiaremos todos los archivos de ejemplo del directorio /usr/share/openvpn/easy-rsa/2.0/ y la segunda llamada keys para almacenar las llaves:
    testsrv:~ # mkdir /etc/openvpn/rsa
    testsrv:~ # cp /usr/share/openvpn/easy-rsa/2.0/* /etc/openvpn/rsa
    testsrv:~ # mkdir /etc/openvpn/rsa/keys

  2. Nos ubicamos en el directorio /etc/openvpn/rsa y editamos el archivo vars:
    testsrv:~ # cd /etc/openvpn/rsa
    testsrv:/etc/openvpn/rsa # vi vars

    Una vez abierto el archivo vars podemos configurar el tamaño de la clave que por defecto se encuentra configurado en 1024, pero como buenos paranoicos podemos utilizar 2048 que aumenta la seguridad pero a su vez ralentiza la negociación TLS cuando un cliente trate de conectarse al servidor.
    export KEY_SIZE=2048
    Sin embargo, lo más importante que tenemos que configurar es la información relacionada al CA, para ello configuramos las siguientes variables con nuestra información.
    export KEY_COUNTRY="PY"
    export KEY_PROVINCE="IT"
    export KEY_CITY="nombre_ciudad"
    export KEY_ORG="nombre_organizacion"
    export KEY_EMAIL="admin@dominio"
    export KEY_OU="unidad_de_la_empresa"

    Y finalmente comentamos las siguientes variables con el carácter numeral (#) para evitar tener problemas durante la generación de llaves para los clientes.
    #export KEY_CN=changeme
    #export KEY_NAME=changeme

    Salimos del archivo guardando los cambios.

  3. Publicamos las variables de entorno necesarias ejecutando el archivo vars de la siguiente forma:
    testsrv:/etc/openvpn/rsa # source ./vars
  4. Luego ejecutamos el script clean-all para limpiar el directorio de archivos innecesarios.
    testsrv:/etc/openvpn/rsa # ./clean-all
  5. Ahora procedemos a generar los parámetros Diffie Hellman para lo cual ejecutamos el archivo build-dh:
    testsrv:/etc/openvpn/rsa # ./build-dh
  6. Para finalizar ejecutamos el comando pkitool para crear la llave y el certificado para la CA:
    testsrv:/etc/openvpn/rsa # ./pkitool --initca
  7. Generación de llave y certificado para el servidor: En los siguientes pasos vamos a generar la llave y el certificado para el servidor que ejecutará el servicio OpenVPN, para ello ejecutamos nuevamente el comando pkitool pero con los siguientes argumentos:
    testsrv:/etc/openvpn/rsa # ./pkitool --server servidor
    Una observación, para el tercer parámetro se ha utilizado la palabra servidor que es el nombre con el cual se genera la llave y el certificado, los archivos resultantes serán servidor.crt, servidor.key, etc.. y que más adelante serán utilizados en la configuración del servicio OpenVPN.

  8. Generación de firma HMAC tls-auth: Necesitamos generar una firma HMAC tls-auth que aumenta los niveles de seguridad en varios aspectos. Accedemos al directorio /etc/openvpn/rsa/keys y ejecutamos el siguiente comando:
    testsrv:/etc/openvpn/rsa # cd /etc/openvpn/rsa/keys
    testsrv:/etc/openvpn/rsa/keys # openvpn --genkey --secret ta.key

    Y con este paso concluimos esta sección.


Configuración del servidor

  1. El archivo server.conf que será utilizado por el servicio OpenVPN lo creamos a partir del archivo de mismo nombre ubicado en el directorio /usr/share/doc/packages/openvpn/sample-config-files como se muestra a continuación:
    testsrv:~ # cp /usr/share/doc/packages/openvpn/sample-config-files/server.conf /etc/openvpn
  2. Procedemos a editar el archivo server.conf:
    testsrv:~ # vi /etc/openvpn/server.conf
    Y configuramos las directivas correspondientes a la entidad CA, parámetro DH, certificado y llave para el servidor y autenticación TLS especificando la ruta completa a los archivos relacionados como se muestra a continuación:
    ca /etc/openvpn/rsa/keys/ca.crt
    cert /etc/openvpn/rsa/keys/servidor.crt
    key /etc/openvpn/rsa/keys/servidor.key
    dh /etc/openvpn/rsa/keys/dh2048.pem
    tls-auth /etc/openvpn/rsa/keys/ta.key 0

    Luego descomentamos la directiva client-config-dir ccd que permite definir el directorio en donde se colocarán todas las políticas personalizadas de acceso para cada uno de los clientes que generaremos más adelante.
    client-config-dir ccd
    También debemos descomentar la directiva log-append y debería quedar configurado como sigue:
    log-append /var/log/openvpn.log
    Nos vamos al final del archivo y especificamos la directiva crt-verify y le especificamos el archivo que contendrá los certificados que fueron revocados por el administrador del servicio OpenVPN (los pasos para revocar certificados será abordados más adelante):
    # -- SE AGREGA LA DIRECTIVA QUE ESPECIFICA EL ARCHIVO EN DONDE
    # SE ENCUENTRAN LOS CERTIFICADOS REVOCADOS.
    crl-verify /etc/openvpn/rsa/keys/crl.pem

    A continuación de la directiva anterior agregamos la directiva management para definir el host y el puerto desde los cuales se podrá acceder a la consola de administración de OpenVPN. Si bien se puede configurar la dirección IP de la interfaz de red activa para que la consola de administración se encuentre accesible remotamente, se recomienda que solo se habilite en el localhost ya que no solicita usuario ni contraseña al conectarnos a ella.
    # -- SE HABILITA LA CONSOLA DE ADMINISTRACION EN EL PUERTO 1195
    # DE LA INTERFAZ LOCALHOST (Recomendado, ya que al acceder a la
    # consola no pide usuario y contrasenia) DEL SERVIDOR
    management 127.0.0.1 1195

    Con lo anterior hemos finalizado con la configuración de las directivas del archivo server.conf, guardamos los cambios realizados y salimos del archivo para continuar con el siguiente paso.

  3. Luego creamos el directorio ccd (definido en la directiva client-config-dir del paso anterior) para almacenar los archivos de políticas de acceso para los distintos common name de los clientes.
    testsrv:~ # mkdir /etc/openvpn/ccd
  4. Activamos el servicio entre los niveles de ejecución para que se inicie durante el arranque del sistema operativo y por último arrancamos el servicio OpenVPN como se muestra a continuación:
    testsrv:~ # chkconfig --add openvpn
    testsrv:~ # service openvpn start



Configuración del Firewall

  1. Pasamos al siguiente punto que consiste en realizar unos ajustes en el Firewall de OpenSUSE, comenzamos abriendo el archivo SuSEfirewall2 del directorio /etc/sysconfig.
    testsrv:~ # vi /etc/sysconfig/SuSEfirewall2
  2. Antes de configurar las directivas del Firewall de OpenSUSE, debemos tener en cuenta que con la ejecución del servicio OpenVPN se generará una nueva interfaz de red lógica para el túnel ssh llamado normalmente por defecto tun0. Recomiendo que la interfaz tun0 se asigne a la zona desmilitarizada (DMZ) y la interfaz de red que utilizamos para nuestra LAN interna (eth0, eth1, etc. o el que hayan usado) a otra zona que utilizamos para ello (externa o interna), esto permite evitar que los servicios habilitados para la interfaz que se conecta a la LAN interna no se encuentren también publicados en la interfaz tun0. De esta forma los clientes (Roadwarriors) que se conecten al servicio OpenVPN (que lo pueden hacer únicamente a través de la interfaz tun0) solo podrán acceder a los servicios autorizados para esa zona.
    Hecha la aclaración anterior comenzamos a configurar las directivas necesarias ubicando primeramente la directiva FW_DEV_DMZ y configurándola como sigue:
    FW_DEV_DMZ="tun0"
    Luego buscamos la directiva FW_ROUTE a la cual le asignamos el valor yes:
    FW_ROUTE="yes"
    Activamos el enmascaramiento de redes con la directiva FW_MASQUERADE:
    FW_MASQUERADE="yes"
    Necesitamos habilitar el puerto del servicio OpenVPN (que en esta guía se dejó el puerto por defecto, UDP 1194), para ello ubicamos la directiva FW_SERVICES_EXT_UDP y le asignamos el puerto correspondiente.
    FW_SERVICES_EXT_UDP="1194"
    Si queremos que un equipo que se encuentra dentro de la red LAN corporativa pueda establecer una conexión al equipo remoto Roadwarrior (iniciar una conexión por si solo al cliente openvpn externo), debemos configurar la interfaz que comunica al servidor OpenVPN con la LAN Corporativa para que realice el forward de los paquetes de red desde la interfaz LAN del servidor OpenVPN a la interfaz TUN del servidor para que llegue al equipo roadwarrior. Por ejemplo, si queremos que un equipo de la LAN corporativa con una dirección IP 192.168.10.36 pueda hacer ping a un host roadwarrior conectado al servicio OpenVPN con IP 10.8.0.34 debemos especificar en la directiva FW_FORWARD lo siguiente:
    FW_FORWARD="192.168.10.0/24,10.8.0.0/24,,,"
    Lo que hace la configuración de la directiva anterior es que permitirá a la red 192.168.10.0/24 (a cualquier host de la misma) el acceso a cualquier servicio de cualquier equipo que pertenezca a la red 10.8.0.0/24.

    Con esto hemos finalizado con la configuración del Firewall, guardamos los cambios y salimos del archivo para continuar.

  3. El siguiente y último paso consiste en reiniciar el servicio del Firewall con el siguiente comando:
    testsrv:~ # rcSuSEfirewall2 restart


IP Forwarding

El siguiente paso que se debe realizar es activar el IP forwarding. Hay varias formas de hacerlo, pero en este caso la configuración se realiza mediante sysctl que no requiere el reinicio del sistema operativo. Los pasos son los siguientes:
  1. Editamos el archivo /etc/sysctl.conf.
    testsrv:~ # vi /etc/sysctl.conf
  2. Asignamos el valor 1 a la siguiente directiva (o la agregamos en el caso de que no exista):
    net.ipv4.ip_forward=1
    Luego guardamos los cambios y salimos del archivo sysctl.conf.

  3. Para que los cambios tomen efecto en el sistema operativo sin reiniciarlo ejecutamos el siguiente comando:
    testsrv:~ # sysctl -p


Generación de llaves y certificados para roadwarriors

Para crear los certificados y las llaves que utilizarán los clientes vamos a crear un script que nos facilite la tarea de generación automatizando varios pasos que de otra forma deberían ser realizados manualmente. A este script solo será necesario pasarle el Common Name del cliente (el common name debe ser un nombre único para cada cliente) en forma de argumento para generar su correspondiente llave.
  1. Lo primero que vamos a hacer es crear un archivo llamado clientes_crear.sh en el directorio /etc/openvpn/rsa:
    testsrv:~ # cd /etc/openvpn/rsa
    testsrv:/etc/openvpn/rsa # touch clientes_crear.sh

  2. Luego editamos el archivo:
    testsrv:/etc/openvpn/rsa # vi clientes_crear.sh
    Y le agregamos el siguiente script bash:
    #!/bin/bash
    #
    # -- Definicion de variables globales

    PWD_ACTUAL=`pwd`
    source $PWD_ACTUAL/vars > /dev/null
    CLIENT=""
    CA_CRT=$KEY_DIR/ca.crt
    TA_KEY=$KEY_DIR/ta.key
    DEFAULT_SERVER_IP="ip_o_dominio_servidor"
    DEFAULT_SERVER_PORT="1194"
    WIN_CFG_FILE=client.ovpn
    LIN_CFG_FILE=client.conf

    # -- Se verifica que se haya pasado el parámetro
    # correspondiente al cliente y que exista la
    # carpeta en donde se van a colocar la llave y
    # los certificados.

    if [ -z "$1" ]; then
    echo "Debe Especificar el nombre del cliente!"
    exit
    else
    CLIENT=$KEY_DIR/$1
    fi
    if ! [ -d "$CLIENT" ]; then
    mkdir -p $CLIENT
    fi

    # -- Se procede a crear la llave y el certificado para
    # el nuevo cliente.

    $PWD_ACTUAL/pkitool $1
    mv $KEY_DIR/$1.* $CLIENT
    cp $CA_CRT $CLIENT
    cp $TA_KEY $CLIENT

    # -- Se crean los archivos de configuración para el nuevo
    # cliente, tanto para Windows como para linux.

    echo "client" > $CLIENT/$WIN_CFG_FILE
    echo "dev tun" >> $CLIENT/$WIN_CFG_FILE
    echo "proto udp" >> $CLIENT/$WIN_CFG_FILE
    echo "resolv-retry infinite" >> $CLIENT/$WIN_CFG_FILE
    echo "nobind" >> $CLIENT/$WIN_CFG_FILE
    echo "persist-key" >> $CLIENT/$WIN_CFG_FILE
    echo "persist-tun" >> $CLIENT/$WIN_CFG_FILE
    echo "ns-cert-type server" >> $CLIENT/$WIN_CFG_FILE
    echo "comp-lzo" >> $CLIENT/$WIN_CFG_FILE
    echo "verb 3" >> $CLIENT/$WIN_CFG_FILE
    echo "ca ca.crt" >> $CLIENT/$WIN_CFG_FILE
    echo "tls-auth ta.key 1" >> $CLIENT/$WIN_CFG_FILE
    echo "cert $1.crt" >> $CLIENT/$WIN_CFG_FILE
    echo "key $1.key" >> $CLIENT/$WIN_CFG_FILE

    # -- Se arma la directiva para especificar el servidor y
    # el puerto del servidor openvpn para un cliente windows.

    if ! [ -z "$2" ]; then
    # -- Se verifica si el puerto se recibió como argumento.
    if ! [ -z "$3" ]; then
    echo "remote $2 $3" >> $CLIENT/$WIN_CFG_FILE
    else
    echo "remote $2 $DEFAULT_SERVER_PORT" >> $CLIENT/$WIN_CFG_FILE
    fi
    else
    echo "remote $DEFAULT_SERVER_IP $DEFAULT_SERVER_PORT" >> $CLIENT/$WIN_CFG_FILE
    fi

    # -- Se crea el archivo de configuración para Linux a partir del
    # archivo de configuración de Windows generado anteriormente.

    cp $CLIENT/$WIN_CFG_FILE $CLIENT/$LIN_CFG_FILE
    echo "log-append /var/log/openvpn.log" >> $CLIENT/$LIN_CFG_FILE
    Enlace: Script en Github Gist.

    Lo que hace el script es cargar las variables de entorno para la generación de llaves y certificados OpenVPN, se definen una seria de variables globales para ubicar los archivos ca.crt y ta.key que se necesitaran incluir en el paquete para el nuevo cliente, luego se verifica que se haya pasado como primer argumento ($1) del script el Common Name que se utiliza para nombrar a los archivos certificado (.crt) y llave (.key) del cliente. El siguiente paso automatizado consiste en definir la ruta en donde se colocarán los archivos a ser generados y se crea la carpeta en el caso de que no exista. Posteriormente se generan los archivos para el cliente y se los reubican en el directorio definido, copiándose en el mismo también los archivos ca.crt y ta.key. Por último se crea un archivo de configuración con las directivas necesarias para el cliente y que con la inclusión de los argumentos dos y tres ($2 y $3) en la ejecución del script se puede configurar dinámicamente la dirección IP o nombre de dominio del servidor OpenVPN y el puerto UDP en el cual se ejecuta el servicio respectivamente. El archivo resultante se coloca en el mismo directorio en donde fueron colocados la llave y el certificado del cliente.

    Guardamos los cambios y salimos del archivo.

  3. El siguiente paso consiste en asignarle al archivo clientes_crear.sh los permisos de ejecución correspondientes:
    testsrv:/etc/openvpn/rsa # chmod 700 clientes_crear.sh
  4. Ahora ya podemos ejecutar el script, como ejemplo básico podemos crear los archivos para un cliente llamado empresaX:
    testsrv:/etc/openvpn/rsa # ./clientes_crear.sh empresaX
    Otro ejemplo podría ser crear los archivos para un cliente llamado empresaX y que la configuración del servidor remoto tenga como IP y puerto lo siguiente:
    testsrv:/etc/openvpn/rsa # ./clientes_crear.sh empresaX 192.168.1.20 1194
  5. Finalizado la ejecución del script se generará una carpeta con el common name empresaX (en base a los ejemplos del paso anterior) en el directorio /etc/openvpn/rsa/keys con los archivos que deberán ser entregados al cliente, la lista de archivos es la siguiente:
    • ca.crt
    • ta.key
    • empresaX.crt
    • empresaX.csr
    • empresaX.key
    • client.ovpn
    • client.conf

  6. Aun nos faltan definir los hosts o nuestras redes corporativas a las cuales deseamos dar acceso a nuestro cliente, esto es algo que se puede definir fácilmente en nuestro servidor OpenVPN. Para lograr lo mencionado anteriormente debemos acceder al directorio /etc/openvpn/ccd y crear un archivo de configuración para el cliente con el CommonName utilizado para el mismo, en este caso utilizaremos como ejemplo nuevemente empresaX:
    testsrv:~ # cd /etc/openvpn/ccd/
    testsrv:/etc/openvpn/ccd # touch empresaX

    Accedemos al archivo empresaX,
    testsrv:/etc/openvpn/ccd # vi empresaX
    y le asignamos las políticas que nos parezcan, por ejemplo, podemos autorizar al cliente empresaX para que pueda acceder a una red interna con el rango 192.168.15.0/24, la directiva quedaría como sigue:
    push "route 192.168.15.0 255.255.255.0"
    También podríamos otorgar al cliente el acceso a una sola estación de trabajo que se encuentra dentro de la red interna 192.168.15.0/24 mencionada anteriormente.
    push "route 192.168.15.25 255.255.255.255"
  7. Con el paso anterior culminamos con esta sección ya pudiendo generar los archivos necesarios para nuestros clientes.


Revocar certificados

Revocar un certificado consiste en invalidar uno que habíamos creado anteriormente y que por alguna razón necesitamos que deje de ser útil. Al revocar un certificado el cliente afectado ya no podrá conectarse al servicio OpenVPN, ya que este último rechazará todas aquellas conexiones que utilicen el certificado en cuestión.

Sin embargo, antes de comenzar a revocar un certificado de algún cliente nuestro debemos realizar unas configuraciones previas.
  1. Nos dirigimos al directorio /etc/openvpn/rsa para editar el archivo openssl.cnf que si no existe tenemos que editar el archivo openssl-1.x.x.cnf o similar:
    testsrv:~ # cd /etc/openvpn/rsa
    testsrv:/etc/openvpn/rsa # vi openssl-1.0.0.cnf

    Luego nos dirigimos a la sección pkcs11_section y la comentamos completamente.
    #[ pkcs11_section ]
    #engine_id = pkcs11
    #dynamic_path = /usr/lib/engines/engine_pkcs11.so
    #MODULE_PATH = $ENV::PKCS11_MODULE_PATH
    #PIN = $ENV::PKCS11_PIN
    #init = 0

    Guardamos los cambios y salimos del archivo.

  2. Reiniciamos las variables de OpenVPN:
    testsrv:/etc/openvpn/rsa # source ./vars
  3. Y luego ya podemos revocar certificados utilizando el siguiente comando:
    testsrv:/etc/openvpn/rsa # ./revoke-full /etc/openvpn/rsa/keys/empresaX/empresaX
  4. Una vez ejecutado el comando anterior se creará un archivo CRL (Certificate Revocation List) en el directorio /etc/openvpn/rsa/keys llamado crl.pem en el cual se irán albergando todos los certificados revocados. Con este archivo el servicio OpenVPN verifica la validez de los certificados cada vez que los clientes intenten conectarse o renegociar su sesión.

Pero podemos automatizar las cosas creando un script que simplifique la tarea de revocar los certificados de los clientes, los pasos a seguir se exponen a continuación.
  1. Nos dirigimos al directorio /etc/openvpn/rsa y creamos un nuevo archivo de texto plano llamado clientes_revocar.sh:
    testsrv:~ # cd /etc/openvpn/rsa
    testsrv:/etc/openvpn/rsa # touch clientes_revocar.sh

  2. Luego editamos el archivo clientes_revocar.sh:
    testsrv:/etc/openvpn/rsa # vi clientes_revocar.sh
    y le agregamos el siguiente contenido:
    #!/bin/bash
    #
    # SCRIPT PARA REVOCAR LLAVES DE CLIENTES.
    #
    # -- Se verifica que se haya pasado el common name
    # del cliente como argumento.

    if [ -z "$1" ]; then
    echo "Debe Especificar el nombre del cliente!"
    exit
    fi

    # -- Se obtiene el directorio en donde se encuentra
    # la aplicacion y se cargan las variables necesarias.

    PWD_ACTUAL=`pwd`
    source $PWD_ACTUAL/vars > /dev/null

    # -- Se procede a revocar la llave del cliente.
    $PWD_ACTUAL/revoke-full $KEY_DIR/$1/$1
    Enlace: Script en Github Gist.

    Guardamos los cambios del archivo y salimos del mismo.

  3. Le otorgamos los permisos de ejecución necesarios:
    testsrv:/etc/openvpn/rsa # chmod 700 clientes_revocar.sh
  4. Y con eso ya está, ya podemos revocar los certificados ejecutando el script clientes_revocar.sh de la siguiente forma:
    testsrv:/etc/openvpn/rsa # ./clientes_revocar.sh empresaX
    Using configuration from /etc/openvpn/rsa/openssl-1.0.0.cnf
    Revoking Certificate 04.
    Data Base Updated
    Using configuration from /etc/openvpn/rsa/openssl-1.0.0.cnf
    /etc/openvpn/rsa/keys/empresaX/empresaX.crt: C = PY, ST = IT, L = nombre_ciudad, O = nombre_organizacion, OU = changeme, CN = changeme, name = changeme, emailAddress = admin@dominio
    error 23 at 0 depth lookup:certificate revoked
    testsrv:/etc/openvpn/rsa #


Consola de administración de OpenVPN

Anteriormente, cuando configuramos el servicio OpenVPN mediante el archivo de configuración server.conf agregamos la directiva management cuya funcionalidad era la de activar la consola de administración del servicio, como en ese momento no se especificó la forma de acceder a dicha herramienta nos encargaremos de eso en esta sección.
  1. Para acceder a la consola de administración del servico OpenVPN hacemos uso del protocolo telnet especificando el host y el puerto como se muestra con el siguiente comando:
    testsrv:~ # telnet 127.0.0.1 1195
  2. El comando anterior desplegará una interfaz que nos permitirá introducir comandos para gestionar el servicio, a modo de ejemplo les dejo con la salida de la ejecución del comando state, pero si desean conocer la lista completa de opciones pueden ejecutar el comando help:
    testsrv:~ # telnet 127.0.0.1 1195
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    >INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
    state
    1295529194,CONNECTED,SUCCESS,10.8.0.1,
    END
    exit
    Connection closed by foreign host.
    testsrv:~ #


Clientes OpenVPN en Windows

A continuación se verán los pasos necesarios para configurar el cliente OpenVPN en Windows. Es importante tener en cuenta que en los equipos clientes la red de su interfaz debe ser distinta a las redes autorizadas en el servidor OpenVPN (en el archivo /etc/openvpn/ccd/empresaX), ya que en caso contrario se generará un conflicto en el ruteo de las redes. El equipo cliente no podrá identificar correctamente su propia red local con la red remota a la cual puede acceder a través del túnel de la VPN.
  1. Descargamos la última versión del programa OpenVPN para Windows desde su sitio oficial en Internet y lo instalamos en el sistema operativo.
    URL: http://www.openvpn.net/index.php/openvpn-client.html
  2. En el directorio C:\Archivos de programa\OpenVPN\config le copiamos los archivos generados en el servidor para nuestro cliente, en esta guía el cliente de ejemplo será "empresaX", los archivos que deben estar en ese directorio son los siguientes:
    • ca.crt
    • ta.key
    • empresaX.crt
    • empresaX.csr
    • empresaX.key
    • client.ovpn
    • client.conf (No requerido para Windows)

  3. Atención: Si no disponemos de un archivo de configuración .ovpn generado por el script clientes_crear.sh mencionado en el apartado Generación de llave y certificado para el cliente de esta guía, podemos crear ese archivo de configuración a partir de un archivo de ejemplo que viene junto con la instalación, para ello creamos una copia del archivo C:\Archivos de programa\OpenVPN\sample-config\client.ovpn en el directorio C:\Archivos de programa\OpenVPN\config, luego editamos el archivo con nuestro editor preferido y le seteamos las siguientes directivas:
    remote ip_o_dominio_de_servidor 1194
    ca ca.crt
    cert empresaX.crt
    key empresaX.key
    tls-auth ta.key 1

    Guardamos los cambios del archivo.

  4. Luego debemos ejecutar la aplicación OpenVPN GUI cuyo ícono se ubicará en el área de notificaciones, sobre el cual tenemos que hacer un clic con el botón derecho del mouse y seleccionar la opción Connect. Esto iniciará el procedimiento de conexión al servidor OpenVPN, creandose una interfaz lógica a la cual se le asignará una IP para acceder al túnel y creándose luego nuevas rutas según las políticas configuradas para ese cliente en el servidor. Las rutas agregadas se pueden ver con el siguiente comando:
    C:\>route print
  5. También podemos configurar la ejecución del cliente openvpn como un servicio, para ello nos dirigimos a Panel de Control -> Herramientas Administrativas -> Servicios, en la ventana de la aplicación servicios buscamos la opción openvpn y la configuramos para que arranque de forma automática durante el inicio del sistema operativo. He probado esta última opción incluso con modems 3G y funciona muy bien, mientras no haya conexión a Internet el servicio se mantendrá inactivo, cuando el usuario apenas establezca la conexión a Internet mediante el modem el servicio openvpn automáticamente también se iniciará estableciendo la conexión sin contratiempos y sin intervención del usuario.


Clientes OpenVPN en openSUSE

Hay varias formas para configurar una distro Linux como cliente OpenVPN, estas simplemente varían de acuerdo al método de configuración de red que se utilice.

Como ya lo he mencionado más arriba y lo vuelvo a repetir, es muy importante tener en cuenta que en los equipos clientes la red de su interfaz sea distinta a las redes autorizadas en el servidor OpenVPN (en el archivo /etc/openvpn/ccd/empresaX), ya que en caso contrario se generará un conflicto en el ruteo de las redes. El equipo cliente no podrá identificar correctamente su propia red local con la red remota a la cual puede acceder a través del tunel de la VPN.

Para openSUSE voy a mencionar las dos formas que he probado, la primera para un equipo configurado con el método tradicional ifup (controlada solo por el administrador del OS) y el segundo para un equipos configurado con el método NetworkManager (controlada por los usuarios normales). En ambos casos la configuración de los clientes es bastante sencilla, a continuación se citan los pasos necesarios para el primero.

OpenSUSE con método de configuración de red Ifup:

  1. En primera instancia debemos verificar que tengamos instalado el paquete openvpn:
    testsrv:~ # zypper search -i openvpn
    Si no se encuentra instalado lo instalamos con el siguiente comando:
    testsrv:~ # zypper install openvpn
  2. Copiamos los archivos necesarios para el cliente openvpn al directorio /etc/openvpn, para este ejemplo se utilizarán los mismos utilizados en el ejemplo para la configuración de windows:
    • ca.crt
    • ta.key
    • empresaX.crt
    • empresaX.csr
    • empresaX.key
    • client.ovpn (No requerido para Linux)
    • client.conf

  3. Atención: Si no disponemos de un archivo de configuración .conf generado por el script clientes_crear.sh mencionado en el apartado Generación de llaves y certificados para roadwarriors de esta guía, necesitamos crear en el directorio /etc/openvpn un archivo llamado client.conf a partir de un archivo plantilla.
    testsrv:~ # cp /usr/share/doc/packages/openvpn/sample-config-files/client.conf /etc/openvpn/
    Nos dirigimos al directorio /etc/openvpn en el cual procedemos a editar el archivo client.conf
    testsrv:~ # cd /etc/openvpn
    testsrv:/etc/openvpn # vi client.conf

    Y luego pasamos a configurar las principales directivas de la siguiente forma:
    remote ip_o_dominio_de_servidor 1194
    ca ca.crt
    cert empresaX.crt
    key empresaX.key
    tls-auth ta.key 1
  4. Continuando en el directorio /etc/openvpn le asignamos el usuario correspondiente y le aplicamos los permisos de acceso recomendados:
    testsrv:/etc/openvpn # chown root:root *
    testsrv:/etc/openvpn # chmod 600 *

  5. Luego pasamos a iniciar el servicio openvpn:
    testsrv:~ # service openvpn start
  6. Y para finalizar activamos el inicio automático del servicio durante el arranque del sistema operativo:
    testsrv:~ # chkconfig --add openvpn
  7. Estos son todos los pasos, si hemos procedido con los mismos ya deberíamos tener establecida nuestra vpn. Para verificar que las rutas se hayan cargado correctamente ejecutamos el comando route:
    testsrv:~ # route

OpenSUSE con método de configuración de red NetworkManager:

  1. Para comenzar debemos verificar que tengamos instalado aparte del paquete openvpn, los paquetes NetworkManager-openvpn, NetworkManager-openvpn-kde4 (para los usuarios de Gnome el paquete NetworkManager-openvpn-gnome):
    testsrv:~ # zypper search -i openvpn NetworkManager-openvpn NetworkManager-openvpn-kde4
    si no se encuentran los instalamos:
    testsrv:~ # zypper install openvpn NetworkManager-openvpn NetworkManager-openvpn-kde4
  2. Creamos una carpeta oculta (para aumentar levemente la seguridad) en nuestro directorio home:
    gabriel@testsrv:~> mkdir ~/.vpnkeys
  3. Una vez creada la carpeta procedemos a copiar en ella los archivos necesarios para establecer la vpn mediante el cliente OpenVPN de NetworkManager:
    • ca.crt
    • ta.key
    • empresaX.crt
    • empresaX.csr
    • empresaX.key

  4. Accedemos a la carpeta .vpnkeys y le asignamos el usuario y los respectivos premisos de acceso:
    gabriel@testsrv:~> cd ~/.vpnkeys
    gabriel@testsrv:~/.vpnkeys> chown gabriel:users *
    gabriel@testsrv:~/.vpnkeys> chmod 600 *

  5. Luego de los pasos anteriores por fin comenzaremos con las configuraciones del NetworkManager. Suponiendo que el mismo ya se encuentra en ejecución y que el usuario previamente haya configurado su acceso a Internet (no abarcado en esta guía), el primer paso consiste en hacer clic sobre el ícono del NetworkManager en la Bandeja del Sistema y seleccionar la opción Gestionar las Conexiones (Manage Connections):


  6. En la nueva ventana debemos estar ubicados en la opción Conexiones de red y dirigirnos a la pestaña VPN, en este punto hacemos clic en la lista desplegable Añadir... donde seleccionamos la opción OpenVPN:


  7. Con la realización del paso anterior se desplegará una nueva ventana donde podemos configurar la conexión de red para la vpn. En la parte superior de la misma debemos especificar un Nombre de conexión y podemos definir que la conexión se establezca automáticamente marcando la opción Conectar automáticamente (en este ejemplo no marqué esa opción, prefiero iniciar la vpn manualmente). Luego, en la pestaña OpenVPN y subpestaña Ajustes necesarios debemos completar el campo Puerta de enlace con la dirección IP o el nombre de dominio del servidor OpenVPN, en los campos Archivo CA, Certificado y Clave se definen las rutas completas hacia los archivos ca.crt, empresaX.crt y empresaX.key respectivamente; la opción Tipo de conexión la dejamos por defecto y en la lista desplegable del campo Contraseña de la clave seleccionamos la opción No requerido. A continuación la correspondiente captura de pantalla:


  8. En la siguiente subpestaña Ajustes opcionales marcamos la opción Usar compresión LZO y completamos el campo Puerto de la puerta de enlace con el puerto UDP que utiliza el servicio OpenVPN. En la subpestaña Seguridad opcional dejamos todo por defecto:


  9. Pasando a la subpestaña Ajustes opcionales de TLS debemos marcar la opción Usar una autenticación TLS adicional y luego completar el campo Clave donde especificamos la ubicación del archivo ta.key, también debemos seleccionar el valor 1 en la lista desplegable Dirección de la clave. Por su parte en la subpestaña Proxys dejamos todo por defecto.


  10. Con el paso anterior hemos culminado con las configuraciones de la pestaña OpenVPN, ahora en las pestañas Dirección IPv4 y Dirección IPv6 se dejan las configuraciones como vienen por defecto. Finalizamos la configuración haciendo clic en el botón Aceptar para crear la conexión VPN.


  11. En la siguiente captura se puede observar que se ha creado la conexión VPN con el nombre que habíamos especificado, clic en Aplicar y Aceptar para salir.


  12. Ahora solo nos resta iniciar la VPN, si como yo no han especificado que la VPN se conecte automáticamente debemos activarla manualmente desplazándonos con el ratón sobre el ícono de NetworkManager en la Bandeja de Sistema y hacer clic sobre el nombre de la conexión VPN que hemos definido (en mi caso vpn_testnet). Una vez concluido el proceso, se verá en pantalla el mensaje Conectado y lo podremos parar haciendo clic nuevamente en el botón rojo de la derecha.


  13. Y bueno, estos son todos los pasos. Para verificar que las rutas se hayan cargado correctamente ejecutamos el comando route con el usuario root:
    testsrv:~ # route


Fuentes

Para la redacción de este artículo se han utilizado en gran parte las siguientes fuentes:


Enlaces externos

Comentarios

  1. Gabriel

    Utilice tu howto para centos CentOS-6.4-x86_64-minimal donde lo que varia seria lo siguiente:

    Agregamos el repositorio EPEL – Extra Packages for Enterprise Linux
    [root@ovpn ]# wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
    [root@ovpn ]# rpm -Uvh epel-release-6-8.noarch.rpm

    Instalamos OpenVPN y Easy-RSA
    [root@ovpn ]# yum install -y openvpn easy-rsa telnet

    Creamos las carpetas y copiamos el sampler del easy-rsa:
    [root@ovpn ~]# mkdir -p /etc/openvpn/rsa/keys
    [root@ovpn ~]# cp /usr/share/easy-rsa/2.0/* /etc/openvpn/rsa/

    Lo demas se mantiene tal cual el post.
    Gracias por el aporte
    Slds.

    ResponderEliminar

Publicar un comentario