MONTAR UN SERVIDOR OPENVPN (LINUX)

OpenVPNes una solución de conectividad basada en software: SSL(Secure Sockets Layer) VPNVirtual Private Network [red virtual privada], OpenVPN ofrece conectividad punto-a-punto con validación, jerárquica de usuarios y host conectados remotamente.

Tipo de configuración.

En esta ocasión se realizará una configuración tipo VPN Intranet.

Este tipo de redes es creado entre una oficina central [servidor] y una o varias oficinas remotas [clientes]. El acceso viene del exterior. Se utiliza este tipo de VPN cuando se necesita enlazar a los sitios que son parte de una compañía, en nuestro caso será compuesto por un servidor Central que conectará a muchos clientes VPN entre si.

Modelo de VPN

Modelo de VPN

El servidor VPN hace de pasarela para que todos los clientes puedan estar comunicados a través del túnel OpenVpn.

Cada cliente se encuentra en lugares diferentes con diferentes tipos de segmento de red, al estar conectados mediante el túnel VPN se crea un red virtual y se asigna un nuevo segmento de red proporcionada por el servidor principal en este caso con segmento [10.10.0.0/255.255.255.255].

INSTALACIÓN VPN CON OPENVPN

  • Instalación a partir de paquete TAR.

Los paquetes se pueden descargar de la pagina oficial del OpenVPN

http://openvpn.net/

Instalar desde paquete .tar, descomprima el paquete donde x.x-x es la versión del Openvpn:

tar zxvf openvpn-x.x-x.tar.g

Compilar OpenVPN:

cd openvpn-x.x.
./configure
make
make install
  • Preparación de guiones (script) RSA

Para la administración de la PKI (Infraestructura de Llave Publica – Public Key Infrastructure) usaremos los guiones que vienen junto con OpenVPN (easy-rsa) la versión reciente trae consigo muchas mejoras, es esta easy-rsa 2.0.

cp -Rp /lugardondehallamosdescomprimido/openvpn-x.x-x/easy-rsa/ /etc/openvpn
cp /etc/openvpn/easy-rsa/openssl.cnf /etc/openvpn

A continuación será modificar la Autoridad Certificadora ( CA) para generar las llaves, para esto se edita el fichero /etc/openvpn/easy-rsa/vars de la siguiente forma, por ejemplo:

export KEY_COUNTRY=ES
export KEY_PROVINCE=MADRID
export KEY_CITY=MADRID
export KEY_ORG=tuempresa.es
export KEY_EMAIL="administrador@tudominio.es"

KEY_COUNTRY: Especifica el país donde se encuentra el servidor vpn

KEY_PROVINCE: Provincia o estado donde se encuentra este.

KEY_CITY: Ciudad ubicado el servidor vpn.

KEY_ORG: Dominio o departamento de la organización/Empresa.

KEY_MAIL: Correo electrónico de la organización/empresa.

Importante: Se deben de llenar todos los parámetros ya que son indispensables para los certificados que serán creados.

Seguidamente se ejecutarán los guiones (scripts) para general las llaves correspondientes.

  • Inicializando Autoridad Certificadora el CA

Primero: Hay que copiar unos archivos al directorio /etc/openvpn

cp openssl.cnf whichopensslcnf pkitool /etc/openvpn

Estos 3 archivos suelen estar en

cp -Rp /lugardondehallamosdescomprimido/openvpn-x.x-x/easy-rsa/

O en su defecto

cp -Rp /lugardondehallamosdescomprimido/openvpn-x.x-x/easy-rsa/2.0

Segundo: para generar el CA deberá realizar los siguientes pasos:

cd /etc/openvpn/
source easy-rsa/2.0/./vars
sh easy-rsa/2.0/clean-all
sh easy-rsa/2.0/build-ca
cd /etc/openvp

Generando Parametros Diffie Hellman.

Los parámetros Diffie Hellmandeben de ser generados en el Servidor OpenVPN, para realizar esto deberá ejecutar el guión de la siguiente forma:

sh easy-rsa/2.0/build-dh

Generación de llaves.

Para generar el certificado y llave privada para el servidor será de la siguiente forma:

sh easy-rsa/2.0/build-key-server miservidor

