Hoy traigo una guía de instalación y configuración de una VPN segura utilizando el software openVPN sobre un servidor openSUSE 11.0 y clientes openSUSE 11.0 y Windows XP (SP3).
Me tomó un par de días hacerla ya que tuve que solucionar algunos problemas que sucedieron en el camino cuyas soluciones ahora son parte de la guía misma.
Si tienen aportes a la guía con gusto la actualizaré, la idea es que nos sirva a todos.
Agradeceré cualquier comentario constructivo.
Índice de contenido
Resumen
1 Introducción
1.1 Objetivos generales
1.2 Objetivos específicos
1.3 Conceptos generales
2 Requerimientos
3 Instalación
4 Generación de llave y certificado maestro para unidad certificadora
5 Generación de llave y certificado para el servidor
6 Generación de llave y certificado para el cliente
7 Generación de firma HMAC tls-auth
7.1 Servidor
7.2 Cliente
8 Resumen de archivos creados
9 Configuración del servidor y el cliente
9.1 Servidor
9.1.1 Dando acceso a los clientes a la red local del servidor
9.1.2 Subnet a Subnet
9.2 Cliente (openSUSE 11.0)
9.2.1 Sin control del usuario
9.2.2 Con control del usuario
9.3 Cliente (Windows XP)
10 Revocar certificados
11 Conclusiones
12 Anexos
Resumen
Este documento explica paso a paso la instalación y configuración de una VPN segura utilizando el software openVPN.
Una VPN (Virtual Private Network) es una red virtual privada que está compuesta por equipos (computadores, ordenadores) en una red. Se utilizan para crear redes seguras y privadas, mediante las cuales se puede hacer traspaso de información o utilización de recursos como carpetas (directorios) compartidas e impresoras.
En este documento encontrará información detallada útil para montar un servidor sobre el sistema operativo openSUSE 11.0 y clientes openSUSE 11.0 y Windows XP.
Para montar un servidor, múltiples clientes y manejar la seguridad se utilizarán certificados digitales y llaves privadas (tanto para el servidor como para el cliente), para lo cual se creará una unidad certificadora (CA) quien se encargará de emitir y gestionar los certificados digitales y llaves privadas.
También se mostrará cómo agregar seguridad extra gracias a la firma HMAC tls-auth y revocación de certificados.
Este documento es una adaptación de la guía de Jorge Armando Medina de openVPN para Slackware del 2006-05-03 (http://tuxjm.net/docs/openvpn-como4slack/index.html) a openSUSE 11.0 (servidor y cliente) y Windows XP (cliente) al 2008-07-13.
1 Introducción
Como se mencionó en el resumen de el presente documento, una VPN se utiliza para crear redes virtuales privadas, mediante las cuales podemos transferir información por un canal inseguro como es Internet de forma mas segura.
Se utilizan, por ejemplo, para integrar a nuestra red local equipos o redes externas. Una aplicación posible es, por ejemplo, unir sucursales de una empresa de manera que puedan compartir recursos (directorios e impresoras, etc.), o conectar un equipo de nuestro hogar a la red local de la organización para obtener documentos de forma remota y segura (algo que seguramente a un gerente de la organización le gustaría).
En este documento se tratarán las VPN seguras utilizando openVPN.
1.1 Objetivos generales
Con este documento se pretende dar una guía detallada para montar un servidor openVPN sobre el sistema operativo openSUSE 11.0, así como clientes openVPN montados sobre sistemas operativos openSUSE 11.0 y Windows XP.
1.2 Objetivos específicos
- Montar un servidor openVPN en el sistema operativo openSUSE 11.0.
- Montar un cliente openVPN en el sistema operativo openSUSE 11.0.
- Montar un cliente openVPN en el sistema operativo Windows XP.
1.3 Conceptos generales
Como se mencionó en la introducción, para crear una VPN utilizaremos openVPN. Un punto muy importante es la seguridad de nuestros datos, con openVPN podemos manejar esto utilizando certificados digitales X.509 y llaves privadas, tanto para el servidor como para los clientes.
Para generar los certificados y llaves necesitamos una unidad certificadora, denominada CA (Certificate Authority). Esta CA necesita un certificado y llave maestro para generar los archivos para el servidor y clientes.
En este documento mantendremos la CA y el servidor openVPN en la misma máquina, pero también se pueden tener separados en máquinas distintas.
Para generar las llaves privadas se utiliza el protocolo Diffie Hellman (http://es.wikipedia.org/wiki/Diffie-Hellman), el cual se usa para generar claves simétricas. Mediante éste mecanismo podemos crear una comunicación entre el cliente y el servidor, en donde se hace un intercambio de llave secreta de forma segura ya que utiliza encriptación de datos, de fábrica se utiliza un cifrado de 1024 bits, pero es parametrizable.
Una vez que se tiene la CA configurada se procede a crear un certificado y una llave privada para el servidor y los clientes (cada certificado y llave privada es distinta para cada cliente y servidor).
OpenVPN hace uso de interfaces TUN (http://en.wikipedia.org/wiki/TUN/TAP) para crear una subred en la cual existirá comunicación entre el cliente y el servidor. Una interfaz TUN provee a la máquina cliente de una interfaz virtual de red mediante la cual podrá asignarse una IP de la subred desde el servidor.
Para poder hacer uso de una interfaz virtual sin que entorpezca a la interfaz real (eth0 por ejemplo) se utiliza un bridge. En este bridge o puente es donde se “cuelgan” las interfaces de red “virtuales” y “reales” y hace de puente para la entrada o salida hacia y desde Internet o nuestra red local.
De esta manera podemos tener un IP de red local 192.168.0.3 y una de la VPN como 10.8.0.6 al mismo tiempo, teniendo acceso a Internet sin problemas.
Un bridge es muy útil cuando se utilizan máquinas virtuales ya que mediante interfaces virtuales (TUN/TAP) se les pueden asignar su propio IP estando en la misma máquina y todos pueden acceder a Internet o a la red sin problemas.
OpenVPN crea, de fábrica, una subred en el dominio 10.8.0.0/24.
2 Requerimientos
El sistema operativo utilizado es openSUSE 11.0 (http://www.opensuse.org), otras distribuciones o sistemas operativos también pueden funcionar siempre y cuando openVPN (http://openvpn.net) pueda correr sobre ellos, pero no se da ninguna garantía de que funcione al pie de la letra, es posible que el directorio de instalación, la forma de configurar el cortafuegos, archivos, etc. sea distinto.
Para el servidor (openSUSE 11.0) se requiere instalar:
- OpenVPN 2.0.9
Para el cliente (openSUSE 11.0) se requiere instalar:
- OpenVPN 2.0.9
- KnetworkManager
- KnetworkManager-openvpn
Para el cliente (Windows XP) se requiere instalar:
- OpenVPN 2.0.9
- OpenVPN-gui 1.0.3
En el caso de el cliente y servidor openSUSE 11.0 se recomienda configurar los repositorios de software antes de instalar cualquier cosa, siempre es bueno tener el software actualizado.
Para agregar los repositorios abrimos YaST → Software → Repositorios de software → Añadir → Repositorios de la comunidad y ahí seleccionamos los que consideremos necesarios.
3 Instalación
En el caso de openSUSE, tanto para el servidor como el cliente hay que utilizar YaST → Software → Instalar/Desinstalar software para instalar openVPN, el cual viene en el DVD.
En el caso de Windows XP podemos ir a http://openvpn.se y descargar openVPN 2.0.9 y openVPN-gui 1.03 en el mismo paquete e instalarlo, si lo queremos en español entonces, además del paquete anterior, descargamos openvpn-gui-1.0.3-es y lo copiamos al directorio bin de instalación de openVPN (C:\Archivos de programa\OpenVPN\bin).
4 Generación de llave y certificado para la unidad certificadora
Lo primero es generar los certificados y llaves necesarios para la unidad certificadora (CA). Para tal tarea utilizaremos unos scripts que vienen hechos en openVPN, específicamente la versión 2.0. Estos scripts están en el directorio /usr/share/openvpn/easy-rsa/2.0/
y debemos copiarlos al siguiente directorio /etc/openvpn/easy-rsa-V2.0/ el cual debemos crear previamente, para esto como usuario root escribimos lo siguiente en la consola:
#mkdir /etc/openvpn/easy-rsa-V2.0/
y luego copiamos los scripts al directorio recién creado:
#cp /usr/share/openvpn/easy-rsa/2.0/* /etc/openvpn/easy-rsa-V2.0
luego crearemos el directorio keys dentro del directorio previamente creado:
#mkdir -p /etc/openvpn/easy-rsa-V2.0/keys
y tendremos el directorio listo para configurar como se ve en la siguiente imagen:
De ahora en adelante trabajaremos con los scripts del directorio /etc/openvpn/easy-rsa-V2.0/.
Con el siguiente comando entramos al directorio de trabajo:
#cd /etc/openvpn/easy-rsa-V2.0
El siguiente paso corresponde a la configuración de algunos parámetros en el archivo vars. Para esto abrimos dicho archivo con kwrite u otro editor de texto:
#kwrite vars
y bajamos hasta el bloque final donde se exportan las variables que definen a la CA.
KEY_COUNTRY
KEY_PROVINCE
KEY_CITY
KEY_ORG
KEY_EMAIL
Éstas variables deben ser definidas según los datos que correspondan a la organización.
Además podemos cambiar el tamaño de la llave, que de fábrica viene con el valor de 1024 bits, mientras mas alto sea el valor, mas seguro será el sistema pero la validación se hará mas lenta. 1024 es un valor razonable, pero como dice el archivo de configuración, si somos paranoicos lo subimos a 2048 bits.
Una vez definidas las variables ejecutamos el siguiente comando:
#source ./vars
si todo sale bien deberíamos obtener la siguiente salida:
NOTE: If you run ./clean-all, I will be doing a rm -rf on
/etc/openvpn/easy-rsa-V2.0/keys
Ahora generaremos los parámetros Diffie Hellman para lo cual simplemente ejecutamos el archivo build-dh:
#./build-dh
y si todo sale bien deberíamos ver la siguiente salida:
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
......+.+..............+...................................................................
....+...........................+................................+.........................
...........+.......................................+......................+................
............................+................................................................
..............................................................+..............................
.....................+...........................................+..........................
........................+....................................................................
+........................+..........................................+......................
................................................+....+......................................
..............................................................................................
....................................+........................................................
.................................................+......+...............................+..
..............+........................................+....................................
+........................+..........++*++*++*
tal como se ve en la siguiente imagen:
Ahora crearemos el certificado para la CA, para esto escribimos en consola el siguiente comando:
#./pkitool --initca
con lo cual debemos obtener la siguiente salida:
Using CA Common Name: Metalklesk's enterprise CA
Generating a 1024 bit RSA private key
........................................++++++
......++++++
writing new private key to 'ca.key'
-----
tal como se ve en la siguiente imagen:
5 Generación de llave y certificado para el servidor
Para esta tarea escribimos el siguiente comando en la consola:
#./pkitool --server servidor
con lo cual obtendremos una salida parecida a la siguiente:
Generating a 1024 bit RSA private key
............++++++
...++++++
writing new private key to 'servidor.key'
-----
Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CL'
stateOrProvinceName :PRINTABLE:'RM'
localityName :PRINTABLE:'Santiago'
organizationName :PRINTABLE:'Metalklesk's enterprise'
commonName :PRINTABLE:'servidor'
emailAddress :IA5STRING:'damorales@gmail.com'
Certificate is to be certified until Jul 6 01:08:42 2018 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
tal como se ve en la siguiente imagen:
Con lo anterior tenemos la unidad certificadora CA y el servidor listos (ambos en el mismo equipo).
6 Generación de llave y certificado para el cliente
Para generar el certificado y llave para un cliente escribimos en la consola el siguiente comando:
#./pkitool cliente1
de lo cual obtendremos una salida parecida a la siguiente:
Generating a 1024 bit RSA private key
...............++++++
............................................++++++
writing new private key to 'cliente1.key'
-----
Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CL'
stateOrProvinceName :PRINTABLE:'RM'
localityName :PRINTABLE:'Santiago'
organizationName :PRINTABLE:'Metalklesk's enterprise'
commonName :PRINTABLE:'cliente1'
emailAddress :IA5STRING:'damorales@gmail.com'
Certificate is to be certified until Jul 6 01:13:40 2018 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
tal como se ve en la siguiente imagen:
Cada vez que se quiera agregar un nuevo cliente ejecutamos el comando
#source ./vars
y luego
#./pkitool clienteN
No olvidar que antes de agregar un nuevo cliente se debe ejecutar #source ./vars y luego usar la herramienta pkitool.
7 Generación de firma HMAC tls-auth
La firma HMAC tls-auth provee un nivel de seguridad adicional al SSL/TLS, ya que cualquier paquete que no contenga la firma será bloqueado automáticamente. Este nivel extra de seguridad permite proteger contra:
- Ataques DoS (Deny of Service) en el puerto UDP (1194) de openVPN.
- Escaneo de puertos para determinar cual es el puerto UDP del servidor que está a la escucha.
- Vulnerabilidades de desbordamiento de buffer en la implementación SSL/TLS.
- Inicialización de negociaciones SSL/TLS de máquina que no están autorizadas.
Para utilizar este nivel extra de seguridad (lo cual es extremadamente recomendable, pero no obligatorio) se debe crear una llave secreta compartida, la cual utilizarán el servidor y los clientes. Dicha llave debe ser pasada al cliente por un canal seguro como ssh u otro. Se puede guardar en el mismo directorio que los otros archivos (ca.crt, cliente1.crt, cliente1.key).
Para crear la llave utilizamos el siguiente comando en el lado servidor y como usuario root:
#openvpn --genkey --secret ta.key
La llave creada corresponde a ta.key. Una vez creada se deben configurar el servidor y los clientes.
7.1 Servidor
En el archivo server.conf se debe agregar la siguiente linea:
tls-auth ta.key 0
Si el archivo ta.key está en un directorio distinto a donde está el archivo server.conf, entonces se debe dar la ruta completa (por ejemplo /etc/openvpn/directorio/ta.key).
7.2 Cliente
En el archivo client.conf (en el caso de openSUSE 11.0) o client.ovpn (en el caso de Windows XP) se debe agregar la siguiente linea:
tls-auth ta.key 1
8 Resumen archivos creados
Todos los certificados y llaves que vayamos creando quedarán almacenados en el directorio /etc/openvpn/easy-rsa-V2.0/keys. A continuación podemos ver la lista de archivos creados y visto a lo largo de este documento.
Nótese que todas las llaves (.key) son privadas mientras que los certificados (.crt) no lo son.
Ahora es necesario pasar una copia de los archivos ca.crt, cliente1.crt, cliente1.key y ta.key al cliente 1 a través de algún medio seguro como ssh u otro mecanismo que estimemos como seguro y conveniente.
Podemos crear una carpeta e introducir los archivos anteriormente mencionados y luego darles los permisos correspondientes (755) para luego entregárselos al cliente.
#mkdir ~/cliente1
#cd keys/
#cp -v ca.crt cliente1.crt cliente1.key ta.key ~/cliente1
#chmod -R 755 ~/cliente1
9 Configuración del servidor y el cliente
OpenVPN trae archivos de configuración de ejemplo que pueden ser utilizados como base para nuestra propia configuración, los cuales se encuentran en el directorio /usr/share/doc/packages/openvpn/sample-config-files.
De dicho directorio nos interesan los archivos client.conf y server.conf. El archivo server.conf va en la máquina servidor de openVPN, mientras que el archivo client.conf va en la máquina cliente. El archivo server.conf lo copiaremos al directorio /etc/openvpn.
#cd /usr/share/doc/packages/openvpn/sample-config-files
#cp server.conf /etc/openvpn
9.1 Servidor
Ahora debemos configurar el archivo server.conf de manera que se apunte a los archivos creados anteriormente, los cuales están en el directorio /etc/openvpn/easy-rsa-V2.0/keys. Para ésto abrimos el archivo server.conf
#cd /etc/openvpn
#kwrite server.conf
el cual debe quedar así:
ca /etc/openvpn/easy-rsa-V2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa-V2.0/keys/servidor.crt
key /etc/openvpn/easy-rsa-V2.0/keys/servidor.key
dh /etc/openvpn/easy-rsa-V2.0/keys/dh1024.pem
tal como se ve en la siguiente imagen:
Una vez configurado el servidor solo resta iniciarlo, para esto escribimos en consola:
#service openvpn start
o lo iniciamos desde YaST (YaST → Sistema → Servicios del sistema → activar servicio openvpn) para que al iniciar el sistema automáticamente se inicie el servidor openVPN.
Una vez listo solo resta abrir el puerto 1194 en el cortafuegos, para esto utilizamos YaST → Seguridad y usuarios → Cortafuegos → Servicios autorizados → Opciones avanzadas y agregamos el puerto 1194 en la entrada UDP, guardamos y listo.
Si no abrimos el puerto en el cortafuegos los clientes no se podrán conectar al servidor openVPN.
9.1.1 Dando acceso a los clientes a la red local
Hasta ahora tenemos una comunicación punto a punto entre el cliente y el servidor, pero puede darse el caso en que se requiera que el cliente (que está externo a la red) pueda ver a otros equipos en la red del servidor, para esto debemos agregar la siguiente linea en el archivo server.conf:
push “route subred-local mascara-subred-local”
en donde subred-local podría ser 192.168.0.0 y la mascara-subred-local podria ser 255.255.0.0 quedando así:
push “route 192.168.0.0 255.255.0.0”
En el caso de que el servidor openVPN y el gateway estén en máquinas distintas, será necesario configurar la ruta en el gateway de la LAN en el lado servidor para enrutar la subred del cliente VPN (10.8.0.0/24) hacia el servidor openVPN.
9.1.2 Subnet a Subnet
Hasta ahora hemos asumido que la máquina cliente se conecta a la VPN como una sola máquina, pero supongamos que la máquina cliente es un gateway para una LAN local (como la oficina de casa u otra red de una sucursal de nuestra organización), y quisiéramos que cada máquina en la LAN de el cliente sea ruteada a través de la VPN.
Para este ejemplo, asumiremos que la LAN del cliente esta usando la subred 192.168.15.0/24, y que el cliente VPN esta usando un certificado con el common name de cliente1.
Nuestra meta es configurar la VPN de manera que cualquier máquina en la LAN de el cliente se pueda comunicar con cualquier máquina en la LAN de el servidor a través de la VPN.
Antes de configurarlo, hay unos pre requisitos básicos que deben de seguirse:
La LAN de el cliente (192.168.15.0/24 en nuestro ejemplo) no debe de ser exportada a la VPN por el servidor o algún cliente que este usando la misma subred. Cada subred que sea unida a la VPN vía enrutamiento debe de ser única.
El cliente debe de tener un certificado con un Common Name único (cliente1 en nuestro ejemplo), y la directiva duplicate-cn no debe de ser usada en el archivo de configuración de el servidor OpenVPN (server.conf).
Ahora trataremos con los cambios de configuración necesarios en el lado de el servidor. Si el archivo de configuración de el servidor actualmente no hace ninguna referencia a el directorio de configuraciones de clientes, agreguemos una ahora:
client-config-dir ccd
En la directiva de arriba, ccd debe de ser el nombre de un directorio el cual ha sido pre-creado en el directorio predeterminado donde el demonio de el servidor openVPN corre, en este documento estamos usando /etc/openvpn/. Crearemos el directorio ccd con lo cual nos quedaria:
client-config-dir /etc/openvpn/ccd
Cuando un nuevo cliente se conecta al servidor OpenVPN, el demonio revisará este directorio en busca de algún archivo que concuerde con el common name de el certificado de el cliente que se conecta. Si un archivo concuerda, sera leído y procesado para aplicar directivas adicionales a dicho cliente.
El siguiente paso es crear un archivo de texto llamado cliente1 en el directorio ccd (si, sin extensión). Este archivo debe contener la siguiente linea:
iroute 192.168.15.0/24 255.255.255.0
Esto le dirá a el servidor openVPN que la subred 192.168.15.0/24 debe de ser enrutada al cliente1. Después, agregaremos la siguiente linea a el archivo de configuración principal de el servidor (server.conf ):
route 192.168.15.0/24 255.255.255.0
Ahora, si queremos que otros clientes de la VPN puedan tener tráfico de red con el cliente1 (comunicación de cliente a cliente) entonces debemos agregar las siguientes lineas al archivo de configuración del servidor (server.conf):
client-to-client
push “route 192.168.15.0/24 255.255.255.0”
Con lo anterior el servidor openVPN anunciará la subred cliente1 a los otros clientes que se conecten de manera tal que puedan llegar a dicha subred.
9.2 Cliente (openSUSE 11.0)
Existen varias formas de conectar un cliente openSUSE 11.0 a un servidor openVPN. Una es configurando todo a mano y corriéndolo en el background del sistema, sin control del usuario y otra es utilizando alguna aplicación que le de control al usuario.
9.2.1 Sin control del usuario
El archivo client.conf debe ir en la raíz de la carpeta de openVPN (/etc/openvpn en el caso de openSUSE 11.0) en la máquina del cliente y se debe editar de manera tal que se apunte a los archivos recibidos desde el servidor (ca.crt, cliente1.crt y cliente1.key). Estos archivos podemos copiarlos donde queramos, por ejemplo en /etc/openvpn. Una vez ahí configuramos el archivo client.conf como se ve a continuación:
ca /etc/openvpn/ca.crt
cert /etc/openvpn/cliente1.crt
key /etc/openvpn/cliente1.key
Los archivos deben tener los siguientes permisos:
ca.crt → 644
cliente1.crt → 644
cliente1.key → 600
para lo cual basta escribir lo siguiente en consola:
#chmod 644 ca.crt
#chmod 644 cliente1.crt
#chmod 600 cliente1.key
y además se debe modificar la siguiente linea:
remote my-server-1 1194
en donde my-server-1 corresponde al IP o host-name del servidor openVPN seguido del puerto por el cual se esta prestando el servicio (si hemos seguido la guía al pie de la letra, el puerto no se cambia).
Ahora solo resta conectarse al servidor, para esto podemos escribir en la consola lo siguiente:
#service openvpn start
y automáticamente se leerá el archivo de configuración (client.conf) y se realizará la conexión.
Ahora para probar, desde el servidor podemos hacer un ping al IP asignado al cliente y se podrá comprobar que se puede realizar sin problema.
Para saber que IP fue asignado al cliente se puede ejecutar el comando (en la máquina cliente):
#ifconfig
el cual arrojará las interfaces de red, donde tun0 corresponde a la asignada por openVPN, la cual tiene una IP que le corresponde.
9.2.2 Con control del usuario
Para dar control al usuario podemos utilizar herramientas gráficas existentes para conectarnos a la VPN. Existen varias, dos de ellas son KVPNC y KNetworkManager (con el plugin de openVPN).
Para ésta guía utilizaremos el segundo.
Lo primero es instalar KNetworkManager y el plugin KNetworkManager-openVPN, para esto ir a YaST → Software → Instalar/Desinstalar software, escribimos knetworkmanager y marcamos los paquetes correspondientes para luego instalarlos.
Una vez instalados debemos configurar la conexión de red para que use Network Manager en vez del método tradicional ifup (que viene de fábrica). Para esto vamos a YaST → Dispositivos de red → Ajustes de la red, luego vamos a las Opciones globales y seleccionamos el uso de Network Manager, luego finalizamos.
Una vez listo ejecutamos KnetworkManager, nos aparecerá un icono en la bandeja del sistema. Le damos click derecho → Editar conexiones → Nueva conexión → VPN, en gateway ponemos la dirección IP del servidor openVPN, el port corresponde al 1194, luego le pasamos el CA file (ca.crt), el certificado del cliente (cliente1.crt) y la llave del cliente (cliente1.key), luego en la pestaña de información opcional marcamos Use LZO compression. Luego presionamos siguiente y le damos un nombre a la conexión.
Una vez listo guardamos. Ahora para conectarnos hacemos click derecho en el icono de KnetworkManager → Iniciar conexión VPN y pinchamos el nombre de nuestra conexión, nos pedirá una contraseña, puede ser cualquier cosa y aceptamos.
Ahora para comprobar que nos hemos conectado abrimos una consola y escribimos (como usuario root):
#ifconfig
y veremos que se a agregado la interfaz tun0.
Si hacemos desde, el servidor, un ping al IP de esa interfaz del cliente veremos que se realiza sin problemas ya que la VPN se ha establecido correctamente.
9.3 Cliente (Windows XP)
En el caso de Windows XP se debe instalar openVPN y openVPN-GUI (http://openvpn.se). Una vez instalados copiamos los archivos entregados por el servidor (ca.crt, cliente1.crt y cliente1.key) a el directorio que queramos, por ejemplo C:\\keys.
Una vez ahí vamos al directorio C:\Archivos de programa\OpenVPN\sample-config y copiamos el archivo client.ovpn a C:\Archivos de programa\OpenVPN\config.
Una vez ahí lo abrimos con un editor de texto (notepad sirve) y apuntamos la configuración a la dirección en donde pusimos los certificados y la llave privada, de manera que quede así:
ca C:\\keys\\ca.crt
cert C:\\keys\\cliente1.crt
key C:\\keys\\cliente1.key
luego modificamos la linea que dice:
remote my-server-1 1194
donde cambiamos my-server-1 por la dirección IP de servidor y el puerto que corresponda (si hemos seguido esta guía al pie de la letra, el puerto queda igual).
Una vez listo guardamos el archivo y ejecutamos openvpn-gui.exe (se encuentra en la carpeta bin en el directorio de instalación de openVPN).
Al abrirlo veremos un icono de dos computadores rojos en la bandeja del sistema, si hacemos click derecho veremos un menú en donde la primera opción es conectar:
al pinchar conectar aparecerá una consola mostrando algunos datos y al finalizar aparecerá un mensaje avisando que la conexión se ha realizado:
Ahora para probar, desde el servidor podemos hacer un ping al IP asignado al cliente y se podrá comprobar que se puede realizar sin problema.
10 Revocar certificados
Revocar un certificado es invalidar uno previamente firmado para que ya no pueda ser usado para propósitos de autenticación (y en consecuencia, conexión a la VPN).
Las razones típicas para querer remover un certificado incluyen:
- La llave privada asociada con el certificado esta comprometida o robada.
- El usuario de una llave privada cifrada olvidó la contraseña de la llave.
- Se quiere terminar el acceso a la VPN para un usuario.
Como un ejemplo, revocaremos el certificado cliente1 (el mismo que creamos anteriormente). En una consola y como usuario root entramos al directorio easy-rsa-V2.0
#cd /etc/openvpn/easy-rsa-V2.0
luego reiniciamos las variables de openVPN:
#source ./vars
y luego escribimos el siguiente comando:
#./revoke-full cliente1
con lo cual deberíamos obtener una salida como ésta:
Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf
Revoking Certificate 02.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf
cliente1.crt: /C=CL/ST=RM/L=Santiago/O=Metalklesk's enterprise/CN=cliente1/emailAddress=damorales@gmail.com
error 23 at 0 depth lookup:certificate revoked
tal como se puede ver en la siguiente imagen:
Es probable que el último comando anterior no nos resulte y obtengamos la siguiente salida de error:
Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf
error on line 282 of config file '/etc/openvpn/easy-rsa-V2.0/openssl.cnf'
16431:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282
Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf
error on line 282 of config file '/etc/openvpn/easy-rsa-V2.0/openssl.cnf'
16432:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282
cat: crl.pem: No existe el fichero o el directorio
cliente1.crt: /C=CL/ST=RM/L=Santiago/O=Metalklesk's enterprise/CN=cliente1/emailAddress=damorales@gmail.com
error 3 at 0 depth lookup:unable to get certificate CRL
tal como vemos en la siguiente imagen:
De ser así debemos abrir el archivo /etc/openvpn/easy-rsa-V2.0/openssl.cnf (como usuario root) y comentar la ultima sección como se puede ver a continuación:
#[ 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
tal como podemos ver en la siguiente imagen:
Y luego intentar de nuevo.
Al ejecutar el comando revoke-full se ha creado un archivo CRL (Certificate Revocation List) llamado crl.pem en el directorio keys de openVPN.
Este archivo debe ser referenciado en el servidor openVPN en el archivo server.conf:
crl-verify /etc/openvpn/keys/crl.pem
de manera tal que cada vez que un cliente se conecte, la verificación se haga contra ese archivo para saber si se ha revocado o no su certificado de acceso a la VPN.
Algunas notas sobre CRL:
- Cuando la opción crl-verify es usada en openVPN, el archivo CRL sera re-leído cada vez que un nuevo cliente se conecta o un cliente existente re negocia la conexión SSL/TLS (de manera predeterminada una vez por hora). Esto significa que podemos actualizar el archivo CRL mientras el demonio de el servidor openVPN este corriendo, y que el nuevo CRL tenga efecto inmediato para los nuevos clientes que se conecten. Si el cliente para el que estamos revocando su certificado esta actualmente conectado, podemos reiniciar el servidor a través de la señal (SIGUSR1 o SIGHUP) y "flushear" todos los clientes, o podemos hacer telnet a el puerto de la interfaz de administración y explícitamente matar la instancia de el cliente en el servidor sin molestar a los otros clientes.
- Puesto que la directiva crl-verify puede ser usada en ambos, el servidor openVPN y el cliente, esto es generalmente innecesario para distribuir el archivo CRL a los clientes a menos que el certificado de el servidor ha sido revocado. Los clientes no necesitan saber acerca de los certificados de otros clientes que han sido revocados porque los clientes no deberían de aceptar conexiones directas de otros clientes en primer lugar (a no ser que queramos conexiones del tipo cliente-cliente).
- El archivo CRL no es secreto, y debería ser legible por todos para que el demonio openVPN pueda leerlo después de que los privilegios de root han sido tirados.
- Si estamos usando la directiva chroot, debemos asegurarnos de poner una copia de el archivo CRL en el directorio chroot, puesto que a diferencia de la mayoría de los archivos que openVPN lee, el archivo CRL sera leído después de que el chroot es ejecutado, no antes.
- Una razón común para que un certificado necesite ser revocado es que el usuario cifra su llave privada con una contraseña, y luego la olvida. Al revocar el certificado original, es posible re-generar un nuevo par de llave/certificado con el common name original de el usuario.
11 Conclusiones
Mediante openVPN podemos crear redes virtuales privadas seguras y a muy bajo costo, de hecho, el software usado es gratis y además open source, por lo que no pagamos por concepto de licencias de software, además de ser multi plataforma.
Gracias a la encriptación usada para el traspaso de la información disminuimos bastante el riesgo de captura y decodificación de nuestros datos, ya que utilizamos certificados digitales y llaves de 1024 o 2048 bits, con lo cual aseguramos que solo quienes tengan certificado se puedan conectar a la VPN y que nuestros datos no puedan ser leídos por terceros.
El uso de los mecanismos de seguridad que se proveen permiten estar preparados frente a ataques del tipo DoS o escaneo de puertos en busca de vulnerabilidades, lo cual deja nuestra red bastante mas segura.
Además openVPN nos provee de un mecanismo muy simple tanto para generar pares de llave/certificado para clientes así como la revocación de los mismos, todo con un par de simples comandos, lo cual ayuda bastante a la administración de la VPN.
Con openVPN podemos generar varios tipos de configuraciones que pueden amoldarse según nuestras necesidades, como tener una VPN uno a uno, uno a muchos o muchos a muchos.
El uso de una VPN nos permite compartir recursos de una red con equipos o redes externas, una combinación especialmente útil es openVPN con SAMBA, ya que con openVPN creamos la red y con SAMBA compartimos los recursos.
12 Anexos
http://tuxjm.net/docs/openvpn-como4slack/index.html
http://openvpn.net/
EXTRA !!!
Este documento lo pueden descargar en formato ODT y PDF para que lo puedan leer y modificar a gusto. Este documento está bajo licencia GPL 3.
Espero les sea de utilidad.
Saludos !!!
19 comentarios:
Una consulta.
Si tengo un servidor openVPN funcionando perfectamente y ahora modifico la subred de este servidor, lo que provoca el cambio de la IP del servidor. ¿OpenVPN seguiría funcionando con sus clientes sin hacerle modificaciones?
Es decir yo tengo el servidor y dos clientes funcionando. Ahora cambio la IP del servidor, de 192.168.0.33 a 192.168.78.39.
Hola te la rifaste muchas gracias por la guia con esta guia boy a incorporar una red vpn aqui donde trabajo hehhe sale gracias a proposito si me lo permites lo pondre en seccion de tutoriales en opensuse latino
http://opensuseltn.org sale gracias estamos en contacto
No hay problema, usalo y colocalo en la web que quieras, la idea es que sea un aporte para todos :)
Saludos!
Hola Daniel, excelente aportación, estoy poniendolo en marcha en mi trabajo, pero tengo un problema al generar la llave y certificado para el servidor. ya que me aparece un error, te lo paso igual y puedas ayudarme te agradecere mucho: 'Using configuration from/etc/openvpn/easy-rsa-V2.0/openssl.cnf/etc/openvpn/easy-rsa-V2.0/key/index.txt: No such file or directory unable to open c/etc/openvpn/easy-rsa-V2.0/keys/index.txt` 5769:error:02001002:system library:fopen:No such file or directory:bss_file.c:356:fopen(`etc/openvpn/easy-rsa-V2.0/keys/index.txt`,`r`) 5769:error.20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:358:
Como te mencioné en el correo, debes crear el archivo index.txt a mano y agregarle como contenido un "1" sin comillas.
Saludos!
yo tengo el mismo error de fopen en windows. y me gustaria saber donde creas el archivo index.txt
Los problemas consultados anteriormente se solucionan ingresando la linea ./clean-all luego de realizar ./build-dh al generar los parametros Diffiie Hellman
Saludos
ya no funcionan los link de descarga!!!
Muy bueno el post. Por favor ayudame con un problemita, al iniciar el servicio en el servidor siempre falla, no se por qué. Uso Opensuse 11.2 y todo es muy parecido pero el servicio no funciona, gracias
Muy buen post amigo felicidades, lo segui en mi anterior trabajo y deje una vpn funcional. Solo que ahora me encuentro laborando para otra empresa en la cual no me dejaron implementar Linux ya que tienen licencias de guin2 para server y para desktop.
Asi que me baje la version para guin2 de OpenVPN e instale mi servidor de vpn sobre 2003 server y los clientes estan en xp.
Levante el servidor sin problemas y el cliente se conecta sin ningun problema, solo que a la hora que quiero llegar a alguna maquina que esta en la LAN del servidor no la alcanzo ni por ping.
Si hago ping a la ip local del servidor si me responde y puedo accesar a los recursos compartidos pero si quiero ir a otra maquina me dice que no se encuentra en el segmento de red. Esta es la configuracion que estoy usando en el servidor:
port 1194
;proto tcp
proto udp
;dev tap
dev tun
;dev-node VPN
ca ca.crt
cert trinity.crt
key trinity.key # This file should be kept secret
dh dh1024.pem
server 192.168.2.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;server-bridge 192.168.1.106 255.255.255.0 192.168.2.140 192.168.2.149
;server-bridge
push "route 192.168.0.0 255.255.255.0"
push "route 10.109.111.0 255.255.255.0"
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
;learn-address ./script
;push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.0.1"
;push "dhcp-option DNS 208.67.220.220"
;client-to-client
;duplicate-cn
keepalive 10 120
;tls-auth ta.key 0 # This file is secret
;cipher BF-CBC # Blowfish (default)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
comp-lzo
;max-clients 100
;user nobody
;group nobody
persist-key
persist-tun
status openvpn-status.log
;log openvpn.log
;log-append openvpn.log
verb 3
;mute 20
Espero y me puedas orientar. De antemano mil gracias. Saludos.
It works for me. Thanks!
Ola muchisimas gracias por la guia pero tengo un error no se si tal vez te midas a ayudarme ocurre cuando trato de darle
service openvpn start
sale: Exiting
Oct 14 04:49:30 linux-qk4n openvpn[22329]: OpenVPN 2.1.1 i686-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] built on Jul 5 2010
Oct 14 04:49:30 linux-qk4n openvpn[22329]: NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Oct 14 04:49:30 linux-qk4n openvpn[22329]: Cannot open dh1024.pem for DH parameters: error:02001002:system library:fopen:No such file or directory: error:2006D080:BIO routines:BIO_new_file:no such file
Oct 14 04:49:30 linux-qk4n openvpn[22329]: Exiting
hola qtal saludos a todos
tengo problemas con la generacion de los archivos .crt no c me generan que puedo hacer
Yo siempre utilizo vpn ninja, basicamente es el mejor...el sitio web es www.vpnninja.com
Hola Daniel, excelente post me ha ayudado muchísimo. Tengo una inquietud, mi servidor VPN tiene 2 direcciones IP asignadas por tema de redundancia, la cuestión es en el cliente yo coloqué las 2 direcciones de mi server vpn:
remote IP_1 1194
remote IP_2 1194
En caso de que el enlace con la IP_1 no esté disponible, el cliente puede conectar automáticamente por la IP_2? o hay que hacer alguna configuración adicional ya sea en el server o en el cliente.
De antemano muchas gracias.
Hola! Te consulto, como puedo "proteger" o "evitar" que alguien que accesa a los certificados ubicados en el equipo con Windows aquí [1] no se los lleve a otra PC (o a su casa) y pueda ingresar a mi red mediante el server OpenVPN?
Muchas Gracias!!
[1] C:\Archivos de programa\OpenVPN\config
Hola ,gracias y felicidades por la guia muy buena,implemente mi openvpn , solo que no puedo ver los equipos detras de mi servidores.
tengo 2 servidores linux (SUSE) puedo hacerle ping y ssh entre ello pero no puedo ver los equipos en las redes
ya verifique los puntos en la guia 9.1.1, pero no me funciona. creo que me falta una tonteria y es algo de firewall pero ya no se que sea.
coloque
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -o tun+ -j ACCEPT
tengo 2 tarjetas de red en cada equipo una con ip-publica y otra con ip-privada
las mismas navengan bien y todo.
Hola quisiera saber como puedo ver desde mi servidor que certificados han estado activos en los ultimos meses para poder ver cuales voy a revocar y cuales voy a dejar.
Muchas gracias por tu ayuda
Nice post thank you Robin
Publicar un comentario