Este documento le publiqué originalmente en el sitio de EcuaLug hace varios años. En este sitio tengo una versión mejorada con las últimas actualizaciones para openvpn-2.3 en CentOS-6
Si usted ya configuró y probó algún tipo de conexión openVPN anteriormente, por ejemplo la conexión host a host, no olvide borrar los contenidos del directorio /etc/openvpn especialmente los archivos .key y .conf puesto que nos pueden molestar o confundir para la siguiente configuración.
Consideraciones preliminares
En el servidor de openvpn no te olvides de activar el ip_forwarding:
vi /etc/sysctl.conf
y cambia ip_forwarding a 1 (está normalmente en 0).
net.ipv4.ip_forward = 0
Entonces ejecuta:
sysctl -p
De olvidar lo anterior la vpn no hará ping hacia las redes internas!
Ahora lo demorado:
En el servidor OpenVPN necesitamos crear una serie de claves y certificados iniciales, para poder autenticar y encriptar la información que transitará desde/hacia el servidor/clientes
Para ello instalamos el paquete easy-rsa que es un conjunto de herramientas que me permitirán generar los certificados.
yum install easy-rsa
Contamos con una serie de scripts en el directorio /usr/share/easy-rsa/2.0/ los cuales nos ayudarán mucho a ejecutar ésta tarea inicial.
Como primer paso, sugerimos cambiarnos a ese directorio:
cd /usr/share/easy-rsa/2.0
Creando el CA
Una vez dentro de éste directorio procedemos a ejecutar los siguientes pasos:
. vars sh clean-all sh build-ca
Con ellos lo que haremos es:
- Inicializar variables de ambiente para poder trabajar con los siguientes scripts de shell para generar las variables
- Inicializamos el directorio de las claves (borrando potenciales archivos viejos)
- build-ca: procedemos a generar el certificado CA
En éste último paso se nos pedirá una serie de información sobre nuestra red/empresa que debemos llenar lo más fielmente posible:
Generating a 1024 bit RSA private key ........................................................................................... .................................++++++.....................++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KG]:EC State or Province Name (full name) [NA]:Pichincha Locality Name (eg, city) [BISHKEK]:Quito Organization Name (eg, company) [OpenVPN-TEST]:EcuaLinux Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:ecualinux Email Address [[email protected]]:[email protected]
La variable que debemos explícitamente llenar (no dejar en blanco!) es: Common Name.
Generación del certificado y de la clave de encriptación para el servidor Siguiente a la generación del Certificado de autoridad, procedemos a crear el certificado del servidor y de su clave de encriptación:
sh build-key-server server
Generating a 1024 bit RSA private key ......................++++++ .........................++++++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KG]:EC State or Province Name (full name) [NA]:Pichincha Locality Name (eg, city) [BISHKEK]:Quito Organization Name (eg, company) [OpenVPN-TEST]:EcuaLinux Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:server Email Address [[email protected]]:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/share/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'EC' stateOrProvinceName :PRINTABLE:'Pichincha' localityName :PRINTABLE:'Quito' organizationName :PRINTABLE:'EcuaLinux' organizationalUnitName:PRINTABLE:'IT' commonName :PRINTABLE:'server' emailAddress :IA5STRING:'[email protected]' The stateOrProvinceName field needed to be the same in the CA certificate (Pichincha) and the request (Pichincha)
En éste paso, también se nos pedirá nuevamente información sobre el certificado propio del servidor. En éste caso por favor, escoger en Common Name un nombre diferente al anteriormente escogido. En mi caso escogí poner: server
Este paso nos generará dos archivos en el directorio /usr/share/easy-rsa/2.0/keys/ que se copiarán dentro del mismo servidor hacia /etc/openvpn, ellos son:
- server.crt
- server.key
Generando certificados y claves privadas para los clientes
Cada cliente debe tener su propio certificado y clave de seguridad, para cara cliente que tengamos deberemos repetir el siguiente paso. Los archivos obtenidos debemos copiarlos hacia el directorio /etc/openvpn/ de los clientes!
En el caso de que nuestros clientes sean en windows, debemos copiarlos hacia c:\program files\openvpn\conf
Para generar el certificado y claves privadas ejecutamos en nuestro servidor, dentro del directorio /usr/share/easy-rsa/2.0/
sh build-key client1
Generating a 1024 bit RSA private key ...............................................................................................++++++ ......++++++ writing new private key to 'client1.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KG]:EC State or Province Name (full name) [NA]:Pichincha Locality Name (eg, city) [BISHKEK]:Quito Organization Name (eg, company) [OpenVPN-TEST]:EcuaLinux Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:client1 Email Address [[email protected]]:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/share/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'EC' stateOrProvinceName :PRINTABLE:'Pichincha' localityName :PRINTABLE:'Quito' organizationName :PRINTABLE:'EcuaLinux' organizationalUnitName:PRINTABLE:'IT' commonName :PRINTABLE:'client1' emailAddress :IA5STRING:'[email protected]' Certificate is to be certified until Nov 24 05:25:40 2016 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
En el ejemplo anterior generamos la clave y el certificado para un cliente llamado client1.
Debemos hacer notar que al ejecutar el programa sh build-key, le pasamos como parámetro el nombre del cliente (client1 en el ejemplo anterior) el cual debe ser diferente para cada cliente. En el common name ponemos el nombre del cliente (client1 en éste ejemplo) tal y como le pasamos de parámetro.
Se pueden generar tantas claves como sean necesarias:
sh build-key client2 sh build-key client3
Esto nos generará dos claves y certificados más, para client2 y client3, por favor, en common name debemos poner client2 ó client3 para cada caso.
Generando parámetros de Diffie-Hellman
El parámetro de Diffie-Hellman debemos generarlo así:
sh build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time ......................+...............................+...........
Archivos a copiar al servidor
Hacia el directorio /etc/openvpn del servidor copiamos los siguientes archivos:
- ca.crt
- ca.key
- server.key
- server.crt
- dh1024.pem
Estos archivos están presentes en: /usr/share/easy-rsa/2.0/keys/
Archivos a copiar al cliente
Hacia el directorio /etc/openvpn de cada cliente copiamos los siguientes archivos:
- ca.crt
- clientX.crt
- clientX.key
Tenga en cuenta que X es un número que se corresponde con el cliente (para el cliente 2 sería: client2.crt y client2.key por ejemplo).
Estos 3 archivos deben copiarse de forma segura hacia el cliente, quizá mediante scp o algún medio magnético seguro. No deben enviarse por mail puesto que contienen la clave (.key) de encriptación del cliente!
Estos archivos están presentes en: /usr/share/easy-rsa/2.0/keys/ del servidor.
Configuración del servidor:
El archivo /etc/openvpn/server.conf quedará así:
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh1024.pem #Direcciones que se asignaran a los #clientes, el server es .1 server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt #Aquí debe especificarse la LAN detrás de tu servidor #En este ejemplo supongo que TU LAN es 192.168.1.0/24 #Cambiala a la verdadera LAN de tu servidor push "route 192.168.1.0 255.255.255.0" keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status openvpn-status.log verb 4
Como podemos ver, hay nuevos parámetros, los más importantes son:
- un push de la ruta hacia la red local interna del servidor. Esa ruta estádica permitirá que el road warrior vea a las máquinas de la red interna
- server: Indica el rango de direcciones que se asignará a los clientes que se conecten, deben ser direcciones no similares a las de la red local.
Configuración del cliente:
En el caso del cliente, así quedaría el archivo de configuración /etc/openvpn/client1.conf:
client dev tun proto udp #Aqui debo especificar la IP de la WAN de tu servidor OpenVPN remote 201.219.41.38 1194 resolv-retry infinite nobind #Las dos siguientes opciones no van en windows user nobody group nobody persist-key persist-tun ca ca.crt cert client1.crt key client1.key comp-lzo verb 4
Las configuraciones más interesantes son:
- client: indica que algunas configuraciones las tomará del servidor.
- nobind: que no actúe como servidor, que solamente vaya como cliente.
- Recordar que cert y key deben ser únicas para cada cliente
Si se fijan, el orden en que van los parámetros no importa mucho, he notado que el openvpn es muy noble en el cómo pones los parámetros, le da igual (mayormente).