En donde [miservidor] es una variable para identificar la llave privada del servidor.

Para generar el certificado y llave para los clientes se hará de la siguiente forma:

Nosotros utilizamos la misma llave para todos los clientes.

sh easy-rsa/2.0/build-key cliente

Una ves que se han generado las llaves correspondientes a los clientes y servidor, se podrá rescatar estas en el directorio /etc/openvpn/keys

  • CONFIGURACIÓN

Configuración del Servidor Linux VPN

Para la creación del servidor OpenVPN se deberá crear un archivo de configuración udp en el directorio /etc/openvpn/ con el nombre server.conf

port 1194
proto udp
dev tun
#---- Seccion de llaves -----
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
#----------------------------
server 10.10.0.0 255.255.255.0
push “route 192.168.33.0 255.255.255.0”
ifconfig-pool-persist ipp.txt
duplicate-cn
keepalive 10 120
comp-lzo
persist-key
persist-tun
user nobody
group nobody
status openvpn-status-servidorvpn-udp-1194.log
log-append  /var/log/openvpn.log
verb 3

Descripción:

Port: Especifica el puerto que será utilizado para que los clientes vpn puedan conectarse al servidor.

Proto: tipo de protocolo que se empleará en a conexión a través de VPN

dev: Tipo de interfaz de conexión virtual que se utilizará el servidor openvpn.

ca: Especifica la ubicación exacta del fichero de Autoridad Certificadora [.ca].

cert: Especifica la ubicación del fichero [.crt] creado para el servidor.

key: Especifica la ubicación de la llave [.key] creada para el servidor openvpn.

dh: Ruta exacta del fichero [.pem] el cual contiene el formato de Diffie Hellman (requirerido para –tls-serversolamente).

server: Se asigna el rango IP virtual que se utilizará en la red del túnel VPN.

Push: “Empuja” o permite el paso a nuestra LAN

Ifconfig-pool-persist: Fichero en donde quedarán registrado las direcciones IP de los clientes que se encuentran conectados al servidor OpenVPN.

Duplicate-cn: Permite el uso de un mismo certificado para todos los clientes (de lo contrario cada cliente deberia tener su propio certificado)

Keepalive 10 120 : Envía los paquetes que se manejan por la red una vez cada 10 segundos; y asuma que el acoplamiento es abajo si ninguna respuesta ocurre por 120 segundos.

comp-lzo: Especifica los datos que recorren el túnel vpn será compactados durante la trasferencia de estos paquetes.

persist-key: Esta opción soluciona el problema por llaves que persisten a través de los reajustes SIGUSR1, así que no necesitan ser releídos.

Persist-tun: Permite que no se cierre y re-abre los dispositivos TAP/TUN al correr los guiones up/down

User & Group NOBODY: para restringir los privilegios del demonio OPENVPN.

status: fichero donde se almacenará los eventos y datos sobre la conexión del servidor [.log]

log-append: Para que genere el log en un fichero aparte.

verb: Nivel de información (default=1). Cada nivel demuestra todo el Info de los niveles anteriores. Se recomienda el nivel 3 si usted desea un buen resumen de qué está sucediendo.

0 —No muestra una salida excepto errores fatales. 1 to 4 –Rango de uso normal. 5 —Salida Ry Wcaracteres en la consola par los paquetes de lectura y escritura, mayúsculas es usada por paquetes TCP/UDP minúsculas es usada para paquetes TUN/TAP.

Para la configuración del Servidor VPN necesitamos insertar el módulo (tun) para controlar los interfaces /dev/net/tunX que se necesiten en le sistema, así pues creamos el directorio /var/empty para hacer chroot y seguidamente reiniciamos el servicio OpenVPN:

Cargamos el módulo (en nuestro caso ya esta cargado):

modprobe tun

Y habilitamos el IP forwarding (vital, de lo contrario no permitira que pasen los paquetes de la red 10.10.0.0 a la LAN 192.168.33.20). Este comando habra que insertarlo en algun script que se ejecute al inicio del sistema, hay que al reiniciar el IP_FORWARD desaparece

echo 1 > /proc/sys/net/ipv4/ip_forward

