Recomendando OpenVPN

Si queréis una vpn gratuita, fácil de instalar, de usar, entonces OpenVPN.

Hay mucha documentación en la red y es un proyecto superambicioso, y licencia libre. No necesitarás saber IPSec, ni comandos cisco, saber de redes…

El siguiente tutorial ha sido extraído de alcancelibre.org, se instala el server en un linux, y el cliente está para Windows o Linux:

Instalación del equipamiento lógico necesario.

Fedora 9 en adelante incluye el paquete openvpn en sus depósitos Yum, por lo que solo es necesario instalarlo desde la terminal a través del mandato yum. El siguiente procedimiento solo es necesario para CentOS 5.
Instalación en CentOS 5.

Como el usuario root, desde una terminal, crear el archivo /etc/yum.repos.d/AL-Server.repo, utilizando cualquier editor de texto. En el siguiente ejemplo se utiliza vi.

vi /etc/yum.repos.d/AL-Server.repo

Añadir a este nuevo archivo el siguiente contenido:

[AL-Server]
name=AL Server para Enterprise Linux $releasever
mirrorlist=http://www.alcancelibre.org/al/el$releasever/al-server
gpgcheck=1
gpgkey=http://www.alcancelibre.org/al/AL-RPM-KEY

Importar la firma digital de Alcance Libre ejecutando lo siguiente desde la terminal:

rpm –import http://www.alcancelibre.org/al/AL-RPM-KEY

Luego de importar la firma digital de Alcance Libre, instalar el equipamiento lógico (software) necesario con el mandato yum. Se requieren los paquetes RPM de OpenVPN, Shorewall y vim-enhanced (la versión mejorada de Vi):

yum -y install openvpn shorewall vim-enhanced

Procedimientos.

Si fuera necesario, cambiarse al usuario root utilizando el siguiente mandato:

su -l

A fin de poder utilizar inmediatamente la versión mejorada de Vi (instalado con el paquete vim-enhanced), ejecutar desde la terminal lo siguiente:

alias vi=”vim”

Cambiarse al directorio, desde la terminal, ejecutar lo siguiente para cambiarse al directorio /etc/openvpn:

cd /etc/openvpn/

NOTA: Todos los procedimientos necesarios para configurar un servidor con OpenVPN se realizan sin salir de /etc/openvpn/. Por favor, evite cambiar de directorio hasta haber finalizado los procedimientos descritos en este documento.

A fin de facilitar los procedimientos, se copiarán dentro del directorio /etc/openvpn/ los archivos openssl.cnf, whichopensslcnf, pkitool y vars, que se localizan en /etc/openvpn/easy-rsa/2.0/:

cp /usr/share/openvpn/easy-rsa/2.0/openssl.cnf ./
cp /usr/share/openvpn/easy-rsa/2.0/whichopensslcnf ./
cp /usr/share/openvpn/easy-rsa/2.0/pkitool ./
cp /usr/share/openvpn/easy-rsa/2.0/vars ./

Utilizar el editor de texto y abrir el archivo /etc/openvpn/vars:

vi /etc/openvpn/vars

De este archivo, solamente editar las últimas líneas, que corresponden a lo siguiente:

export KEY_COUNTRY=”US”
export KEY_PROVINCE=”CA”
export KEY_CITY=”SanFrancisco”
export KEY_ORG=”Fort-Funston”
export KEY_EMAIL=”me@myhost.mydomain”

Reemplazar por valores reales, como los del siguiente ejemplo:

export KEY_COUNTRY=”MX”
export KEY_PROVINCE=”DF”
export KEY_CITY=”Mexico”
export KEY_ORG=”servidor.mi-dominio.com”
export KEY_EMAIL=”fulanito@mi-dominio.com”

Se requiere ejecutar del siguiente modo el archivo /etc/openvpn/vars a fin de que carguen las variables de entorno que se acaban de configurar.

source /etc/openvpn/./vars

Cada vez que se vayan a generar nuevos certificados, debe ejecutarse el mandato anterior a fin de que carguen las variables de entorno definidas.

Se ejecuta el archivo /usr/share/openvpn/easy-rsa/2.0/clean-all a fin de limpiar cualquier firma digital que accidentalmente estuviera presente.

sh /usr/share/openvpn/easy-rsa/2.0/clean-all

Lo anterior realiza un rm -fr (eliminación recursiva) sobre el directorio /etc/openvpn/keys, por lo que se eliminarán todas los certificados y firmas digitales que hubieran existido con anterioridad.

A fin de crear el certificado del servidor, se crea un certificado:

sh /usr/share/openvpn/easy-rsa/2.0/build-ca

Se crea el archivo dh1024.pem, el cual contendrá los parámetros del protocolo Diffie-Hellman, de 1024 bits:

sh /usr/share/openvpn/easy-rsa/2.0/build-dh

El protocolo Diffie-Hellman permite el intercambio secreto de claves entre dos partes que sin que éstas hayan tenido contacto previo, utilizando un canal inseguro y de manera anónima (sin autenticar). Se emplea generalmente como medio para acordar claves simétricas que serán empleadas para el cifrado de una sesión, como es el caso de una conexión VPN.

Para generar la firma digital, se utilizan el siguiente mandato:

sh /usr/share/openvpn/easy-rsa/2.0/build-key-server server

Finalmente se crean los certificados para los clientes. En el siguiente3 ejemplo se crean los certificados para cliente1, cliente2, cliente3, cliente4, cliente5 y cliente6:

sh /usr/share/openvpn/easy-rsa/2.0/build-key cliente1
sh /usr/share/openvpn/easy-rsa/2.0/build-key cliente2
sh /usr/share/openvpn/easy-rsa/2.0/build-key cliente3
sh /usr/share/openvpn/easy-rsa/2.0/build-key cliente4
sh /usr/share/openvpn/easy-rsa/2.0/build-key cliente5
sh /usr/share/openvpn/easy-rsa/2.0/build-key cliente6

A fin de utilizar los certificados y que se configure el sistema, se crea con el editor de texto el archivo /etc/openvpn/servidorvpn-udp-1194.conf, donde servidorvpn se reemplaza por el nombre de anfitrión del sistema:

vi /etc/openvpn/servidorvpn-udp-1194.conf

Para la VPN se recomienda utilizar una red privada que sea poco usual, a fin de poder permitir a los clientes conectarse sin conflictos de red. Un ejemplo de una red poco utilizada sería 192.168.37.0/255.255.255.0, lo cual permitirá conectarse a la VPN a 253 clientes. Tomando en cuenta lo anterior, el contenido del archivo /etc/openvpn/servidorvpn-udp-1194.conf, debe ser el siguiente:

port 1194
proto udp
dev tun
#—- Seccion de llaves —–
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
#—————————-
server 192.168.37.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status-servidorvpn-udp-1194.log
verb 3

Descripción de los parámetros anteriores:

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 archivo de Autoridad Certificadora [.ca].

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

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

dh: Ruta exacta del archivo [.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.

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

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

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

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.

Si SELinux está activo, es necesario que el directorio /etc/openvpn y sus contenidos, tengan los contextos apropiados de esta implementación de seguridad (system_u:object_r:openvpn_etc_rw_t para ipp.txt y openvpn-status-servidorvpn-udp-1194.log y system_u:object_r:openvpn_etc_t para el resto del contenido del directorio).

Se utiliza luego el mandato restorecon sobre el directorio /etc/openvpn a fin de asignar los contextos adecuados.

restorecon -R /etc/openvpn/

Se crean los archivos ipp.txt y openvpn-status-servidorvpn-udp-1194.log:

cd /etc/openvpn/
touch ipp.txt
touch openvpn-status-servidorvpn-udp-1194.log

Si se tiene activo SELinux, estos últimos dos archivos requieren se les asigne contexto de lectura y escritura (openvpn_etc_rw_t).

cd /etc/openvpn/
chcon -u system_u ipp.txt
chcon -u system_u openvpn-status-servidorvpn-udp-1194.log
chcon -r object_r ipp.txt
chcon -r object_r openvpn-status-servidorvpn-udp-1194.log
chcon -t openvpn_etc_rw_t ipp.txt
chcon -t openvpn_etc_rw_t openvpn-status-servidorvpn-udp-1194.log

Los anterior cambia los contextos a usuario de sistema (system_u), rol de objeto (object_r) y tipo configuración de OpenVPN de lectura y escritura (openvpn_etc_rw_t).

Para iniciar el servicio, se utiliza el mandato service del siguiente modo:

service openvpn start

Para que el servicio de OpenVPN esté activo en el siguiente inicio del sistema, se utiliza el mandato chkconfig de la siguiente forma:

chkconfig openvpn on

Configuración de muro cortafuegos con Shorewall.

El siguiente procedimiento considera que se ha configurado un muro cortafuegos apropiadamente, de acuerdo a las indicaciones descritas en el documento titulado Cómo configurar un muro cortafuegos con Shorewall y tres interfaces de red.

Independientemente del contenido, en el archivo /etc/shorewall/zones, se añade la zona rem con el tipo ipv4, antes de la última línea.

# OpenVPN —-
rem     ipv4
#LAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE

Independientemente del contenido, en el archivo /etc/shorewall/interfaces, se añade la zona rem asociada a la interfaz tun0, con la opción detect, para detectar automáticamente el número de dirección IP de difusión (broadcast) y la opción dhcp. También debe definirse antes de la última línea del archivo.

# OpenVPN —-
rem     tun0            detect        dhcp
#LAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE

Independientemente del contenido, en el archivo /etc/shorewall/policy, se añade la política deseada para permitir el acceso de los miembros de la VPN hacia las zonas que se consideren apropiadas. En el siguiente ejemplo, se define una política que permite el acceso de las conexiones originadas desde la zona rem hacia el cortafuegos, la red pública y la red local. Todo debe definirse antes de la última línea del archivo.

fw        all        ACCEPT
loc        all        ACCEPT
# OpenVpn —-
rem             fw        ACCEPT
rem             net        ACCEPT
rem        loc        ACCEPT
# ————
net             all        DROP    info
all             all        REJECT  info
#LAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE

Independientemente del contenido, en el archivo /etc/shorewall/rules, se debe abrir en el cortafuegos el puerto 1194 por UDP, para todas las zonas desde las cuales se pretenda conectar clientes a la VPN.

ACCEPT    net            fw            udp    1194
#LAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE

Finalmente, se edita el archivo /etc/shorewall/tunnels a fin de definir el túnel SSL que será utilizado para el servidor de VPN y que permita conectarse desde cualquier ubicación.

#TYPE                   ZONE    GATEWAY         GATEWAY
#                                               ZONE
openvpnserver:1194      rem     0.0.0.0/0
#LAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE

En lugar de 0.0.0.0/0, se puede especificar una dirección IP o bien una red desde la cual se quiera establecer las conexiones VPN.

Para aplicar los cambios, es necesario reiniciar shorewall con el mandato service, del siguiente modo:

service shorewall restart

Configuración de clientes Windows.
A través de OpenVPN GUI.

Instalar OpenVPN GUI desde http://openvpn.se/. Se requiere instalar la versión de desarrollo 1.0.3 de OpenVPN GUI, compatible con OpenVPN 2.1.x. El cliente es estable, siempre que se verifique que funcione adecuadamente la configuración utilizada antes de poner en marcha en un entorno productivo.

Crear el archivo cliente1-udp-1194.ovpn, con el siguiente contenido, donde es importante que las rutas definidas sean las correctas y las diagonales invertidas sean dobles:

client
dev tun
proto udp
remote dominio-o-ip.del.servidor.vpn 1194
float
resolv-retry infinite
nobind
persist-key
persist-tun
#—— SECCION DE LLAVES ——–
ca “C:\Archivos de Programa\OpenVPN\config\ca.crt”
cert “C:\Archivos de Programa\OpenVPN\config\cliente1.crt”
key “C:\Archivos de Programa\OpenVPN\config\cliente1.key”
ns-cert-type server
#———————————
comp-lzo
verb 3

Descripción de los parámetros anteriores:

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:port en 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 nombre del anfitrión (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 archivo de Autoridad Certificadora [.ca].

cert: Especifica la ubicación del archivo [.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.

El cliente necesitará que los archivos ca.crt, cliente1.crt, cliente1.key y cliente1-udp-1194.ovpn estén presentes en el directorio “C:Archivos de ProgramaOpenVPNconfig”. Estos archivos fueron creados, a través de un procedimiento descrito en este documento, dentro del directorio /etc/openvpn/keys/ del servidor.

Si se quiere que los clientes de la VPN se puedan conectar a la red local, es importante considerar las implicaciones de seguridad que esto conlleva si alguno de los certificados es robado o bien el cliente se ve comprometido en su seguridad por una intrusión, virus, troyano o gusano. Es preferible que la red de la VPN sea independiente a la red local y cualquier otra red, uniendo los servidores y clientes a la VPN, independientemente de si éstos están en la red local o una red pública.

Si es imperativo hacer que los clientes de la VPN se conecten a la red local, la red desde la cual se conectan los clientes debe ser diferente a la red utilizada en la red local. Por ejemplo: si la red local detrás del servidor de VPN es 192.168.0.0/255.255.255.0, 10.0.0.0/255.0.0.0 o 172.16.0.0/255.255.0.0, los clientes que se conecten a la VPN detrás de un modem ADSL o Cable e intenten establecer conexiones con la red local, muy seguramente tendrán conflictos de red.

Para permitir a los clientes de la VPN poder establecer conexiones hacia la red local, se añaden las siguientes líneas en el archivo de configuración de OpenVPN para los clientes y que definen la ruta para la red local y un servidor DNS que debe estar presente y configurado para permitir consultas recursivas a la red de la VPN:

route 192.168.0.0 255.255.255.0
dhcp-option DNS 192.168.0.1

Opcionalmente, también se puede definir un servidor Wins.

dhcp-option WINS 192.168.26.1

Ejemplo, considerando que la red local es 192.168.26.0/255.255.255.0:

client
dev tun
proto udp
remote dominio-o-ip.del.servidor.vpn 1194
float
resolv-retry infinite
nobind
persist-key
persist-tun
route 192.168.26.0 255.255.255.0
dhcp-option DNS 192.168.26.1
dhcp-option WINS 192.168.26.1
#—— SECCION DE LLAVES ——–
ca “C:\Archivos de Programa\OpenVPN\config\ca.crt”
cert “C:\Archivos de Programa\OpenVPN\config\cliente1.crt”
key “C:\Archivos de Programa\OpenVPN\config\cliente1.key”
ns-cert-type server
#———————————
comp-lzo
verb 3

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *