16 mar 2012

Como crear una VPN con OpenVPN en Linux Debian Squeeze

La VPN con OpenVPN será SSL/TLS, y podemos encontrar dos tipos, TUN y TAP.

TUN: El controlador TUN emula un dispositivo punto a punto, es utilizado para crear túneles virtuales operando con el protocolo IP. De esta forma se puede encapsular todos los paquetes que se transporten a través de él como datagramas TCP o UDP (más adelante verán que escogemos TCP en lugar de UDP). Las máquinas que queden detrás de cada uno de los extremos del enlace pertenecerán a subredes diferentes.

TAP: Simula una interfaz de red Ethernet, más comúnmente conocido como modo puente o bridge, estos túneles virtuales encapsulan directamente paquetes ethernet. Esta situación permite empaquetar entramados diferentes al IP. Las máquinas situadas detrás de cada uno de los extremos del enlace pueden operar como parte de la misma subred (si se utiliza el protocolo IP). El modo de funcionamiento puente es particularmente útil para enlazar usuarios remotos, ya que éstos pueden conectarse a un mismo servidor y virtualmente formar parte de la red principal.

En esta guia usaremos TUN.

Primero activamos el modulo TUN y luego instalamos el openvpn:
serv-vpn:~#modprobe tun
serv-vpn:~#aptitude install openvpn

El openvpn viene con un directorio llamado easy-rsa, que tiene scripts bastante útiles para la configuración. Este directorio lo copiamos a /etc/openvpn

serv-vpn:~#cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/

Ahora nos vamos a ese directorio recién creado y ejecutamos los siguientes comandos
serv-vpn:/etc/openvpn/2.0#. vars
serv-vpn:/etc/openvpn/2.0#. /clean-all
serv-vpn:/etc/openvpn/2.0#. /build-ca

Con ellos lo que haremos es:
* vars: Inicializar variables de ambiente para poder trabajar con los siguientes scripts de shell para generar las variables
* clean-all: Inicializamos el directorio de las claves (borrando potenciales archivos viejos)
* build-ca: procedemos a generar el certificado CA

Nos pedirá datos sobre la organización. No poner cualquier cosa ya que las preguntas se van a repetir más adelante y debemos estar seguros de lo que habíamos escrito. Sugiero en Common Name poner algún nombre relacionado con su empresa.

Una vez creado el Certificate Authority (CA), creamos la llave del Servidor

serv-vpn:/etc/openvpn/2.0#. /build-key-server servidor

En Common Name ponemos el nombre del Servidor u otro nombre que sea diferente al creado en el Certificate Authority

Con este paso se crearon dos archivos (servidor.crt y servidor.key). Estos archivos debemos copiarlos al directorio /etc/openvpn

Ahora generamos las claves de los clientes. Debemos ejecutar los mismos para cada cliente:

serv-vpn:/etc/openvpn/2.0#. /build-key cliente1

Esto genera los archivos cliente1.key (llave) y cliente1.crt (certificado)

Creamos los parámetros Diffie-Hellman:
serv-vpn:/etc/openvpn/2.0#. /build-dh
Con este paso se crearon dos archivos (dh1024.pem). Este archivo también debemos copiarlos al directorio /etc/openvpn

Ahora le hacemos llegar los archivos (cliente1.crt, cliente1.key y ca.crt) a los clientes, se los podemos pasar vía sftp o scp, pero siempre tratando de que sea seguro.

Nos ubicamos en el directorio /etc/openvpn y creamos el fichero de configuración del servidor
serv-vpn:~#cd /etc/openvpn
serv-vpn:~#touch /etc/openvpn/server.conf
Algunas de las variables que usaremos en este fichero de configuración estarán activas si se usa, de lo contrario el servicio de OpenVPN utilizará las configuraciones por defecto.

Editamos y agregamos lo siguiente.
serv-vpn:~#nano /etc/openvpn/server.conf
port 443
#Puerto por defecto en Server para el OpenVPN es 1194, puedes ser modificado por cualquier otro puerto que esté disponible#
proto tcp
#Protocolo por defecto en Server para el OpenVPN es UDP#
# En UDP no me dio buenos resultados, el protocolo que utilizo en esta guía es TCP
dev tun
# Configuración de interfaz TUN para VPN tipo Enrutada

ca ca.crt
cert servidor.crt
key servidor.key
dh dh1024.pem
#ca, cert, key y dh = son la entidad, el certificados, la llave y la Diffie Hellman del servidor creados anteriormente
server 172.16.1.0 255.255.255.0
# server 172.16.1.0 255.255.255.0 = es el rango de IP que usara la VPN, deben usar un segmento distinto al de la red local del cliente.

ifconfig-pool-persist ipp.txt
# ifconfig-pool-persist guarda en el fichero ipp.txt las IP asignada a cada cliente en la VPN, esta guía solo usamos un cliente, por lo que se verá reflejado el mismo cliente con varias IP.
client-to-client
# client-to-client = es para permitir que los usuario de la vpn se vean entre si, sino se pone este parámetro, los clientes no se verán
client-cert-not-required
username-as-common-name
# client-cert-not-required: No se requiere el certificado del cliente, el cliente se autentica con nombre de usuario / contraseña única.
# username-as-common-name : Utiliza el nombre de usuario autenticado como el nombre común, en lugar del nombre común del certificado de cliente.
plugin /etc/openvpn/openvpn-auth-pam.so "/etc/pam.d/vuser"
# Utilizamos el plugin openvpn-auth-pam.so para validar los usuarios en el servidor.
reneg-sec 3600
# Renegociar clave del canal de datos después de n segundos (por defecto = 3600).

duplicate-cn
# duplicate-cn = permite que se use el mismo certificado y llave en varios clientes al mismo tiempo. Si no se usa este parámetro, cada cliente que se conecte, desconectará al que está usando el mismo certificado. Recordar que en esta guía estamos usando un solo cliente.

push "route 172.16.1.1 255.255.255.255"
# push route = permite saber al cliente cual es su Gateway, ya que anteriormente habilitamos la opción de ver los otros clientes, por lo que podremos ver otras direcciones IP

push "dhcp-option DNS 172.16.1.1"
# push "dhcp-option DNS = le asigna un server DNS al cliente conectado

keepalive 10 120
# La directiva keepalive causa que se envíen mensajes tipo-ping tanto de ida como regreso para que cada punto de la VPN sepa cuando el otro punto este caido.
# Hacer Ping cada 10 segundos, y si el host remoto no responde durante 120 segundos (2 minutos) el equipo remoto se considerará caido.

comp-lzo
# comp-lzo = compresión, comprime todo el trafico de la vpn

max-clients 30
# max-clients 30 = cantidad máxima de usuarios conectados simultáneamente al servidor, se puede aumentar o disminuir.

user nobody
group nogroup
# Separación de privilegios para el servidor OpenVPN, después de que el servicio haya sido iniciado.
# De root:root a nobody:nobody

persist-key
persist-tun
# Trata de preservar el estado de las sesiones y la interfaz tun
# Aun después de que el cliente se reinicie por (ping restart)

status openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
# Registro de eventos para el estado de conexiones
# En el log de estado se registra información:
# - Conexiones activas, truncadas
# - Información del cliente: IP pública origen, certificado, IP virtual
# - bytes enviados y bytes recibidos por el cliente
# Este archivo de estado es actualizado cada minuto.
# A donde enviar los logs del servidor OpenVPN

verb 5
# verb 5 = aumenta o disminuye los detalles de logs en el server, ojo el verb 9 da muchosss detalles

management 127.0.0.1 1195
# Abrir interfaz de administración en la dirección 127.0.0.1
# en el puerto 1195 (TCP)

La configuración del server.conf quedaría así:
port 443
proto tcp
dev tun
ca ca.crt
cert servidor.crt
key servidor.key
dh dh1024.pem
server 172.16.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
client-cert-not-required
username-as-common-name
plugin /etc/openvpn/openvpn-auth-pam.so "/etc/pam.d/vuser"
reneg-sec 0
duplicate-cn
push "route 172.16.1.1 255.255.255.255"
push "dhcp-option DNS 172.16.1.1"
keepalive 10 120
comp-lzo
max-clients 30
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 5
management 127.0.0.1 1195


Descargamos el cliente de OpenVPN para Windows:
http://openvpn.se/
Hay que tener en cuenta de instalarlo y ejecutarlo como administrador de la PC.
Creamos en Windows con el notepad el fichero de configuración por cliente, en este caso Cliente1.
tls-client
# Habilitar TLS y asumir el rol de cliente durante la interconexión

client
# Especificando que es una configuracion para cliente

dev tun
# Configuración de interfaz TUN para VPN tipo Enrutada

proto tcp
# Conectarse por TCP al servidor OpenVPN remoto

remote 200.x.x.34 443
# Hostname o dirección IP del servidor OpenVPN, también se especifica el puerto en el que el servidor OpenVPN escucha peticiones.

redirect-gateway def1
# Ejecuta comandos automáticamente de enrutamiento para redireccionar todo el tráfico IP de salida a través de VPN

float
#Permitir conexión remota para cambiar su dirección IP y / o número de puerto, por ejemplo, debido a DHCP

resolv-retry infinite
# Trata de resolver el hostname del servidor infinitamente, Muy útil, cuando el cliente o servidor OpenVPN tienen dirección IP dinámica.

nobind
# No hacer bind a un número de puerto local en específico

persist-key
persist-tun
# Trata de preservar el estado de las sesiones y la interfaz tun
# Aun después de que el cliente se reinicie por (ping restart)

ca ca.crt
cert cliente1.crt
key cliente1.key
#ca, cert, key = son la entidad, el certificados, la llave y la Diffie Hellman del cliente1 que se crearon anteriormente para el cliente en la configuración del servidor.

auth-user-pass
# Autenticar con un servidor con nombre de usuario / contraseña.

pull
# Esta opción se debe utilizar en un cliente que se conecta a un servidor multi-cliente

reneg-sec 3600
#Renegociar clave del canal de datos después de n segundos (por defecto = 3600)

auth-nocache
# No almacenar en caché - askpass o - auth-user-pass nombre de usuario / contraseñas en la memoria virtual.

verb 5
# verb 5 = aumenta o disminuye los detalles de logs en el server, ojo el verb 9 da muchosss detalles

route-method exe
¿Qué método m (exe) va a utilizar para agregar rutas en Windows?

route-delay 2
Retraso n segundos (por defecto = 0) después de establecer la conexión, antes de añadir rutas

comp-lzo
# comp-lzo = compresión, comprime todo el trafico de la vpn, también debe de estar en el servidor.
Este fichero lo guardamos como cliente1.openvpn y lo copiamos en el directorio C:\Program Files\OpenVPN\config\ al igual que los certificados y las key generadas en el servidor ca.crt, cliente1.crt, cliente1.key

La configuración del cliente1.openvpn quedaría así:
tls-client
client
dev tun
proto tcp
remote 200.x.x.34 443
redirect-gateway def1
ping 10
float
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert cliente1.crt
key cliente1.key
auth-user-pass
pull
reneg-sec 0
auth-nocache
verb 5
route-method exe
route-delay 2
comp-lzo

Instalamos en el servidor OpenVPN la librería de PAM para ficheros de password y así poder utilizarla en la configuración de la VPN
serv-vpn:~#aptitude install libpam-pwdfile

Creamos el fichero user y le agregamos el usuario y la contraseña.
serv-vpn:~#htpasswd -c -b /etc/openvpn/users cliente1 clave-del-cliente1
#NOTA: el comando htpasswd estará disponible si en el server está instalado el Apache, de lo contrario tendrá que generar los pasword por otro método.

Creamos el fichero vuser en /etc/pam.d/ y le agregamos las configuraciones de nuestra validación
serv-vpn:~#nano /etc/pam.d/vuser

auth required pam_pwdfile.so pwdfile /etc/openvpn/users
account required pam_permit.so

Hacer un enlace simbólico de la librería openvpn-auth-pam a la carpeta /etc/openvpn
serv-vpn:~#ln -s /usr/lib/openvpn/openvpn-auth-pam.so /etc/openvpn
Reiniciamos el servicio OpenVPN
serv-vpn:~# invoke-rc.d openvpn restart

Y probar...

Si queremos tener mas clientes y que ellos tengan sus configuraciones de rutas de acceso le recomiendo visitar este enlace RoadWarrior de OpenVPN