Para la ejecución del servidor OpenVPN puede utilizar el siguiente script y guardarlo con el nombre de openvpn dentro de /etc/opnevpn , con el siguiente contenido:

#!/bin/bash
#
#-- Variables --
RUTACONFIG=”/etc/openvpn/”
NOMCONFIG=”servidorvpn-udp-1198.conf”
#
#-- Ejecuciónde la configuraciónpara el servicioOpenVPN
#
$RUTACONFIG$NOMCONFIG
 #
exit 0

Y damos los permiso de ejecución correspondientes:

chmod +x openvpn

Para crear el demonio y poder controlar el OPENVPN como un servicio mas de Linux:

Hay que crear un fichero llamado openvpn dentro de /etc/init.d con el siguiente contenido (sacado de la pagina WEB de openvpn)


# Ubicación del binario openvpn
openvpn=""
openvpn_locations="/usr/sbin/openvpn /usr/local/sbin/openvpn"
for location in $openvpn_locations
do
  if [ -f "$location" ]
  then
    openvpn=$location
  fi
done

# Fichero de cerrojo (lock)
lock="/var/lock/subsys/openvpn"

# Directorio de PID
piddir="/var/run/openvpn"

# Directorio de trabajo
work=/etc/openvpn

# Añadir funciones de librería.
. /etc/rc.d/init.d/functions

# Añadir configuración de red.
. /etc/sysconfig/network

# Comprobar si la red está activa.
if [ ${NETWORKING} = "no" ]
then
  echo "Networking is down"
  exit 0
fi

# Comprobar si existe el ejecutable
if ! [ -f  $openvpn ] 
then
  echo "openvpn binary not found"
  exit 0
fi

# Comprobar cómo nos han llamado.
case "$1" in
  start)
        echo -n $"Starting openvpn: "

        /sbin/modprobe tun >/dev/null 2>&1

        # Desde el punto de vista de la seguridad, creo que tiene
        # sentido eliminar esto, y obligar a los usuarios que lo
        # necesiten a habilitarlo explícitamente en su scripts de arranque o
        # en la configuración del firewall.

        #echo 1 > /proc/sys/net/ipv4/ip_forward

        if [ ! -d  $piddir ]; then
            mkdir $piddir
        fi

        if [ -f $lock ]; then
            # no nos pararon correctamente
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
              if [ -s $pidf ]; then
                kill `cat $pidf` >/dev/null 2>&1
              fi
              rm -f $pidf
            done
            rm -f $lock
            sleep 2
        fi

        rm -f $piddir/*.pid
        cd $work

        # Arrancar cada .conf en $work y ejecutar .sh si existe
        errors=0
        successes=0
        for c in `/bin/ls *.conf 2>/dev/null`; do
            bn=${c%%.conf}
            if [ -f "$bn.sh" ]; then
                . $bn.sh
            fi
            rm -f $piddir/$bn.pid
            $openvpn --daemon --writepid $piddir/$bn.pid --config $c --cd $work
            if [ $? = 0 ]; then
                successes=1
            else
                errors=1
            fi
        done

        if [ $errors = 1 ]; then
            failure; echo
        else
            success; echo
        fi

        if [ $successes = 1 ]; then
            touch $lock
        fi
        ;;
  stop)
        echo -n $"Shutting down openvpn: "
        for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
          if [ -s $pidf ]; then
            kill `cat $pidf` >/dev/null 2>&1
          fi
          rm -f $pidf
        done
        success; echo
        rm -f $lock
        ;;
  restart)
        $0 stop
        sleep 2
        $0 start
        ;;
  reload)
        if [ -f $lock ]; then
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
                if [ -s $pidf ]; then
                    kill -HUP `cat $pidf` >/dev/null 2>&1
                fi
            done
        else
            echo "openvpn: service not started"
            exit 1
        fi
        ;;
  reopen)
        if [ -f $lock ]; then
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
                if [ -s $pidf ]; then
                    kill -USR1 `cat $pidf` >/dev/null 2>&1
                fi
            done
        else
            echo "openvpn: service not started"
            exit 1
        fi
        ;;
  condrestart)
        if [ -f $lock ]; then
            $0 stop
            # evitar condiciones de carrera
            sleep 2
            $0 start
        fi
        ;;
  status)
        if [ -f $lock ]; then
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
                if [ -s $pidf ]; then
                    kill -USR2 `cat $pidf` >/dev/null 2>&1
                fi
            done
            echo "Status written to /var/log/messages"
        else
            echo "openvpn: service not started"
            exit 1
        fi
        ;;
  *)
        echo "Usage: openvpn {start|stop|restart|condrestart|reload|reopen|status}"
        exit 1
        ;;
esac
exit 0

Luego, hay que asignarle permisos de ejecucion a dicho archivo:

chmod 755 /etc/init.d/openvpn

Ahora hay que agregarlo a la lista de servicios

chkconfig –add openvpn

chkconfig openvpn on

Configuración de Clientes VPN con OpenVPN

Clientes Windows

Para la configuración de clientes OpenVPN utilizaremos el programa OpenVPN GUI para Windows.

OpenVPN GUI para Windows corre normalmente en una ventana de consola, al ser conectado al servidor remoto/local VPN le da un aviso en el área de notificación (el área de abajo a la derecha por el reloj en la barra ), desde allí puede tener el control de iniciar/parar el Cliente OpenVPN, consultar los avisos (log), incluso cambiar su contraseña.

Puede ser descargado en el sitio OpenVPN GUI for Windows [http://openvpn.se].

Preparativos y configuración

A continuación deberá copiar los siguientes ficheros:

ca.crt.

cliente1.crt.

cliente1.csr.

cliente1.key

Estos fueron creados en el directorio /etc/openvpn/easy-rsa/2.0/keys y deberán ser colocados en la máquina cliente dentro de  C:\Archivos de Programa\OpenVPN\config

Se creará un fichero de configuración cliente para el OpenVPN dentro del directorio C:|Archivos de Programa\OpenVPN\config con el nombre de cliente1-udp-1194.ovpn.

Tendrá la siguiente configuración:

client
dev tun
proto udp
remoteIPDELSERVIDOROPENVPN 1194
float
resolv-retry infinite
nobind
persist-key
persist-tun
#------ SECCION DE LLAVES --------
ca ca.crt
cert cliente.crt
key cliente.key
ns-cert-type server
#---------------------------------
comp-lzo
verb 3

Descripción:

client: Especifica el tipo de configuración, en este caso tipo cliente OpenVPN.

Port: Especifica el puerto que será utilizado para que los clientes VPN puedan conectarse al servidor.

Proto: tipo de protocolo que se empleará en a conexión a través de VPN

dev: Tipo de interfaz de conexión virtual que se utilizará el servidor openvpn.

remote: Host remoto o dirección IP en el cliente, el cual especifica al servidor OpenVPN.

El cliente OpenVPN puede tratar de conectar al servidor con host:porten el orden especificado de las opciones de la opción –remote.

float: Este le dice a OpenVPN aceptar los paquetes autenticados de cualquier dirección, no solamente la dirección cuál fue especificado en la opción –remote.

resolv-retry: Si la resolución del hostname falla para — remote, la resolución antes de fallar hace una re-comprobación de n segundos.

nobind: No agrega bind a la dirección local y al puerto.

ca: Especifica la ubicación exacta del fichero de Autoridad Certificadora [.ca].

cert: Especifica la ubicación del fichero [.crt] creado para el servidor.

key: Especifica la ubicación de la llave [.key] creada para el servidor OpenVPN.

remote: Especifica el dominio o IP del servidor así como el puerto que escuchara las peticiones para servicio VPN.

comp-lzo: Especifica los datos que recorren el túnel VPN será compactados durante la trasferencia de estos paquetes.

persist-key: Esta opción soluciona el problema por llaves que persisten a través de los reajustes SIGUSR1, así que no necesitan ser releídos.

Persist-tun: Permite que no se cierre y re-abre los dispositivos TAP/TUN al correr los guiones up/down

verb: Nivel de información (default=1). Cada nivel demuestra toda la Información de los niveles anteriores. Se recomienda el nivel 3 si usted desea un buen resumen de qué está sucediendo.

0 —No muestra una salida excepto errores fatales. 1 to 4 –Rango de uso normal. 5 —Salida Ry Wcaracteres en la consola par los paquetes de lectura y escritura, mayúsculas es usada por paquetes TCP/UDP minúsculas es usada para paquetes TUN/TAP.

Una ves configurado el cliente VPN con Windows, deberá ir al área de notificación (el área de abajo a la derecha por el reloj en la barra de Windows) y dar un click derecho al icono del cliente OpenVPN ICONO, allí aparecerá un menú en el cual podrá elegir la opción conectar [connect].

VPNSYSTRAY

Cuando intente conectarse al servidor VPN una vez que haya elegido la opción [connect] aparecerá una ventana de notificación en el cual vera los procesos de verificación e intento de conexión al servidor VPN, si todo sale bien, en el icono de notificación del cliente OpenVPN le indicará la correcta conexión y le mostrará el número de IP virtual [tun] que se le fue asignado.

VPN-CONNECTED

~ por chavodie en 17/05/2009.

11 comentarios to “MONTAR UN SERVIDOR OPENVPN (LINUX)”

  1. No seas rata y pon la fuente de donde lo sacaste!!!

    • Gracias por comentar. El manual lo tengo de hace mucho tiempo y lo modifique para hacerlo mas facil. Seguramente la primera parte esta sacada de la WEB, pero no se a quien darle credito. A quien corresponda entonces. Un saludo

  2. Saludos
    Excelente manual, pero tengo algunas dudas. te agradeceria enormemente q me pudieras colaborar. pues soy muy nuevo en esto de vpn en linux.
    primero , el fichero q se edita es el /etc/openvpn/easy-rsa/vars
    pero el q se ejecuta es el q esta en /2.0 no entiendo por que .
    al ejecutar build-ca me genera el sigueinte error;
    pkitool: KEY_CONFIG (set by the ./vars script) is pointing to the wrong
    version of openssl.cnf: /etc/openvpn/openssl.cnf
    The correct version should have a comment that says: easy-rsa version 2.x

    muchas gracias por el tiempo q me puedas prestar

    Esto lo estoy corriendo en un Amd opteron bajo Mandriva 2009 powerpack

    • Hola, gracias por participar y perdona la demora al responder. Si te fijas el manual especifica

      cp openssl.cnf whichopensslcnf pkitool /etc/openvpn

      Estos 3 archivos suelen estar en

      cp -Rp /lugardondehallamosdescomprimido/openvpn-x.x-x/easy-rsa/

      O en su defecto

      cp -Rp /lugardondehallamosdescomprimido/openvpn-x.x-x/easy-rsa/2.0

      Y a continuacion sigue el ejemplo con la carpeta 2.0.

      Si en tu caso has copiado los archivos a la carpeta ./var (sin el 2.0), quita ese directorio a la hora de ejecutar los comandos y hazlos apuntar al sitio donde hayas copiado los 3 archivos.
      Espero te sirva de ayuda. Un saludo

  3. Muchas gracias, me funciono totalmente , pero al instalarlo en un xeon , me dice
    el servicio openvpn no soporta chkconfig

    que deberia hacer en este caso!!
    muchas gracias x tua ayuda

    • En el script de inicio del servico de openvpn (etc/init.d/openvpn) agregale esta linea en la seccion de configuracion (suele ser en las primeras lineas)

      # chkconfig: 2345 55 25

      Esto indica al script que puede ser manejado por el comando chkconfig.
      El primer grupo de numeros indicara en que runlevels puede iniciarse el servicio.
      El segundo el orden de prioridad a la hora de arrancar.
      y el tercero el orden de prioridad para detenerse

      Espero te ayude

  4. Hola. Disculpa que reviva un post del 2009, pero me gustaria saber si es posible que a traves del Server VPN, los clientes VPN tengan saida a internet (navegacion, msn , etc) con los tuneles que se han creado. Espero haber sido claro. Muchas gracias por tu tiempo. Saludos

  5. Hola, cómo puedo ver qué usuarios son los que se conectan a la vpn en un determinado momento????

  6. Oye tengo que aplicar el DMZ a mi server para que apunte la vpn a mi dirección pública?

  7. Hola tengo que asignar el DMZ a mi server para que la VPN apunte a mi IP pública o que paso sigue?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: