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
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
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: |
|
• |
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
, allí aparecerá un menú en el cual podrá elegir la opción conectar [connect].

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.


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
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
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
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
Efectivamente tu puedes asignar permisos de navegacion para esto.
Hola, cómo puedo ver qué usuarios son los que se conectan a la vpn en un determinado momento????